码迷,mamicode.com
首页 > 其他好文 > 详细

各种器

时间:2018-12-31 22:00:59      阅读:261      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!