Python 学习笔记-第12讲:面向对象-列表推导式和生成器
在 python 中,推导是利用函数或表达式按规则生成对象元素的过程。
推导式包括:
列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句。
l = [x * x for x in range(1, 10)]
等效于:
l = []
for i in range(1, 10):
lis.append(i*i)
语法格式:
[expr for value in collection ifcondition]
# 整除3的数字列表
numbers = [x for x in range(100) if x % 3 == 0]
将csv文件读取为字典列表
我们常常需要读取和处理csv文件的数据。处理csv数据的一个最有用的方法就是把它转换为一个字典列表。
Python
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
data.append(x)
1
2
3
4
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
data.append(x)
你可以使用列表生成式快速实现:
Python
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
1
2
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
DictReader类将会自动地使用csv文件的第一行作为字典的key属性名。
DictReader类返回一个将会遍历csv文件所有行的对象。这个文件对象通过open()函数产生。
我们提供了open()两个参数–第一个是csv文件名,第二个是模式。
在这例子,‘rU’有两个意思。想往常一样,‘r’表示以读模式打开文件。
‘U’表明我们将会接受通用换行符–‘n’,‘r’和‘rn’。
语法格式:
{ key_expr: value_expr for value in collection if condition }
示例: mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:
{ expr for value in collection if condition }
示例:
# 用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception']
{len(s) for s in strings} #有长度相同的会只留一个,这在实际上也非常有用
生成器表达式是一个对象。它执行的计算与列表推导相同,但会迭代生成结果。
语法:
(expression for item1 in iterable1 if condition1
for item2 in iterable2 if condition2
...
for itemN in iterableN if conditionN)
和列表推导不同,生成器表达式实际上不创建列表或立即对括号内迭代表达式求值。而是创建一个生成器对象,通过迭代该对象以按需生成值。
generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
生成器的特点
1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行
上一篇: 浅谈springBoot注解大全
下一篇: 好怀念以前的时光