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

时间:2022-03-13 16:03:27

本节内容


1.迭代器协议与for循环

2.三元表达式

3.解压序列

4.列表解析

5.生成器

迭代器协议与for循环

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

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

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

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

那么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__())

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