Python 列表生成式与生成器

574 查看

列表生成式即List Comprehensions,是Python内置的非常强大的可以用来创建list的生成式。

列表生成式:

1、如要生成list[n,n+1,n+2,n+3,.....,m-1],可用range(n,m);


range(3,30)

2、在区间(n,m)中生成n,n+1,n+2,...,m-1的平方,可用[n*n for n in range(n,m)]


[n * n for n in range(5,15)]

如在上式的for后加上条件则可以筛选出符合条件的元素


[n * n for n in range(5,15) if n % 3 ==0]

3、也可以使用两层循环,可以生成全排列,如


[m+n for m in 'EFSD' for n in "KLD"]

4、运用列表生成式,可以写出非常简洁的代码。例如列出当前目录下的所有文件和目录名

导入模块 os,调用os中的listdir()函数。


列出当前目录下的所有文件和目录名

学过Python 的迭代特性,会了解for循环可以同时使用两个甚至多个变量,因此列表也可以使用两个变量来生成list.



使用两个变量来生成list

5、把list中所有的字符串变成小写


字符串变成小写

小结:运用列表生成式,可快速生成list,且代码十分简洁

当list中包含字符串与整数时,使用lower()函数会报错,可以使用内置函数判断一个元素是否是字符串


先判断后转换



生成器(generator):

通过列表生成式可快速创建一个列表,但是会受到内存限制,当创建一个列表包含超级多个元素时,不仅占用很大的存储空间,如果仅仅访问前面一部分的元素,则后面的绝大部分占用的空间就浪费了。而生成器的使用的是一边循环一边计算的机制,即解决使用列表生成式创建包含超级多的元素时造成的内存空间浪费的问题。

使用生成器创建列表时,与列表生成式很相似,即把中括号表位圆括号:即[]->()

生成器创建后,可使用G.next()输出元素,按序输出,但是生成器也是可迭代对象,可用for循环来迭代它。


生成器的创建于输出


生成器功能强大,如生成斐波拉契数列(Fibonacci)

Fibonacci:除第一与第二个数外,任意一个数都可由前两个数相加得到:


print ->yield的区别

要把fib函数变成generator,只需要把print y改为yield y就可以了,这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。

小结

generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。

要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。