9.24 总结
1.迭代器:不是函数,只是一个称呼,Python中一切皆对象,可迭代对象:含有 x=10 #不是可迭代对象 s='abc' s.__iter__() lt=[1,2,3] lt.__iter__() tup=(1,) tup.__iter__() dic={'a':1} dic.__iter__() fa=open('test.txt','a+',encoding='utf8') fa.seek(0,0) fa.__iter__() 除了数字类型,所有数据类型都是可迭代对象 s='abc' s_iter=s.__iter__() print(s_iter.__next__()) #s[0] print(s_iter.__next__()) #s[1] print(s_iter.__next__()) #s[2] dic = {'a': 1,'b': 2,'c': 3} dic_iter=dic.__iter__() print(dic_iter.__next__()) # 迭代取值 --》 基于上一个值 print(dic_iter.__next__()) print(dic_iter.__next__()) #c 2.迭代器对象:含有 为什么要有迭代器对象,提供了不依赖索引取值的手段 迭代取值是基于上一个值取值。 for循环称为迭代器循环,in后必须是可迭代的对象,for循环是一个可控的while循环 dic={'a':1,'b':2,'c':3} dic_iter=dic.__iter__() while True: try: print(dic_iter.__next__()) except StopIteration: break #下面的等同于上面的代码 for i in dic: # for循环 --> 迭代循环 print(i) 迭代器特点: a.内置 b.内置有 c.文件本身就是迭代器对象 3.三元表达式比较x,y大小: x=10 y=20 print(x) if x>y else print(y) #20 4.列表推导式lt=[i**2 for i in range(10)] print(lt) #[0,1,4,9,16,25,36,49,64,81] 5.字典推导式dic={i:i**2 for i in range(10)} print(dic) #{0: 0,1: 1,2: 4,3: 9,4: 16,5: 25,6: 36,7: 49,8: 64,9: 81} zip()方法: keys=['name','age','gender'] values=['nick',19,'male'] res=zip(keys,values) print(f'res:{res}) info_dict={k:v for k,v in res} print(f'info_dict:{info_dict}') 运行结果: res:<zip object at 0x0000000005B11088> info_dict:{'name': 'nick','age': 19,'gender': 'male'} 通过解压缩函数生成一个字典: info_dict = {'name': 'nick','gender': 'male'} print(f'info_dict.keys():{info_dict.keys()}') print(f'info_dict.values():{info_dict.values()}') res=zip(info_dict.keys(),info_dict.values()) print(f'zip(keys,values),{res}') info_dict={k:v for k,v in res} print(f'info_dict:{info_dict}') 运行结果: zip(keys,<zip object at 0x0000000005B11088> info_dict:{'name': 'nick','gender': 'male'} lt1=[1,3] lt2=[4,3,4] s='nahsibsnnc' # zip() res = zip(lt1,lt2,s) # res是一个迭代器,__next__返回元组 print(res.__next__()) # type:tuple print(res.__next__()) # type:tuple print(res.__next__()) # type:tuple 运行结果: (1,'n') (2,'a') (3,'h') 6.生成器含有yield 关键字的函数就叫生成器 生成器的本质是迭代器,是一个自定义的迭代器 def ge(): yield 3 #一个yield 相当于一个next,有暂停函数的作用 print('llll') yield 4 g=ge() print(g.__next__()) print(g.__next__()) #用for循环代替 for i in g: print(i) 运行结果: 3 llll 4 return的特性: 终止函数,通过调用函数拿到值 def f1(): yield 1 yield 2 yield from range(3) for i in f1(): print(i) 运行结果: 1 2 0 1 2 生成器表达式:把列表的[]换成() 优点:省内存,一次只产生一个值在内存中 t=(i for i in range(10)) print(t) print(f'next(t):{next(t)}') 运行结果: <generator object <genexpr> at 0x0000000005AC8150> next(t):0 7.函数递归:函数内部直接调用函数本身,每次递归不会自己结束函数,以防死循环需要一个退出循环的条件,递归也要有规律 def age(x): if x==0: return 18 x-=1 return age(x)+2 res=age(6) print(res) #30 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |