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))

python的迭代器,生成器和装饰器你了解吗

直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误

python的迭代器,生成器和装饰器你了解吗

迭代器对象可以使用常规for语句进行遍历:

list2=[1,2,3,4,5]
s2 = iter(list2)    # 创建迭代器对象
for h in s2:
   print (h, end="-")

python的迭代器,生成器和装饰器你了解吗

生成器

带有 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)

python的迭代器,生成器和装饰器你了解吗

自己产生一个支持小数的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)

python的迭代器,生成器和装饰器你了解吗

下图最直观得可以看出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))

python的迭代器,生成器和装饰器你了解吗

在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数 或 装饰器。
装饰器的使用方法很固定:
先定义一个装饰函数(帽子)(也可以用类、偏函数实现)
再定义你的业务函数、或者类(人)
最后把这顶帽子带在这个人头上
装饰器的简单的用法有很多,这里举两个常见的。
日志打印器
时间计时器

# 这是装饰函数
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)

python的迭代器,生成器和装饰器你了解吗

# 这是装饰函数
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)

python的迭代器,生成器和装饰器你了解吗

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.")

python的迭代器,生成器和装饰器你了解吗

来源:https://blog.csdn.net/weixin_44740756/article/details/122844911

标签:python,迭代器,生成器,装饰器
0
投稿

猜你喜欢

  • Python爬虫之Selenium多窗口切换的实现

    2021-09-25 17:48:48
  • 一文带你学会MySQL的select语句

    2024-01-16 01:07:30
  • 了解WEB页面工具语言XML(三)支持工具

    2008-09-05 17:18:00
  • Python 进程操作之进程间通过队列共享数据,队列Queue简单示例

    2023-06-01 12:17:58
  • Python制作当年第一款手机游戏-贪吃蛇游戏(练习)

    2022-06-20 02:37:35
  • PHP如何实现HTTP验证

    2023-09-04 05:32:46
  • 查看Python安装路径以及安装包路径小技巧

    2022-02-24 10:09:51
  • sqlserver 触发器学习(实现自动编号)

    2012-10-07 10:58:03
  • Django权限机制实现代码详解

    2022-09-18 01:21:51
  • Python 时间戳之获取整点凌晨时间戳的操作方法

    2023-10-10 19:42:33
  • python重要函数eval多种用法解析

    2023-02-08 20:16:46
  • 修改月光博客网站中PHP常用正则表达式中出现的错误

    2024-05-03 15:35:35
  • Python使用JSON库解析JSON数据的方法

    2021-09-24 13:35:10
  • 通过5个例子让你学会Pandas中的字符串过滤

    2022-10-09 03:44:36
  • 一篇文章带你深入了解Mysql触发器

    2024-01-14 15:42:35
  • dl,dt,dd标签 VS 传统table实现数据列表

    2009-08-02 20:45:00
  • Flash对象在(x)HTML中的格式和参数及安全性

    2010-04-01 11:55:00
  • python中elasticsearch_dsl模块的使用方法

    2022-03-23 07:57:31
  • pytorch 膨胀算法实现大眼效果

    2022-10-25 18:19:51
  • Python文件处理

    2022-08-08 10:22:01
  • asp之家 网络编程 m.aspxhome.com