标签:i+1 import cti 迭代 bsp 调用 python 信息 动态
列表生成式:
lis1 = list(range(10))
lis2 = [i+1 for i in lis1]
print(lis2)
lis3 = [i if i<5 else i*i for i in lis1]
print(lis3)
生成器:
lis2 = (i+1 for i in range(15)) # 生成器的语法
print(lis2)
print(next(lis2)) # 每次取一个值,取完还取就会报错
lis3 = (i if i<5 else i*i for i in range(10))
for i in lis3:
print(i)
def fib(max):
n,a,b = 0,0,1
while n < max:
yield b # 把函数的执行过程冻结在这一步,并且把b的值返回给外面的next()
a,b = b,a+b
n = n + 1
return ‘done‘
s = fib(10)
print(s)
print(‘s:‘,s.__next__())
for i in s:
print(i)
def range2(n):
count = 0
while count < n:
print(‘count‘,count)
count += 1
yield count
new_range = range2(10)
next(new_range)
next(new_range)
生成器创建方式:
1.列表生成式
2.函数生成
yield vs return:
return:返回并终止函数,若为生成器则终止生成器并且报错
yield:返回数据,并冻结当前的执行过程。。。
函数有了yield后:
1.函数加()就得到了一个生成器,
2.return 在生成器里,代表生成器的终止,直接报错
def range2(n):
count = 0
while count < n:
# print(‘count‘,count)
count += 1
yield count
print(‘----‘)
return 222
new_range = range2(3)
n1 = next(new_range)
print(n1)
n2 = next(new_range)
print(n2)
n3 = next(new_range)
print(n3)
n4 = next(new_range)
print(n4)
3.动态结束生成器
def range2(n):
count = 0
while count < n:
print(‘count‘,count)
count += 1
sign = yield count
print(‘----‘, sign)
if sign == ‘stop‘:
break
return 222
new_range = range2(3)
n1 = next(new_range)
print(n1)
new_range.send("stop") # 唤醒的同时发送信息给生成器,起始值必须为None
迭代器:
可用于for循环的数据类型:
一类:list,tuple,dict,set,str等
二类:generator,包括生成器和带yield的generator function;
这些可以直接作用于for循环的对象统称为可迭代对象:iterable;
可以使用 isinstance() 判断是否为iterable对象:
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance({},Iterable))
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出Stoplteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:iterator
可以使用 isinstance() 判断是否为iterator对象:
from collections import Iterable,Iterator
print(isinstance([],Iterator))
print(isinstance({},Iterable))
生成器都是iterator对象,但list,dict,str虽然是iterable,却不是iterator
把list、dict、str等iterable变成iterator可以使用iter()函数:
from collections import Iterator
print(isinstance(iter([]),Iterator))
print(isinstance(iter(‘asdf‘),Iterator))
因为python的iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前直到序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
小结:
凡是可作用于for循环的对象都是iterable类型
凡是可作用于next()函数的对象都是iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str、等是iterable但不是iterator,不过可以通过iter()函数获得一个iterator对象。
标签:i+1 import cti 迭代 bsp 调用 python 信息 动态
原文地址:https://www.cnblogs.com/jt925/p/10203300.html