立即学习:
https://edu.csdn.net/course/play/25504/304704?utm_source=blogtoedu
''' 列表生成式 python内置的非常简单却强大的可以用来创建list的生成式 快速的把字典内容转变成list ''' d={'x':'A','y':'B','z':'C'} print([k+'='+v for k,v in d.items()]) # 每个list列表中元素的呈现形式 #生成list [1,2,3...10] print(list(range(1,11))) #生成[1*1,2*2...10*10] print([x*x for x in range(1,11)]) #x*x是上面对应的运算表达式 #‘abc','123'输出a1,a2,a3,b1,..c1.. print([m+n for m in'abc' for n in '123']) #把小数点去掉 加判断 print([m+n for m in'a.b.c' for n in '123'if m!='.']) ''' 生成器 generator 一边循环一边计算的机制称为生成器 两种定义 1.列表生成式 2.带yield(关键字)的generator function ''' g=(x*x for x in range(10)) print(g) print(next(g))#输出next查看所生成List列表中的单个元素 print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))# x为0-9 依从生成结果0,1...81 继续输出next会报错 #使用for循环实现上例 for n in g: print(n) #使用for循环语句,n代表了next 是上述例子的快速实现 # 使用yield关键字生成斐波那契数列1,1,2,3,5,8 def fib(max): n,a,b=0,0,1 while n< max: print(b) a,b=b,a+b n=n+1 return'done' fib(6) #生成6个函数 #将输出关键词换成yield def fib(max): n,a,b=0,0,1 while n< max: yield b a,b=b,a+b n=n+1 return'done' g=fib(6) #此时fib不再代表函数,代表生成器 print(next(g)) print(next(g)) print(next(g))#调用三次 #使用for循环 for n in g: print(n) #使用while True 让next语句循环时不再报错 while True: try: x=next(g) print(x) except StopIteration as e: print('没有数据了',e.value) break ''' 迭代器 for循环可以应用下列类型 1.集合数据类型 list,tuple,dict,set,str等 2.generator,包括生成器和带yield的generator function等 这些可以直接可作用于for循环的统称为【可迭代对象 Iterable 】;可以使用isinstance()判断一个对象是否是可迭代(Iterable)对象; ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 而生成器(generator)不但可以作用于for循环,还可以被next()函数,不断调用并返回下一个值,直到抛出StopIteration错误。 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 可以被next()函数调用并不断返回下一个值的对象称为【迭代器Iterator】;可以使用isinstance()判断一个对象是否是可迭代(Iterable)对象; ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 生成器都是迭代器,但list、dict、str虽然是可迭代对象,却不是迭代器。 把list、dict、str等Iterable变成迭代器可以使用iter()方法; ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 为什么list、dict、str等数据类型不是迭代器? 这是因为Python的迭代器对象表示的是一个数据流,迭代器对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。 可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据, 所以迭代器的计算是惰性的,只有在需要返回下一个数据时它才会计算。 迭代器甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。 ''' #判断一个对象是不是可迭代对象Iterable(判断能不能使用for循环进行遍历) ''' from collections import Iterable print(isinstance([],Iterable)) #判断list是不是可迭代对象 结果为True (定义,绝对正确) print(isinstance({},Iterable))#判断dict(字典)是不是可迭代对象 结果为True (定义,绝对正确) print(isinstance('abc',Iterable))#判断字符串是不是可迭代对象 结果为True (定义,绝对正确) print(isinstance(123,Iterable))#判断(整型)int是不是可迭代对象 结果为false(定义中没有包含整型int,错误) ''' ''' #使用list...判断一个对象是否是(迭代器)Iterator 可迭代对象不是迭代器 from collections import Iterator print(isinstance([],Iterator)) #判断list是不是迭代器 结果为false print(isinstance({},Iterator))#判断dict(字典)是不是迭代器 结果为false print(isinstance('abc',Iterator))#判断字符串是不是迭代器 结果为false print(isinstance(123,Iterator))#判断(整型)int是不是迭代器 结果为false ''' #使用__iter__方法,使可迭代对象获得一个迭代器对象,从而转换成生成器 from collections.abc import Iterator print(isinstance(iter([]),Iterator)) print(isinstance(iter({}),Iterator)) print(isinstance(iter('abc'),Iterator)) ''' 小结 1.学习了列表生成式,生成list,更简单,代码量少 2.生成器的两种定义方式 调用next方法计算 /使用yeild关键字 3.生成器generator可for可next ;迭代器只可next 凡是可作用于for循环的对象都是可迭代类型; 凡是可作用于next()函数的对象都是迭代器类型,它们表示一个惰性计算的序列; 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个迭代器对象,从而转换成生成器。 '''
版权声明:本文为weixin_42316534原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。