迭代器、生成器、生成式与面向过程编程

目录:
一、迭代器
二、 自定义迭代器
三、面向过程编程
四、生成式

一、迭代器

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值