day13-迭代器、生成器、内置函数

#使命:让世界更有智慧
#愿景:更健康、更长久
#价值观:客户第一、团队合作、拥抱变化、本分、激情、敬业
#学以致用:编程的核心,是要解决人类的遇到各种问题,提升人类的差异化体验。
#公司选择:公司的产品服务,能不能直接让我们的生活更智能、更美好?

 

知识点:

一、迭代器

二、生成器

三、内置方法

 

一、迭代器

1.1 什么是迭代器?

  迭代:一般软件比如微信,从一个版本4.6更新到另一个版本4.7,这个过程一般我们叫迭代,就是基于上一个版本进行更新。

  迭代器:器就是工具,迭代器就是帮助我们给予上一次结果进行更新换代的工具。

1.2 为什么要用?

  一般我们对字符串或者列表之类的有索引的数据进行取值的时候可以直接使用索引取值,但是对于像字典和集合之类的没有索引的数据类型进行取值时,就很难着手,这个时候迭代器的价值就出现了,它提供了一种不依赖索引的方式进行取值。

1.3 怎么用?

1.3.1 将数据转化成可迭代对象

a)什么不是迭代的过程?
n = 0
while True:
  print(n)
# 循环得到的结果是独立的,没有直接的关系,违背了基于上一次结果进行更新


b)什么不是可迭代对象?
使用'.__item__'去查看
数字类型(int、float)都不是可迭代对象


c)哪些是可迭代对象?
字符串、列表、元组、字典、集合,文件
f = open('xxx.txt','w',encoding='utf-8')

只有内置有__iter__方法的都叫做可迭代对象
推荐读法:双下+方法名
x = [1, 2, 3, 4, 5, 6]


 

 

1.3.2 对迭代器对象进行迭代

a)迭代器对象和可迭代对象区别?

迭代器对象:

  可迭代对象只需要有__item__方法就行

  迭代器对象既内置__item__方法,又内置__next__方法

  所以迭代器对象一定是可迭代对象,但可迭代对象不一定是迭代器对象

b)如何进行迭代?

  使用__iter__方法就可以获得该对象的迭代器对象

  x_item = item(x) =x.__item__

  使用__next__进行取值

例如:

l = ['高圆圆', '杨幂', '章子怡', '李冰冰']
l1 = l.__iter__() # 生成一个迭代器对象
print(l1.__next__()) #取一个值
print(l1.__next__())
print(l1.__next__())
print(l1.__next__()) # 李冰冰
print(l1.__next__()) # 如果取到上面一个已经取完了,这里就会报错,StopIteration

c)异常处理

  通过使用‘try...except’来处理异常

l = ['高圆圆', '杨幂', '章子怡', '李冰冰']
l1 = l.__iter__()
while True:
    try:
        print(l1.__next__())
    except StopIteration:
        break

1.3.3 for循环与迭代器

for循环的本质其实就是迭代器:

  1、将in后面的数据类型首先通过__iter__转化成迭代器对象

  2、调用__next__来迭代取值

  3、使用try...except来捕获出现的异常shopiteration,使用break结束循环

 

 

1.3.4 迭代器小结:

可迭代对象:内置__item__方法

迭代器对象:既有__item__又有__next__方法的

使用try excpet来处理调用迭代器超出范围出现的报错

迭代器的

  特点:只能依次往后去、不能倒退

  优点:   1、可以不依赖于索引取值,

      2、在内存只保存迭代器对象而非完整的列表,所以占内存空间小,不会导致内存溢出

  缺点:   1、对比索引取值能直接取到想要的值,迭代器只能按顺序取值,不能获取指定元素

      2、如果取值过多超出容器数据的范围,就会报错stopiteration

 

二、生成器

2.1 什么是生成器?

  就是一种自己来定义的迭代器

2.2 为什么要用生成器?

  可以自己制作出类似于range等内置方法,方便未来使用,提高工作效率

2.3 怎么使用生成器?

2.3.1 跟定义函数很像,只是不用return的返回值,而是使用yield返回值,yield按照元组形式返回

def my_range(x, y, z=1):
    while x < y:
            yield x
            x += z

for i in my_range(1, 99, 5): print(i)
# yield支持外界为其传参
def dog(name):
    print('%s 准备开吃'%name)
    while True:
        food = yield
        print('%s 吃了 %s'%(name,food))
# def index():
#     pass

# 当函数内有yield关键字的时候,调用该函数不会执行函数体代码
# 而是将函数变成生成器
# g = dog('egon')
# g.__next__()  # 必须先将代码运行至yield 才能够为其传值
# g.send('狗不理包子')  # 给yield左边的变量传参  触发了__next__方法
# g.send('饺子')

"""
yield
    1.帮你提供了一种自定义生成器方式
    2.会帮你将函数的运行状态暂停住
    3.可以返回值

与return之间异同点
    相同点:都可以返回值,并且都可以返回多个
    不同点:
        yield可以返回多次值,而return只能返回一次函数立即结束
        yield还可以接受外部传入的值
"""
yield表达式形式(了解)

 

2.3.2 生成器表达式

列表的生成式

res = [i for i in range(1,100) if i !=7]

生成器表达式(🆚元组的形式)

res = (i for i in range(1,1000) if i != 7)

# 生成器不会主动执行任何一行代码
# 必须通过__next__触发代码的运行

# print(res.__next__())
# print(res.__next__())

2.3.3 面试题

def demo():
    for i in range(4):
        yield i
  
g=demo()
  
g1=(i for i in g)
g2=(i for i in g1)
  
print(list(g1))
print(list(g2))


#[0,1,2,3]
#[]
解析:
# 由题可得g、g1、g2都是生成器,生成器的特点是具有惰性运算,即在不调用的情况下是不进行任何操作的。
# 在print(list(g1))时,其实时将g1生成器强制转换数据类型,相当于是list在调用g1,因此g1开始进行取值操作。
# g1向g索取结果,最终将结果传递个g1,g1再传递给列表,返回[0,1,2,3]
# 我们知道生成器只能被调用一次,因此当g2被调用,此时的g1已经被调用过了,故传递给g2的值为空,返回[]
解析思路
def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))
#n = 1
#g=(add(n,i) for i in g)

#n = 10
#g=(add(n,i) for i in g)

##以上代码没有执行

#执行
#g=(add(10,i) for i in add(10,i) for i in g))  --->
#g=(add(10,i) for i in add(10,i) for i in text())) --->
#g =(add(10,i) for i in [10,11,12,13]) --->
#g = 20,21,22,23

思路
解题思路

 

 

三、内置函数

3.1 作用域相关

local:函数会以字典的类型返回当前位置的全部局部变量

globals:函数以字典的类型返回全部全局变量

3.2 字符串类型代码的执行eval、exec、complie

eval:执行字符串类型的编码,并返回最终结果

exec:执行字符串类型的代码

complie:将字符串类型的代码编译

3.3 输入输出相关

input:函数接受一个标准输入数据,返回为string类型。

print: 打印输出

3.4 文件操作

open:函数打开一个文件,创建一个file对象,然后调用它进行读写

3.5 模块相关

import:调用其它函数模块

3.6 帮助 help

3.7 调用相关

callable:检查一个对象是否可以调用,返回True,不一定能调用成功,返回False,绝对不会成功

3.8 查看内置属性

dir:返回变量、方法、定义的类型列表

3.9 迭代器生成器

range:创建一个整数对象,一般用在for循环中

next:内部使用__next__方法,返回迭代器的下一个项目

iter:将一个可迭代对象,生成迭代器

3.10 数字相关

bool:转化成布尔类型,没有参数,返回False

int:将字符串或数字转化成整型;flaot:转化成浮点型

bin:十进制转二进制;oct:转八进制;hex:转十六进制

abs:绝对值

divmod:除法,返回一个上和余数的元组

round:保留浮点数的消暑位数,保留整数

pow:求x**y次幂

sum:求和;min:返回可迭代对象最小值;max:最大值

3.11 数据结构

list:将一个可迭代对象转化成列表;tuple:专为成元组

相关内置函数

reversed:将序列反转,返回反转序列的迭代器

slice:构造一个切片对象

字符串:

str:数据类型转化成字符串

format:计算消暑

bytes:不同编码之间的转换

ord:输入字符找到字符编码的位置;chr:输入位置数字找出器对应的字符

ascii:是ascii码返回该值

3.12 数据集合

dict:创建一个字典;set:创建一个集合

len:返回对象中元素的个数

sorted:对所有可迭代对象进行排序

enumerate:枚举,返回一个枚举对象

all:可迭代对象中,全部是true返回true;any:任意一个是true返回true

zip:拉链,对应索引的元素按顺序打包成一个个元组,存入列表,长度与最短的相同

filter:过滤,

map:印射

shorted:绝对值排序

 

posted @ 2019-07-15 17:33  辕子  阅读(160)  评论(0编辑  收藏  举报