目录:
一、迭代器
二、 自定义迭代器
三、面向过程编程
四、生成式
一、迭代器
1、什么是迭代器
器:工具
迭代:是一个重复的过程,但每次重复都是基于上一次的结果而来的
迭代器:就是一种不依赖于索引的取值工具
names = ["egon","lqz","yj"]
count = 1
while count > len(names):
print(names[count])
count +=1
2、为何要有迭代器
特性:
2.1 是一种通用的迭代取值方案
2.2 惰性计算,节省内存
引入
3、如何用迭代器
# dic = {"name":"egon","age":18,"gender":"male"}
# 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__()
# print(res4)
#报错 res4 = dic_iterator.__next__() # StopIteration
当我们不知道一共有多少个值的时候,就需要一条一一条的运行,直到报错才能知道值得个数。
改进,用while循环中加try捕捉异常
# dic = {"name":"egon","age":18,"gender":"male"}
# dic_iterator = dic.__iter__()
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
可迭代对象与迭代器
内置有__iter__方法的类型称之为:可迭代对象/类型
1、字典dic
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__()
# print(dic_iterator1.__iter__().__iter__().__iter__() is dic_iterator1)
#
# dic_interator2 = dic.__iter__()
for循环工作原理
# dic = {"name":"egon","age":18,"gender":"male"}
# dic_iterator = dic.__iter__()
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# dic = {"name":"egon","age":18,"gender":"male"}
# dic_iterator = dic.__iter__()
# for k in dic:
# print(k)
for循环相当于上面六行的代码
步骤1、dic_iterator = dic.iter()
步骤2、k = dic_iterator.next(),执行循环替代码
步骤3、循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环
基于同一迭代器的重复取值
# 示例1:
# dic = {"name":"egon","age":18,"gender":"male"}
# dic_iterator = dic.__iter__()
#
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# print("="*20)
#
# dic_iterator = dic.__iter__()
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# 示例2:
# dic = {"name":"egon","age":18,"gender":"male"}
# for k in dic: # dic.__iter__()
# print(k)
#
# for k in dic: # dic.__iter__()
# print(k)
二、自定义迭代器
自定义迭代器:来实现惰性计算,从而达到节省内存的效果
1、什么是生成器
#但凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的迭代器,称之为生产器
# def func():
# print("hello1")
# yield 111
# print("hello2")
# yield 444
# print("hello3")
# yield 'leon'
#
# g = func() #生成器本身就是迭代器
# print(g)
# res = next(g)
# print(res)
#
# res = next(g)
# print(res)
#
# res=next(g)
# print(res)
2、yield VS return
相同点:都可以用来返值
不同点:
return只能返回一次值,函数立即结束了
yield能返回多次值,yield可以挂起函数**
# 案例:
# def func():
# res = 0
# while True:
# res +=1
# yield res
# g = func()
#
# for i in g:
# print(i)
总结迭代器的优缺点
优点:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
缺点
1、取值不如索引,key的取值方式灵活
2、取值是一次性的,只能往后取,不能预估值的个数
自定义迭代器
# def my_range(start,stop,step=1):
# while start < stop:
# yield start
# start +=step
# for i in my_range(4,67,4):
# print(i)
三、面向过程编程
面向过程:
核心是"过程"二字,过程指的就是做事的步骤
也就是先做什么,再做什么,后做什么。。。。
基于该思想写程序就好比设计一条条的流水线
优点:可以把复杂的问题流程化,进而简单化
缺点:牵一发而动全身,扩展性差
应用场景:
脚本程序
架构
四、生成式
1、列表生成式 – 直接将产生的结果放到列表里面
# l =[i for i in range(5)]
#每一次for循环取到的值,都会赋值给左边的i,然后放在列表l里面,然后接着下一次循环
# print(l)
# l =[]
# for i in range(5):
# l.append(i)
# print(l)
for 循环后接if判断
# l = [i**2 for i in range(5) if i > 2] # 列表生成式,最多用到if
# print(l)
# l=[]
# for i in range(5):
# if i >2:
# l.append(i**2)
# print(l)
例子:将列表内以’sb’结尾的字符去除,并统计剩下字符的长度
# names=[‘lqz_sb’,’yi_sb’,’jason _sb’,’egon’]
# names =[len (name) for name in names if in endswith (‘sb’)
# print (names)
# names = ["lqz_sb",'yi_sb','jason_sb','egon']
# for name in names:
# if name.endswith('sb'):
# print(len(name))
2、集合生成式
# res = {i for i in range(5)}
# print(res)
3、 字典生成式
例子:将字典里面的元组改为key:value的形式
# res = {f"{i}":i**2 for i in range(5)}
# print(res)
结果:{'0': 0, '1': 1, '2': 4, '3': 9, '4': 16}
4、生成器表达式
# l = (i for i in range(5))
# # print(l,tuple(l))
# print(next(l)) # 0
# print(next(l)) # 1
# print(next(l)) # 2
# print(next(l)) # 3
# print(next(l)) # 4
# print(next(l)) # 报错StopIteration
sum求和
# nums = (i for i in range(200000))
# res = sum(nums)
# print(res)
# with open('/Users/yueying/PycharmProjects/untitled/day15/生成式.py',mode='rt',encoding='utf-8')as f:
#第一种求长度
# data = f.read()
# print(len(data))
#
#第二种求长度
# res = 0
# for line in f:
# res +=len(line)
#
#生成式求长度
# res = sum(len(line) for line in f)
# print(res)