for、while循环

for循环

复制代码
# for 循环后面可以对Iterable或者Iterator进行遍历
# "abc"和[1,2,3]为可迭代对象,range(4)为迭代器
for i in "abc":   
    print(i)  # a b c
for i in [1,2,3]:  
    print(i)  # 1 2 3
for i in range(4):
    print(i)
复制代码

Iterable和Iterator区别

Iterable是知道长度的。例如list, tuple,str,dict 

Iterator是个地址,调用一个next()就走一步,是惰性的

判断Iterable和Iterator

迭代器一定是可迭代对象,反过来不一定成立

from collections import Iterable
from collections import Iterator
a = [1,2,3,4]
print(isinstance(a,Iterable))  # 判断a是不是可迭代对象,True
b = (i for i in range(10))
print(isinstance(b, Iterator)) # 判断b是不是迭代器,True

 扩展:迭代器和生成器的区别?(生成器是创建迭代器的一种方式)

创建迭代器的三种方式之一:重写__iter__和__next__方法

复制代码
class Container(object):
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def __iter__(self): # 重写__iter__方法
        return self
    def __next__(self): # 重写__next__方法
        if self.start < self.end:
            i = self.start
            self.start += 1
            return i
        else:
            raise StopIteration()

for i in Container(0,6): # 容器Container是一个迭代器
    print(i)
# 输出 0 1 2 3 4 5
复制代码

创建迭代器的三种方式之二:内置函数iter()将Iterable转换为Iterator

i = "abcde"
itor = iter(i)
print(type(itor))      # <class 'str_iterator'>
print(itor.__next__()) # a

创建迭代器的三种方式之三:生成器通过 yield语句快速生成迭代器,省略了复杂的 __iter__() & __next__() 

下面代码可以看出生成器可以用调用迭代器的方式去遍历

复制代码
def container(start, end):
    while start < end:
        yield start;
        start += 1;

for i in container(1,7):
    print(i)       # 1 2 3 4 5 6
复制代码

也可以用这种方式遍历生成器

c  = container(1,7)
while True:
    try:
        print(c.__next__());
    except StopIteration as e:
        break;

扩展:yield在Python3.5以后的新特性:

while循环无限次

复制代码
while true:

    ...

else:     #后面可以跟else   表示上面的循环结束就执行else中的内容

            ...
复制代码

猜你喜欢

转载自www.cnblogs.com/revo/p/9271850.html