廖大博客学习笔记
最近见天一直在看廖大的Python教程,却发现很多基础看着很简单,但却不会应用,归根结底还是因为理解不到位,故而又将教程学了一遍,并将自己的理解记录一下,也方便后面查阅。由于没有相关编程基础,有些理解可能是错的,敬请批评指正。
想深入具体学习廖大博客请移步廖雪峰的官方网站
列表生成式
有时候用循环生成列表太过繁琐,就可用列表生成式代替。
L = [ x for x in range(1, 4)] #此时与应用循环区别不大
>>> L = [1, 2, 3]
L = [x*y for x in range(1, 4) for y in range(1, 4)] #一行代码即可实现双重循环
>>> L = [1, 2, 3, 2, 4, 6, 3, 6, 9]
L = [x*y for x in range(1, 4) for y in range(1, 4) if x*y % 2 != 0] # 也可加条件
>>> L = [1, 3, 3, 9]
生成器
通过列表生成式可以创建一个列表,但受内存限制,此种方法创建的列表长度有限,且一次性生成整个列表也是不划算的,因为列表内后面的数据短时间内可能用不到。那有没有方法可以实现动态生成数据呢,即需要使用时再生成数据,不使用之前不生成。
在Python中,这种边循环边计算的机制,称为生成器,即generator。
创建生成器的方法:
- 将列表生成式的[]改为()即可。例:g = (x*x for x in range(1, 10)),即是一个生成器。可通过next(g)函数逐个生成数据。每调用一次next(g)即可生成一个数据:1,4,9……。也可利用for循环生成数据:for n in g: print(n)
- 使用yield关键字,当函数中出现yield关键字后,该函数就不再是普通函数,而是一个生成器。普通函数按顺序执行,遇到return或最后一行就返回,下次调用再从头开始重复执行;生成器遇到yield关键字即返回数据,下次调用继续执行yield后面的程序。
例:def odd():
print ('step 1')
yield 1
print ('step 2')
yield 3
print ('step 3')
yield 5
调用该生成器时,先生成一个generator对象,然后用next()不断获得返回值
>>> g = odd()
>>> next(g)
step 1
1
>>>next(g)
step 2
3
迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器。
generator都是迭代器。可使用isinstance([], Itarator)来判断一个对象是否是迭代器。
list、dict、str等都不是迭代器,可用iter()将其转换为迭代器,iter(list)。
迭代器表示一个数据流,可被看作一个未知长度的有序序列,只有当需要返回下一个数值时才计算。