一、迭代器

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.迭代器、生成器和装饰器的更多相关文章

  1. Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器

    本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...

  2. Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式

    目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...

  3. Python四大神兽(迭代器&生成器&闭包&装饰器)

    一.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...

  4. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  5. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  6. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  7. python之路6-迭代器、生成器、装饰器

    1.迭代器&生成器 列表生成式 现在有个需求,列表[1,2,3,4,5,6,7,,8,9],要求把列表里的每个值加1,如何实现? 方法一: list = [1,2,3,4,5,6,7,8,9] ...

  8. Python3基础教程(十六)—— 迭代器、生成器、装饰器

    在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...

  9. python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)

    生成列表的方式 data = [1,2,3]  需求   每个数字加上1 # data = ( x*2 for x in range(5)) print(data)   列表生成式 后面的I赋予加1操 ...

  10. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

随机推荐

  1. 可视化神器--Plotly

    数据分析离不开数据可视化.我们最常用的就是pandas,matplotlib,pyecharts当然还有Tableau,看到一篇文章介绍plotly制图后我也跃跃欲试,查看了相关资料开始学习plotl ...

  2. jquery中live is not a function的问题

    jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(...).live is not a function错误. 解决方法: 之前的 ...

  3. DateTimeOffset DateTime

    DateTime只保存两部分信息:Ticks和KindTicks 一个Tick是100纳秒(1万Tick等于1毫秒)Ticks记录了从1/1/0001 12:00 AM到现在经过了多少100纳秒.Ki ...

  4. Linux 实时查看tomcat 日志--less命令

    查看tomcat日志通常用 tail -n  或者 tail -f 或者grep 或者 vi cat等命令去查看异常信息,但是日志是在不停地刷屏,tail是动态的在变的,我们往往期望从日志最后一行往前 ...

  5. Ado.net之对数据库的增删改查

    一.了解Command对象 1.Command对象:封装了所有对外部数据源的操作,包括增删改查和执行存储过程,并在执行完成后返回合适的结果,同Connection一样,对于不同的数据源,Ado.net ...

  6. zabbix监控内存占前3位的进程信息

    一.编写shell脚本 ps aux|sort -k4nr|head -3|awk 'split($11,a,"/"){print $4","a[length( ...

  7. JDBC缺点分析

    * JDBC代码繁琐,每一次JDBC都需要编写“同样”的六步. * sql不能配置,在JDBC编程中sql语句是写在java源程序当中的,sql语句经常会发生改变(业务发生了改变),sql改变之后,需 ...

  8. python安装scrapy等库需要c++ 14.0 下载链接放这里

    百度网盘下载地址:https://pan.baidu.com/s/1zZ7oKSuniABh1y7p0YahgA 或扫描二维码:

  9. trap实现跳板机

    第一节 跳板机实现原理(图例) 第2节 涉及到的知识点 命令:trap 拓展知识:进程与信号 trap 语法,作用,使用 [jeson@mage-jump-01 ~/]$  trap -l  1) S ...

  10. 二维树状数组poj1195

    题目链接:https://vjudge.net/problem/POJ-1195 题意:一开始输入0和一个s,0代表开始,s代表这是一个s*s的图,接下来会输入1或2,1代表进行单点修改,后面会接3个 ...