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中的内容 ...