day11 迭代器、生成器、三元表达式、生成式、面向过程编程
一、迭代器
1.什么是迭代器
迭代器指的是跌代取值的工具
跌代是一个重复的过程,但不是单纯的重复,每次重复都是基于上一次的结果而进行的
#这个累加的过程就是跌代
count = 1
while count < 5:
count += 1
#跌代去列表的值
l = [11, 22, 33, 44, 55, 66]
def get_item():
count = 0
while count < len(l):
print(l[count])
count += 1
get_item()
2、为何用迭代器
1.为了找到一种通用的跌代取值方案
2.为了节省内存
3、如何用迭代器
内置有_iter_方法的类型都称之为可迭代的对象
但凡调用了_iter_方法,就会将该类装换成迭代器对象
res=值.iter()
迭代器对象的特点:
1.内置有_next_方法
2.内置有_iter_方法------>for循环
跌代器的优缺点总结:
优点:
1.提供了一种不依赖于索引的一种通用迭代取值方案
2.惰性计算,节省内存
缺点:
1.取值麻烦
2.无法预测值的长度
3.一次性的
4、实例
#去列表的值
l = [11, 22, 33]
iter_l = l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
l = [11, 22, 33]
iter_l = l.__iter__()
while True:
try: #监测出现stopIteration
print(next(iter_l))
except StopIteration:
break
5、for循环原理
1.调用可迭代对象.iter(),拿到一个迭代器对象
2.调用next(迭代对象),将返回值赋值变量item
3.循环往复,直到抛出异常StopIteration,for循环会检测异常然后结束循环
f= open('a.txt',mode='rt',encoding='utf-8')
for line in f:
print(line)
print('---------------')
for line in f: #不会在打印line,因为值已被取完
print(line)
f.close()
二、生成器
1.生成器
生成器是一种自定义的迭代器
2.为何用生成器
为了节省内存
3.如何用生成器
函数体内但凡出现yield关键字,调用函数将不会触发函数体代码的运行,而是会返回一个生成器对象,生成器本质就是一个迭代器
yield和return:
相同点:在返回值角度用法一样
不同点:yield可以返回多个值,而return只能返一次
yield可以暂停函数,然后我们可以用next方法触发函数体代码的运行------>携程
4、实例
def func():
print("1111")
yield 1
print("2222")
yield 2
print("3333")
yield 3
g = func()
print(g)
res = next(g)
print(res)
res = next(g)
print(res)
res = next(g)
print(res)
def my_rang(start, stop, step):
while start < stop:
yield start
start += step
for i in my_rang(0, 50000, 3):
print(i)
三、三元表达式
实例
def max2(x,y):
if x> y:
return x
else:
return y
#上述函数可以简化为下面三元表达式
x=1
y=2
res=x if x> y else y
print(res)
四、生成式
1.列表生成式
l=[]
for i in range(10):
l.append(i)
print(l)
#上述函数可以直接写成下列格式
l=[i**2 for i in range(10)]
2、字典生成式
#例一
res={i:i for i in range(5)}
print(res)
#例二
l=[("name","jack"),("age","19")]
res={k:v for k,v in l}
print(res)
3、集合生成式
res={i for i in range(5) if i >1}
print(res)
4、生成器表达式
res=(i for i in range(5)) #小括号是生成器表达式的符号,不是元组的
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
#读文件a.txt中字符个数
with open("a.txt",mode='rt',encoding="utf-8") as f:
# res=0
# for line in f:
# res += len(line)
# print(res)
l=[len(line) for line in f]
res=sum(l)
print(res)
五、面向过程编程
面向过程编程思想
核心是过程二字,过程就是做事的步骤,即先干啥,后干啥,再干啥
所以基于该思想编写的程序就好比在设计一条条的流水线
优点:复杂的问题流程化,进而简单化
缺点:扩展性差