python的迭代器,生成器和装饰器你了解吗
作者:野猫炫 发布时间:2024-01-02 12:45:12
python 迭代器与生成器,装饰器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
list1=[1,2,3]
s=iter(list1) # 创建迭代器对象
print(next(s)) # 输出迭代器的下一个元素
print(next(s))
print(next(s))
直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误
迭代器对象可以使用常规for语句进行遍历:
list2=[1,2,3,4,5]
s2 = iter(list2) # 创建迭代器对象
for h in s2:
print (h, end="-")
生成器
带有 yield 的函数在 Python 中被称之为 generator(生成器)(自己制作迭代器可以看做是生成器)
#注意括号
#列表生成式
lis = [x+x for x in range(5)]
print(lis)
#生成器
gen= (x+x for x in range(5))
print(gen)
# gen = (x+x for x in range(5))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
generator_ex = (x+x for x in range(5))
for i in generator_ex:
print(i)
自己产生一个支持小数的range生成器(即带yield的迭代器)
你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),
def frange(star,stop,step):
x=star
while x<stop:
yield x
x+=step
for i in frange(10,20,0.5):
print(i)
下图最直观得可以看出yield的作用
把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作。
一个带有 yield 的函数就是一个 generator,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
def foo():
print("starting...")
while True:
print("yield前")
res = yield 4
print("yield后")
print("res:", res)
g = foo()
print(next(g))
print("*" * 20)
print(next(g))
在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数 或 装饰器。
装饰器的使用方法很固定:
先定义一个装饰函数(帽子)(也可以用类、偏函数实现)
再定义你的业务函数、或者类(人)
最后把这顶帽子带在这个人头上
装饰器的简单的用法有很多,这里举两个常见的。
日志打印器
时间计时器
# 这是装饰函数
def logger(func):
def wrapper(*args, **kw):
print('我准备开始计算:{} 函数了:'.format(func.__name__))
# 真正执行的是这行。
func(*args, **kw)
print('啊哈,我计算完啦。给自己加个鸡腿!!')
return wrapper
@logger
def add(x, y):
print('{} + {} = {}'.format(x, y, x+y))
add(200, 50)
# 这是装饰函数
def timer(func):
def wrapper(*args, **kw):
t1=time.time()
# 这是函数真正执行的地方
func(*args, **kw)
t2=time.time()
# 计算下时长
cost_time = t2-t1
print("花费时间:{}秒".format(cost_time))
return wrapper
import time
@timer
def want_sleep(sleep_time):
time.sleep(sleep_time)
want_sleep(10)
def american():
print("我来自中国。")
def chinese():
print("I am from America.")
def say_hello(contry):
def wrapper(func):
def deco(*args, **kwargs):
if contry == "china":
print("你好!")
elif contry == "america":
print('hello.')
else:
return
# 真正执行函数的地方
func(*args, **kwargs)
return deco
return wrapper
@say_hello("china")
def american():
print("我来自中国。")
@say_hello("america")
def chinese():
print("I am from America.")
来源:https://blog.csdn.net/weixin_44740756/article/details/122844911
猜你喜欢
- 编写Python SDK代码工程目录结构├──── easyhttp
- 1、Linux主机重定向 Godaddy的Liunx主机,Godaddy本身已经支持Apache,所以直接创建一个.htaccess文件就可
- 前言我们在学习MATLAB使用过程中可能需要用到Excel中的数据,那么matlab和Excel该如何交互呢?下面这篇文章带大家一起来看看1
- 1.背景项目需求,要求获得github的repo的api,以便可以提取repo的数据进行分析。研究了一天,终于解决了这个问题,虽然效率还是比
- Python函数的设计规范1、Python函数设计时具备耦合性和聚合性1)、耦合性:(1).尽可能通过参数接受输入,以及通过return产生
- variables_to_restore函数,是TensorFlow为滑动平均值提供。之前,也介绍过通过使用滑动平均值可以让神经网络模型更加
- 从这节开始,将会给大家介绍几个ASP中的三大通用类,它贯穿于我所设计的三层架构中,是对ASP语法的扩展,可以提高很多细节处理上的效率,可以算
- 阅读上一篇:什么是名字空间<meta http-equiv="Content-Type" co
- 1、字符串的定义所谓字符串,就是由0个或者多个字符组成的有限序列。在Python程序中,如果我们把单个或多个字符用单引号''
- 导言很多Web程序都支持用户帐号,根据不同的登录用户提供不同的选项,报表等功能。例如,就我们的教程中,我们要允许供应商公司的一些账户能登录网
- 做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而
- ASP中查询数据库记录写入XML文件示例,把下面代码保存为Asp_XML.asp运行即可: &
- 是因工作需要做的一个批量修改代码的小东西,拿出来与大家分享。 目前可以处理的文件类型:.asp .inc .htm .html
- 抽象工厂模式抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。抽象工厂定义了用于创建不同产品的接口, 但将
- OpenCVOpenCV 是计算机视觉领域最受欢迎的开源库,起初它由 C/C ++ 编写,现在用 Python 也能使用。OpenCV 可以
- 一、实现划词功能说是划词翻译,实际上我们是通过获取用户的剪切板内容,通过一系列的操作得到的。首先呢,我们就先实现如何获取剪切板内容的程序首先
- 生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙
- 外观模式(Facade Pattern)是什么外观模式是一种结构型模式,它提供了一个简单的接口,隐藏了系统的复杂性,为客户端提供了一个简单的
- 本文实例讲述了php控制文件下载速度的方法。分享给大家供大家参考。具体实现方法如下:<?php /* * set here a lim
- 工作中遇到一个很棘手的问题,交互设计师和视觉设计师在做出高保真原型后提交给前端开发工程师,最后得到的web产物从细节上和布局上都和高保真原型