函数二

函数二

迭代器

  • 通用的迭代取值方案,惰性计算,能节省内存,不能反复,只能向下执行
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循环. ⽣成器具有惰性机制.
#集合推导式和字典推导式很是类似,记住一个小技巧能够快速区分那个是字典那个是集合
#字典推导式前面的结果是有个冒号,而集合的前面结果就是单纯的结果
原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/13361713.html