Python开发——7.迭代器、生成器和装饰器
一、迭代器
1.迭代器协议
(1)迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration移除异常以中止迭代。
(2)可迭代对象:实现了迭代器协议的对象(实现方法:在对象内部定义一个__iter__()方法)
(3)协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具如:for循环,sum,min,max等使用迭代器协议访问对象
2.for循环
(1)for 循环的本质:使用迭代器协议循环所有对象
(2)字符串、列表、元组、字典、集合、文件对象都不是可迭代对象,在for循环时,调用了内部的__iter__()方法,把它们变成了可迭代对象
(3)for循环调用可迭代对象的__next__()方法,并捕捉StopIteration异常来中止迭代
l = [1,2,3]
iter_l = l.__iter__()
print(iter_l.__next__())
print(iter_l.__next__())
print(next(iter_l))#python内置的next
print(iter_l.__next__())
(4)for循环就是基于可迭代协议提供了一个统一的可以迭代所有对象的方法,即在遍历之前,先调用对象内部的__iter__()方法,将对象转化成迭代器,然后利用迭代器协议去循环访问。
# while模拟for循环
l = [1,2,3,4,5]
diedai_l=l.__iter__()
while True:
try:
print(diedai_l.__next__())
except StopIteration:
print("迭代结束")
break
二、生成器
1.三元表达式
name = "Kobe"
res = "Lakers" if name=="Kobe" else "Other Team"
print(res)
2.列表解析
l = [x*x for x in range(20) if x%2==0]
print(l) l=[]
for x in range(20):
if x%2==0:
l.append(x*x)
print(l)
复制代码
3.生成器
(1)生成器是一种自动实现可迭代协议的数据类型,不需要调用__iter__方法,所以生成器就是一种可迭代对象
(2)生成器在Python中有两种产生形式
a.生成器函数:与常规函数类似,但返回值不用return而是用yield。yield每次返回一个结果,返回后函数状态挂起,下次执行从挂起的状态继续执行
b.生成器表达式:与列表解析类似,把列表解析式的[]改为()就创建了一个生成器,生成器是按照需要每次产生一个结果,而不是直接构建完整的结果
(3)生成器的优点:a.可以延迟操作,即在需要的时候产生结果,可以节省内存;b.可以提高代码可读性
(4)人口普查
def population_get():
with open("人口普查.txt","r",encoding="utf-8") as f:
for i in f:
yield i g = population_get() all_pop = sum(int(eval(i)["population"]) for i in g ) print(all_pop)
for p in g:
print("%s %%"%int(eval(i)["population"])/all_pop)#因为生产器已经迭代了一遍,所以不会有输出结果
(5)生产者消费者模型
def produce_baozi():
ret = []
for i in range(100):
ret.append("包子%s"%i)
return ret
def consumer(res):
for index,baozi in enumerate(res):
print("第%s人吃掉了第%s个包子"%(index,baozi))
a = produce_baozi()
consumer(a)
三、装饰器
1.装饰器:
本质就是函数,为其他函数添加附加功能,装饰器功能的实现需要用到高阶函数+函数嵌套+闭包
2.原则:
(1)不改变被修饰函数的源代码
(2)不改变被修饰函数的调用方式
3.高阶函数
满足下面任意一条的函数即是高阶函数
(1)函数接收的参数是一个函数名
(2)函数的返回值是一个函数名
高阶函数在装饰器中的作用:
(1)函数的接收值是一个函数名
可以在不修改源代码的前提下,为函数添加新功能,但是会改变函数的调用方式
(2)函数的返回值是一个函数名
不会改变函数的调用方式,但是不能为函数添加新功能
import time
def foo():
time.sleep(3)
print("hello,贺丑子")
def timer(func):
start_time=time.time()
func()
end_time=time.time()
print("程序运行时间 %s" %(end_time-start_time))
return func
foo = timer(foo)
foo()
4.最后实现
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print("程序运行时间%s" %(stop_time-start_time))
return res
return wrapper @timmer
def test1(name,age):
time.sleep(3)
print("hello,world,,名字是%s,年龄是%s"%(name,age))
return "这是test1的返回值" res=test1("hehcouzi",17)
print(res)
四、一些小的补充:
#一一对应
a,b,c = (1,2,3)
print(a,b,c)
#只取头尾
l = [11,22,33,44,55,66,77]
a,*_,c = l
print(a,c)
#交换位置
f1 = 1
f2 = 2
f1,f2 = f2,f1
print(f1,f2)
Python开发——7.迭代器、生成器和装饰器的更多相关文章
- Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器
本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...
- Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式
目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...
- Python四大神兽(迭代器&生成器&闭包&装饰器)
一.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- Python 闭包、迭代器、生成器、装饰器
Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...
- python之路6-迭代器、生成器、装饰器
1.迭代器&生成器 列表生成式 现在有个需求,列表[1,2,3,4,5,6,7,,8,9],要求把列表里的每个值加1,如何实现? 方法一: list = [1,2,3,4,5,6,7,8,9] ...
- Python3基础教程(十六)—— 迭代器、生成器、装饰器
在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...
- python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)
生成列表的方式 data = [1,2,3] 需求 每个数字加上1 # data = ( x*2 for x in range(5)) print(data) 列表生成式 后面的I赋予加1操 ...
- Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...
随机推荐
- WPF 后台重写 DataTemplate
/// <summary> /// 配置类 /// </summary> public static class GridControlDeploy { /// <sum ...
- python3:实现字符串的全排列(无重复字符)
最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论.线性代数.高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力.唉!不说 ...
- bower install的时候报错
安装错误提示:C:\Scott>bower install bootstrap bower not-cached git://github.com/twbs/bootstrap.git#* bo ...
- python 在window 系统 连接并操作远程 oracle 数据库
1,python 连接 oracle 需要 oracle 自身的客户端 instantclient,可以去官网下载自己需要的版本, https://www.oracle.com/technetwor ...
- 0初识Linux
今天三八妇女节,Linux就该这么学,开课第一天.信心满满,激动,期待,要努力了.(博客为预习写的,今天又做了更新.) Linux第一印象就是黑色背景屏幕,上面还有好多代码,敲的一手好的命令操控着 ...
- JRebel 代理激活
1.生成GUID https://www.guidgen.com/ 例:04cfff79-8f45-481c-a858-a5b9590422e7 2.License Server 例: http: ...
- MySQL的or/in/union与索引优化
转载自:MySQL的or/in/union与索引优化 https://blog.csdn.net/zhangweiwei2020/article/details/80005590 假设订单业务表结构为 ...
- 38.Spring-spring和hibernate整合.md
目录 1.定义各种类对象 2.创建Hibernate配置文件 3.配置applicationContext.xml 4.注意事项 1.定义各种类对象 package per.liyue.sh.demo ...
- python--第十天总结(线程、进程和协程)
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- 测试Linux下tcp最大连接数限制
现在做服务器开发不加上高并发根本没脸出门,所以为了以后吹水被别人怼“天天提高并发,你自己实现的最高并发是多少”的时候能义正言辞的怼回去,趁着元旦在家没事决定自己写个demo搞一搞. 这个测试主要是想搞 ...