防伪码:忘情公子著

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与装饰器相关推荐

  1. python装饰品详解视频_Python中的各种装饰器详解

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  2. python文件下载速度 装饰器_python学习笔记之---装饰器

    # -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...

  3. python生成器使用场景桌面_Python – 如何更简洁地使用生成器?

    ( Python 3) 我正在使用Python生成器从队列中读取消息. 在消费者读取队列消息之后,它需要能够告诉生成器在成功处理后删除队列消息. 为了将.send()发送到Python生成器,似乎我必 ...

  4. python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  5. python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射

    1. 函数的作用域 1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置 x=1 #全局作用 def f1(): #整个f1函数是定义阶段 deff2():print(x)ret ...

  6. python私有属性和property装饰器_python – 在使用@property装饰器时在属性的s...

    尝试覆盖子类中的属性时,我对此行为有点困惑. 第一个示例设置两个类,Parent和Child. Parent继承自object,而Child继承自Parent.属性a使用属性装饰器定义.调用child ...

  7. python类修饰器_Python 中使用类修饰器修饰类方法如何处理 self?

    这个是装饰器类. class PostCache: def __init__(self, func): self.func = func self.redis = redis.StrictRedis( ...

  8. python开发视频播放器_Python使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  9. python小说下载器_python 制作网站小说下载器

    基本开发环境 · Python 3.6 · Pycharm 相关模块使用 目标网页分析 输入想看的小说内容,点击搜索 这里会返回很多结果,我只选择第一个 网页数据是静态数据,但是要搜索,是post请求 ...

最新文章

  1. 全网把Map中的hash()分析的最透彻的文章,别无二家。
  2. 【深度学习】图像自动处理工具SimpleITK的使用(Python)
  3. RHEL在戴尔系统上p1p1 ......命名规则
  4. c: realloc()函数解析
  5. java日志统计_Java实现蓝桥杯日志统计
  6. J2ME_System.getProperty
  7. 文件查找-locate find 学习笔记
  8. Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)
  9. Taro+react开发(21)--注意参数格式
  10. c# 数组中的空值_C# 数据操作系列 - 1. SQL基础操作
  11. 香蕉派开源硬件 Banana PI
  12. iOS学习笔记(十五)——数据库操作(SQLite)
  13. 3月国内网民地域分布TOP12:广东雄踞榜首 涨幅1.59%
  14. python怎么加锁_Python开发【笔记】:加锁的最佳方案
  15. DO447诠释红帽Ansible Tower架构
  16. html下拉菜单栏代码
  17. 笔记本取消fn +功能键
  18. 判断一个字符串能否通过添加一个字符变成回文串
  19. 地产行业信息化建设分析
  20. 查看SEM竞价外地排名的方法

热门文章

  1. SpringBoot(Thymeleaf)拼接跳转链接
  2. 减少if else的使用
  3. 编译原理实验一预习报告
  4. 关于Spring 声明式事务处理时,throws exception不回滚的问题
  5. 数据结构与算法---笔记
  6. centOS安装python
  7. JVM_04 对象的实例化+内存布局+访问定位+直接内存
  8. STM32开发 -- 设置MCU运行频率
  9. oracle多线程类连接数,数据库连接数,服务器进程,线程之间什么关系?
  10. 蚌埠粮食经济技师学院计算机,安徽粮食经济技师学院2020年有哪些专业