一、列表生成式
a = [1,2,3,4,5,6,7,8] #每个元素递加1 a = [i+1 for i in a ]#这就是列表生成公式 print(a) #优点代码简洁
二、生成器
a1 =(i for i in range(5))#编写生成器,a1 里面记录的是计算公式 print(a1)#打印公式 generator 就是生成器的意思 print(next(a1))#取值 print(next(a1))#每次只能取一个,不能回退不能切片 #输出 <generator object <genexpr> at 0x000001C58902FEB8> 0 1
使用生成器实现 斐波那契数列 (斐波那契数列 ,就是除了前两位,后面所有的数都是前两位的和 例如 1 1 2 3 5 8 )
def func(max): n,a,b = 0,0,1 #对应赋值 while n <max :#判断打印次数 print(b)#打印值 a,b = b,a+b#a等于b,b等于 旧a加 b n += 1 #计数器 return ‘done‘ func(15) #输出 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
生成器版本 斐波那契数列
def func(max): n,a,b = 0,0,1 #对应赋值 while n <max :#判断打印次数 yield b #把函数的执行过程冻结在这一步,并且把b的值返回给外面的next() print(b)#打印值 a,b = b,a+b#a等于b,b等于 旧a加 b n += 1 #计数器 return ‘done‘ #优点,可以在执行过程中返回值。 f =func(15) next(f) next(f) next(f) next(f) #输出 1 1 2
#在python2 里面 range = list xrange = 生成器
#在python3 里面 range =生成器 没有xrange
生成器的创建方式
1、列表生成式 () #最多只能用三元运算
2、函数
yield vs return
1、return 返回并终止函数
2、yield 返回数据,并冻结当前的执行过程。。。#如果函数里面出现了yield 该函数就变成了生成器。
3、next 唤醒当前进程执行过程,并向程序发送None 继续执行,到下一个yield冻结。
4、send 唤醒并继续执行程序,发送一个信息到生成器内部。
#学习链接 https://blog.csdn.net/hedan2013/article/details/56293173
学习链接 http://www.runoob.com/w3cnote/python-yield-used-analysis.html
三、迭代器
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for
循环本质上就是通过不断调用next()
函数实现的
for x in [1, 2, 3, 4, 5]: pass #实际上等价于 # 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True: try: # 获得下一个值: x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break
原文地址:https://www.cnblogs.com/mjiu/p/8654724.html
时间: 2024-10-23 16:43:31