python生成器和装饰器_python之yield与装饰器
防伪码:忘情公子著
python中的yield:
在之前发布的《python之列表解析与生成器》中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析的操作。
因为生成器本身就不是一个列表,它只是模拟了一个类似列表的行为,因此,施加在列表中的很多操作,对生成器而言是无效的。
由于生成器表达式并不会直接创建出序列形式的列表,因此不能对其进行索引、切片,不能执行任何常规的列表操作。比如:弹出元素(pop())、添加元素(append())等等。但是我们可以通过list函数将生成器转换成列表。In [1]: list((i**2 for i in range(1,11)))
Out[1]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
很多情况下我们需要生成更为复杂的结果,又不想基于某个列表来实现,但是简单的使用一个生成器表达式很难实现此种行为。此时我们可以通过一个自定义函数来完全实现类似的效果。In [2]: def genNum(x):
...: y = 0
...: while y <= x:
...: yield y
...: y += 1
...:
In [3]: g1 = genNum(10)
In [4]: type(g1)
Out[4]: generator
In [5]: g1.next()
Out[5]: 0
In [6]: g1.next()
Out[6]: 1
In [7]: g1.next()
Out[7]: 2
In [8]: g1.next()
Out[8]: 3
In [9]: g1.next()
Out[9]: 4
In [10]: g1.next()
Out[10]: 5
In [11]: g1.next()
Out[11]: 6
In [12]: g1.next()
Out[12]: 7
In [13]: g1.next()
Out[13]: 8
In [14]: g1.next()
Out[14]: 9
In [15]: g1.next()
Out[15]: 10
In [16]: g1.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in ()
----> 1 g1.next()
StopIteration:
yield本身并不是一个返回值,却能够生成一个生成器对象。
如上例所看到的,当我们在函数中使用yield,会返回一个生成器对象。
求1到20以内所有正整数的平方:In [17]: def genNum(n):
...: count = 1
...: while count <= n:
...: yield count ** 2
...: count += 1
...:
In [18]: g1 = genNum(20)
In [19]: for i in g1:
...: print i
...:
1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256
289
324
361
400
Python中的装饰器:
装饰器即函数装饰器,装饰器自身是一个函数,它的主要目的在于能够把其它函数的功能增强。
装饰器能够实现函数代码重用,或者说函数功能在不同环境中重用。
装饰器是一个非常著名的设计模式,经常用于比如插入日志、性能测试、事务处理等。
装饰器可以抽离出大量的函数中与函数无关的功能,把函数本身只作为一个核心,在必要时如果函数的核心功能不够,就用装饰器装饰一下本次调用所需要的功能,于是运行结束了,下次当需要其它功能时再用装饰器给重新装饰一下就可以了,这就是装饰器。
装饰器需要接受一个函数对象作为其参数,而后对此函数做包装,以对此函数进行增强。
不带参数的func(被装饰的函数):In [20]: def decorative(func):
...: def wrapper(): #定义一个包装器
...: print "Please say something: "
...: func() #调用func,这个func是我们自己定义的
...: print "No zuo no die..."
...: return wrapper
...:
In [21]: @decorative #使用@符号调用装饰器
...: def show(): #定义func,名字取什么都无所谓,它只是用来传给装饰器中的func参数
...: print "I‘m from Mars."
...: show()
...:
Please say something:
I‘m from Mars.
No zuo no die...
如上例所示,show函数本身只有一个print语句,而使用装饰器以后,就变成了三个print,这里的print可以改成任何其它的语句,这就是函数的装饰器。
带参数的func(被装饰的函数):In [22]: def decorative(func):
...: def wrapper(x):
...: print "Please say something...>"
...: func(x)
...: print "no zuo no die..."
...: return wrapper
...:
In [23]: @decorative
...: def show(x):
...: print x
...:
In [24]: show("hello,mars.")
Please say something...>
hello,mars.
no zuo no die...
python生成器和装饰器_python之yield与装饰器相关推荐
- python装饰品详解视频_Python中的各种装饰器详解
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- python文件下载速度 装饰器_python学习笔记之---装饰器
# -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...
- python生成器使用场景桌面_Python – 如何更简洁地使用生成器?
( Python 3) 我正在使用Python生成器从队列中读取消息. 在消费者读取队列消息之后,它需要能够告诉生成器在成功处理后删除队列消息. 为了将.send()发送到Python生成器,似乎我必 ...
- python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)
用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...
- python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射
1. 函数的作用域 1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置 x=1 #全局作用 def f1(): #整个f1函数是定义阶段 deff2():print(x)ret ...
- python私有属性和property装饰器_python – 在使用@property装饰器时在属性的s...
尝试覆盖子类中的属性时,我对此行为有点困惑. 第一个示例设置两个类,Parent和Child. Parent继承自object,而Child继承自Parent.属性a使用属性装饰器定义.调用child ...
- python类修饰器_Python 中使用类修饰器修饰类方法如何处理 self?
这个是装饰器类. class PostCache: def __init__(self, func): self.func = func self.redis = redis.StrictRedis( ...
- python开发视频播放器_Python使用PyQT制作视频播放器
最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...
- python小说下载器_python 制作网站小说下载器
基本开发环境 · Python 3.6 · Pycharm 相关模块使用 目标网页分析 输入想看的小说内容,点击搜索 这里会返回很多结果,我只选择第一个 网页数据是静态数据,但是要搜索,是post请求 ...
最新文章
- 全网把Map中的hash()分析的最透彻的文章,别无二家。
- 【深度学习】图像自动处理工具SimpleITK的使用(Python)
- RHEL在戴尔系统上p1p1 ......命名规则
- c: realloc()函数解析
- java日志统计_Java实现蓝桥杯日志统计
- J2ME_System.getProperty
- 文件查找-locate find 学习笔记
- Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)
- Taro+react开发(21)--注意参数格式
- c# 数组中的空值_C# 数据操作系列 - 1. SQL基础操作
- 香蕉派开源硬件 Banana PI
- iOS学习笔记(十五)——数据库操作(SQLite)
- 3月国内网民地域分布TOP12:广东雄踞榜首 涨幅1.59%
- python怎么加锁_Python开发【笔记】:加锁的最佳方案
- DO447诠释红帽Ansible Tower架构
- html下拉菜单栏代码
- 笔记本取消fn +功能键
- 判断一个字符串能否通过添加一个字符变成回文串
- 地产行业信息化建设分析
- 查看SEM竞价外地排名的方法