python中的列表生成式与生成器

列表生成式

一、什么是列表生成式?
列表生成式(list comprehensions),是python中内置的强大用来创建列表的生成式。

二、具体的用法是什么?
生成一个序列

>>> list(range(11))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成一个元素平方的序列:使用for循环

>>> s=list(range(11))
>>> L=[]
>>> for i in s:
    L.append(i**2)
>>> print(L)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

更加简便的方法:使用列表生成式

>>> [x*x for x in range(11)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

添加if判断:

>>> [x*x for x in range(11) if x%2==0]# x取余等于0
[0, 4, 16, 36, 64, 100]

生成一个全排列:孟德尔遗传杂交定律

>>> [x+y for x in 'AB' for y in 'ab']
['Aa', 'Ab', 'Ba', 'Bb']

列表生成式也可以使用两个变量来生成list:

>>> d={'A':'a','B':'b','C':'c'}
>>> [k+'='+v for k,v in d.items()]
['A=a', 'B=b', 'C=c']
>>> 

生成器

列表生成器可以直接生成一个列表,小的列表好商量,但是一个百万级的列表,内存就有可能吃不消了,如果只需要其中的几个数值,就是浪费系统资源了,使用生成器保存的是列表的算法,根据每一次的循环进行计算的机制,即generator。

创建一个generator:

>>> g=(x*x for x in range(11))
>>> g
<generator object <genexpr> at 0x0311BFC0>

打印出generator的每一个元素:

>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25

太麻烦,可以这样:

>>> from collections import Iterable
>>> isinstance(g,Iterable)
True

生成器是可迭代的对象:

>>> for x in g:
    print(x)
36
49
64
81

生成器的两种形式:

上述是生成器的第一种形式,即列表生成式直接可以修改成生成器:[]---()

 

生成器的第二种形式,类似于函数的形式:

对于一个斐波拉契数列:

#斐波拉契数列

L=[]
def fib(x):
    n,a,b =0,0,1
    while n<x:
        a,b=b,a+b
        n=n+1
        L.append(b)
    print(L)

运行:

>>> fib(11)
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

更改成生成器:

def fib(x):
    n,a,b =0,0,1
    while n<x:
        a,b=b,a+b
        n=n+1
        yield b

运行:

>>> fib(11)
<generator object fib at 0x0319B7E0>
>>> for x in fib(11):
    print(x)
1
2
3
5
8
13
21
34
55
89
144
>>> 

第二种形式:要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

 

 

 

 

 

 

 

 



posted @ 2017-05-11 16:14  恩恩先生  阅读(739)  评论(0编辑  收藏  举报