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)
<ipython-input-16-9066a8f18086> in <module>()
----> 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...
时间: 2024-08-08 09:37:47

python之yield与装饰器的相关文章

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

python高级编程之装饰器02

#装饰器02 #参数检查 #主要是用在接收或者返回函数,在特定上下文执行时可能有用 #例如:有一个函数通过XML-RPC调用,python将不能和静态类语言中一样直接提供它的完整签名,当XML-RPC客户要求函数签名时,就需要这样的能力 """ xml-rpc相关学习:http://zh.wikipedia.org/wiki/XML-RPC """ #装饰器能提供这种签名类型,并确保输入输出与此有关,如下 from itertools impor

python高级编程之装饰器01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #装饰器01 #特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数) #语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下: class WhatFort(object): def it(cls): print 'work with %s:'%cls it=classmethod(it) def uncommo

python 3.x 的装饰器笔记

今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python 2.7在用法上差不多. 现在某个视频公司有一段代码,,代码的主要功能就是看电影. 1 def watchfilm(): 2 print('You are watching film now....') 3 4 watchfil() 运行之后输出: You are watching film now

Python 函数式编程、装饰器以及一些相关概念简介

Python 中的 Decorator(装饰器) 是对一个函数或者方法的封装,从而使其可以完成一些与自身功能无关的工作. 预备知识 一切皆对象 在 Python 中,所有的一切都被视为对象,任何的变量.函数.类等都是 object 的子类.因此除了变量之外,函数和类等也可以被指向和传递. >>> def foo(): ... pass ... >>> def Foo(): ... pass ... >>> v = foo >>> v

python 中多个装饰器的执行顺序

python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inner1') ret = f1(*args,**kwargs) return ret return inner1 def wrapper2(f2): print('in wrapper2') def inner2(*args,**kwargs): print('in inner2') ret = f2

Python函数编程——闭包和装饰器

Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包.也就是说,内部函数会在外部函数返回后被执行.而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量.参数以及其他内部函数.这些局部变量.参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响. def outer(