本章包含:迭代、列表生成式、生成器、迭代器
参考:廖雪峰python
for .. in ..
for i in dic
# 迭代字典
dic = {'a':12, 'b':13, 'c':14}
for i in dic:
print(i)
for i in dic.values()
dic = {'a':12, 'b':13, 'c':14}
for i in dic.values():
print(i)
for i in dic.items -> (keys,values)
dic = {'a':12, 'b':13, 'c':14}
for i in dic.items():
print(i)
print(i[0])
from collections.abc import Iterable
引入 Iterable
isinstance(object, Iterable)
返回True或者False
如list(range(1,11)
l = list(range(1,11))
print(l)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[x * x for x in range(1,11)]
l = [x*x for x in range(1,11)]
print(l)
[x * x for x in range(1,11) if x % 2 == 0]
l = [x*x for x in range(1,11) if x % 2==0]
print(l)
#[4, 16, 36, 64, 100]
[m + n for m in 'abc' for n in 'efg']
l = [m + n for m in 'abc' for n in 'efg']
print(l)
#['ae', 'af', 'ag', 'be', 'bf', 'bg', 'ce', 'cf', 'cg']
[k + ' = '+ v for k, v in dic.items()]
dic = {'a':'12', 'b':'13', 'c':'14'}
l = [k + ' = '+ v for k, v in dic.items()]
print(l)
#['a = 12', 'b = 13', 'c = 14']
l = [x for x in range(1,11) if x % 2 ==0]
p = [x if x % 2 ==0 else 0 for x in range(1,11) ]
一个if在for之后,此时if表示筛选条件,
一个if…else在for之前,此时for才是筛选条件。
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
迭代完之后会抛出 StopIteration
错误
可以直接使用for的几种数据类型:
可以用for迭代的对象统称: Iterable
用isinstance
判断是否是Iterable
可以被next调用并返回下一个值得对象统称: Iterator
用isinstance
判断是否是Iterator
只有生成器函数是Iterator其他都不是
用iter()
将Iterable 转换为 Iterator
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。