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): ...
随机推荐
- 9-安装redis
1.在linux上安装C语言环境 yum install gcc-c++ 2.解压源码包 tar -xvf /opt/soft/redis-3.0.0.tar -C /opt/app/ 3.编译源码( ...
- 【Linux】【Jenkins】编译过程中遇到ERROR: Failed to parse POMs的解决方案
自动化构建的时候报错,网搜查询说是maven的jenkinks配置问题导致的.修改系统工具配置的maven配置就可以了 Started by user XX Building in workspace ...
- ViewModel学习
ViewModel是一个负责准备和管理Activity或Fragment数据的类.它还处理Activity / Fragment与应用程序其余部分的通信(例如,调用业务逻辑类). 始终与范围(Frag ...
- leetcode98
class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { if ...
- 深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)
1. rnn.BasicLSTMCell(num_hidden) # 构造单层的lstm网络结构 参数说明:num_hidden表示隐藏层的个数 2.tf.nn.dynamic_rnn(cell, ...
- 14-background
一.background-color:设置该元素的背景颜色 一共有三种:单词.rgb表示法.十六进制表示法 1.rgb:红色 绿色 蓝色 三原色 光学显示器,每个像素都是由三原色的发光原件组成的,靠明 ...
- OpenStack 安装:基本环境准备
刚刚学完openstack,这几篇文章就算对过去课程的一个总结吧. 首先说说基本的结构:在一台Dell的workstation上面安装了VMware,在VMware上面安装两台CentOS,现在给每台 ...
- 十二、Decorator 装饰器模式
设计: 代码清单: Display public abstract class Display { public abstract int getColumns(); public abstract ...
- 1. Go安装
和任何语言一样,开始使用之前都要先安装好他的开发/编译环境. Go是由谷歌开发的一个开源的编译型的静态语言,编译型语言最大的优点就是效率高运行速度快. Go语言支持Linux,Windows,Mac等 ...
- NTFS(Windows)、ext4(RHEL6)和xfs(RHEL7)文件系统的误删除恢复和备份
前言 对于误删除文件的设备,要马上停止任何写的操作,防止删除的文件被覆盖,导致数据丢失! 恢复NTFS文件系统下误删的文件 以Windows为例,市面上能恢复的工具不少,例如EasyRecovery. ...