解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列

本节内容


1.迭代器协议与for循环

2.三元表达式

3.解压序列

4.列表解析

5.生成器

 

迭代器协议与for循环

1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项,要么引起异常报错(因为迭代到头了,只能往后走不能倒退)

2.可迭代对象:实现了迭代器协议的对象(其实python中所有对象都不是可迭代对象,如何实现:对象内部定义一个__iter__方法

3.协议就是一种约定,可迭代对象实现了迭代器协议,python内部工具(如for循环,sum,max等)使用迭代器协议访问对象。

i = [11,22,33,44]
a = i.__iter__()       #将i变成可迭代对象
print(a.__next__())             #11
print(a.__next__())             #22    
print(a.__next__())             #33  
print(a.__next__())             #44

 

那么for 循环是怎么做的呢?


for循环做了两件事,第一件事就是把传入for循环对象使用__iter__方法,使其变成可迭代对象,之后每次使用都引用了__next__方法

第二件事就是:next到头,也就是迭代到头了会报错嘛,而for循环就自动为我们处理了报错

for a in i:
    print(a)

 

注意:while循环的工作机制并不是迭代循环,而是索引循环,所以不能循环字典、集合、文件等迭代对象,使用for循环,还能节省内存因为遍历一个扔一个

 

 

三元表达式

l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
print(l)

 


 

 

三元表达式其实就是简略式编程

name = 'ecohboy'

a = '帅哥'if name == 'ecohboy' else 'sb'
print(a)

if 左边为若真的操作,中间是判断语句,右边为否则操作 但只适用于简单逻辑。

 

列表解析


 

l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
print(l)

 

解压序列


l = [1,2,3,4,5,6,7]
a,*b,c = l
print(a,b,c)

解压序列就是一一对应取值,但用这种方法可以不通过索引也可以取到开头与结尾的值

 

生成器


 

生成器可以理解为一个数据类型,但他自动实现了迭代器协议(不用调用__iter__方法)所以生成器就是可迭代对象

1.生成器函数配合yeild(返回值)使用:

 

def test():
    yield 1
    yield 2
    yield 3
    yield 4

g = test()
print(g)
print(g.__next__()) #1
print(g.__next__()) #2
print(g.__next__()) #3
print(g.__next__()) #4

 

2.生成器表达式

laomuji = ('鸡蛋%s' %i for i in range(10))
print(laomuji.__next__())  #鸡蛋0
print(laomuji.__next__())  #鸡蛋1
print(laomuji.__next__())
print(laomuji.__next__())

生成器表达式实际就是把列表解析【】改成()

posted @ 2018-05-05 20:12  Python少年  阅读(543)  评论(0编辑  收藏  举报