您的位置:首页 > 编程语言 > Python开发

Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator

2017-04-03 11:25 776 查看

列表生成式

1、range()函数,可以生成一个整数序列

range(0,10)

>>>0,1,2,3,4,5,6,7,8,9


2、生成[1,2,3,4,5,6,7,8,9,10]可以用list(range(1, 11))。但是生成[1x1,2x2,3x3,…,10x10]怎么做?

一、循环

二、

[x * x  for x in range(1, 11)]


把要生成的元素x * x放到前面

后面跟for循环,就可以把list创建出来

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]


还可以使用两层循环,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']


生成器generator:

列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素。这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

1、只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>


用for循环打印出generator的每一个元素

g = (x * x for x in range(10))
for n in g:
print(n)


著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, …

斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)

a, b = b, a + b
#a, b = b, a + b相当于a=b,b=a+b

n = n + 1
return 'done'


2、把print(b)改为yield b就可以把函数fib()变成generator。

3、generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

4、一个带有 yield 的函数就是一个 generator,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。

迭代器Iterator:

1、可以被next()函数调用并不断返回下一个值的对象称为迭代器。

2、因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

3、凡是可作用于for循环的对象都是Iterable类型;

4、凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

5、集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息