函数二
函数二
迭代器
- 通用的迭代取值方案,惰性计算,能节省内存,不能反复,只能向下执行
dic = {'q':1,'w':2,'e':3}
dic_iterator = dic.__iter__()
res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
dic_iterator.__next__() # 报错 StopIteration 取完
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration
break
-
可迭代对象 内置有
_iter__
方法的类型称为可迭代对象/类型- 有
str
,list, tuple,dict
, set ,文件对象(同时也是迭代器对象)
a = 'abc' print(dir(a)) # dir查看对象的方法和函数 # 在打印结果中寻找__iter__ 如果存在就表示当前的这个类型是个可迭代对象
- 有
-
迭代器对象 内置有
__iter__
和__next__
方法 -
迭代器对象一定是可迭代对象,反之不一定
生成器
- 自定生成器:凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的迭代器,称之为生成器
def fun():
print('hello')
yield 1
print('你好')
yield 2
print('666')
yield 3
g = fun()
print(g) # <generator object func at 0x000001FC98A9F8C8>表示得到的时内存地址
res=next(g)
print(res) # hello 1
res=next(g)
print(res) # 你好 2
def func():
lst = ['1','2','3','4']
yield from lst # 可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
g = func()
for i in g:
print(i)
yield VS return
相同点:都可以用来返回值
不同点:
return 只能返回一次值,函数就立即结束了
yield 能返回多次值,yield可以挂起函数
- 推导式
info = [i for i in range(5) if i % 2 = 0 ] # [2,4]
info = {'qi':i for i in range(6)}
info = {i for i in range(6)}
- 生成器推导式
gen = (i for i in range(6) if i > 3) #
#推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式
#生成器表达式: (结果 for 变量量 in 可迭代对象 if 条件筛选)
#生成器表达式可以直接获取到⽣成器对象. ⽣成器对象可以直接进行for循环. ⽣成器具有惰性机制.
#集合推导式和字典推导式很是类似,记住一个小技巧能够快速区分那个是字典那个是集合
#字典推导式前面的结果是有个冒号,而集合的前面结果就是单纯的结果