列表生成式:
a=[x for x in range(10)]b=[x*2 for x in range(10)]def f(n): return n**3c=[f(x) for x in range(10)]print(a,'\n',b,'\n',c)
一种简单赋值法:
t=[12,'f',4] #元组、列表都可以a,b,c=tprint(a,b,c)
生成器的两种创建方式:
方式一:
s=(x for x in range(10)) #创建一个生成器print(s)print(next(s)) #调用range中内容的方法,等价于'print(s.__next__())'print(next(s)) #再生成一个元素for i in s: #生成器s是一个可迭代对象,可遍历 print(i)
方式二:
def foo(): print('ok') yield 1 print('ok2') yield 2 return Nonefoo() #程序不会被执行,因为foo()此时是一个生成器对象print(foo()) #打印的是生成器对象的地址g=foo()a=next(g) #通过'next(foo)'调用生成器对象,此时'next(foo())'会收到yield的返回值1b=next(g) #再一次执行的是yield 2对应的代码print(a,b)for i in foo(): #for循环其实是通过'next(foo())'进行的,'next(foo())收到yield的返回值并赋给i' print(i)
next方法说明:1.用next进入生成器,执行代码遇到yield时退出 2.再一次next进入时,从上次yield之后的一行开始执行,直到再遇到yield时退出 3.以此循环往复
用生成器打印Fibonaccci数列:
def fib(max): n,before,after=0,0,1 while n
生成器对象的send方法:
def bar(): print('ok1') count=yield 1 print(count) print('ok2') yield 2b=bar()#h=next(b) #调用send之前得先用next方法进入生成器bar()s=b.send(None) #或者send一个None,等价于next(b)k=b.send('dj')print(s,k)
send方法说明: 1.send方法类似于next:(1)也能进入生成器;(2)第二次进入也是接着上次的地方执行
2.区别在于:send进入时会带一个值给到count,但第一次进入时只能传一个空值由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发
伪并发的一个例子:
由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发
import timedef consumer(name): print('%s:老板,上包子!' %name) while True: x = yield print('小二:第%s笼包子来喽,客官请慢用'%x) print('%s:吃完了,再上'%name)def producer(name): c1=consumer('A') next(c1) print('%s:好嘞!'%name) print('%s开始做包子...'%name) for i in range(5): time.sleep(1) print('...过了一会,老板做出来一笼包子') c1.send(i+1)producer('老板')
判断:k是列表,是可迭代的(Iterable);d是迭代器
from collections import Iterator,Iterablek=[1,2,3,4]d=iter(k)print(d)print(isinstance(k,list))print(isinstance(k,Iterable))print(isinstance(d,Iterator))
迭代器读取文件内容的应用:
f=open('abc.txt','r')for i in f: #f是一个可迭代对象 print(i)
相比于下面的方法,利用迭代器可以节省内存空间
for i in f.readlines(): #f.readlines()读取文件内容,并存储为列表,占用内存 print(i)