一、迭代器
1、什么是迭代器
器=》工具
迭代:是一个重复的过程,但每次重复都是基于上一次的结果而来的
names=["egon",'lqz','yj']
count = 1
while count < len(names):
print(names[count])
count+=1
迭代器:就是一种不依赖于索引的取值工具
2、为何要有迭代器
特性:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
3、如何用迭代器
dic = {"name":"egon", 'age':18, 'gender':"male"}
while True:
try:
dic_iterator = dic.__iter__()
res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
res4 = dic_iterator.__next__()
except StopIteration:#此功能旨在当值取空时直接跳出,不至于报错
break
内置有__iter__方法的类型称之为:可迭代的对象/类型
1、字典dict
2、集合set
3、文件对象(也是迭代器对象)
4、字符串str
5、列表list
6、元组tuple
迭代器对象: 内置有__next__方法、内置有__iter__方法
dic = {"name":"egon", 'age':18, 'gender':"male"}
dic_iterator1 = dic.__iter__()
dic_iterator1.__next__()
dic_iterator2 = dic_iterator1.__iter__().__iter__().__iter__()
print(dic_iterator1.__iter__().__iter__().__iter__()is dic_iterator1)
print(dic_iterator1)
print(dic_iterator2)
for循环的工作原理
dic = {"name":"egon", 'age':18, 'gender':"male"}
dic_iterator = dic.__iter__()
while True:
try:
res = dic_iterator.__next__()
print(res)
res1 = dic_iterator.__next__()
print(res1)
except StopIteration:
break
用for改写:
dic = {"name":"egon", 'age':18, 'gender':"male"}
for kin dic:
print(k)
实现代码的逻辑步骤:
步骤1 dic_iterator = dic.__iter__()
步骤2 k=dic_iterator.__next__(),执行循环体代码
步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环
dic = {"name":"egon", 'age':18, 'gender':"male"}
for nin dic:
print(n)
dic_iterator = dic.__iter__()
for kin dic_iterator:
print(k)
二、自定义迭代器来实现惰性计算,从而达到节省内存的效果
1、什么是生成器
但凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值
就是我们自定义的迭代器,称之为生成器
def fuc():
print("hello1")
yield 111
print("hello2")
yield 222
print("hello3")
res = fuc()
print(res)#得出他的类型为generator生成器
arg =next(res)
print(arg)#迭代器循环取值的方法
bes =next(res)
print(bes)
2、yield VS return
(1)相同点:都可以用来返回值
(2)不同点:
return只能返回一次值,函数就立即结束了
yield能返回多次值,yield可以挂起函数
案例
def func():
i =0
while True:
i +=1
yield i #将i值全部存进去
g = func() #调用func()存的值
for k in g:
if k <9999:
print(k)
总结迭代器的优缺点
优点:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
缺点:
1、取值不如索引、key的取值方式灵活
2、取值是一次性的,只能往后取,不能预估值的个数
练习:模拟range工作的过程
def inp_range(start,end,step): #定义三个参数开始值,末尾值和步数
while start < end:
yield start
start += step
for xin inp_range(1, 5, 2):
print(x)
三、面向过程:
核心是“过程”二字,过程指的就是做事的步骤
也就是先干什、再干什么、后干什么。。。
基于该思想写程序就好比设计一条条的流水线
优点:
可以把复杂的问题流程化,进而简单化
缺点:
牵一发而动全身,扩展性差
四、生成式
1、列表生成式
l = [] #定义一个空的列表
names=['lqz_nb','yj_nb','jason_nb','egon']
for namein names:
if name.endswith('nb'):
l.append(name)
print(l)
方案二:
names=['lqz_nb','yj_nb','jason_nb','egon']
names = [namefor namein namesif name.endswith("nb")]
print(names)
2、集合生成式
l = {resfor resin range(1,5,1)}
print(l)
3、字典生成式
l = {f'k{i}': i**2 for iin range(5)}
print(l)
4、生成器表达式
nums=(i for i in range(200000))
res=sum(nums)
print(res)
五、内置函数
详情见https://www.cnblogs.com/linhaifeng/articles/7580830.html