python迭代
给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
可迭代对象:
- List:for a in List
- dict:(因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。)
1.默认迭代dict的key值:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print( key)
2.迭代dict的value:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d.values():
print( key)
3.key,value:
d = {'a': 1, 'b': 2, 'c': 3}
for tutle in d.items():
print(tutle)#生成的是tuple
for key,value in d.items():
print(key,value)
字符串迭代:
for ch in 'ABC':
任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环
列表生成器
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11)
[x * x for x in range(1, 11)]#生成x2的List
[m + n for m in 'ABC' for n in 'XYZ']
结果:['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
tip:使用内建的isinstance函数可以判断一个变量是不是字符串:isinstance(x, str)
- 生成器(generator)
在Python中,一边循环一边计算的机制,称为生成器(Generator)
创建一个生成器可以把一个列表生成器的[]改成():
d=[x for x in range(10)]
g=(x for x in range(10))
print(d)
print(g)
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x10cfd9518>
打印生成器的元素用next(g)和for循环迭代就好了。
generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
以函数的方式定义generator:
def getg():
for x in range(5):
yield x
g=getg()
print(next(g))
print(next(g))
结果:
0
1
分析:函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
- 迭代器(Iterator)
可迭代对象(Iterable):可以直接作用于for循环的对象统称为可迭代对象,包括list,dict,set,str等,还有生成器和带yield的generator function。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
我们用的生成器,带yield的generator function都是迭代器,但是list、dict、str虽然是Iterable,却不是Iterator,把list、dict、str等Iterable变成Iterator可以使用iter()函数
可以这样说:
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
python的for循环就是通过不断调用next()来运行的,它等价于:
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
(完)