python迭代,可迭代对象,生成器,迭代器--

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

(完)

猜你喜欢

转载自blog.csdn.net/snailpeople/article/details/78491773