Python学习(七) —— 装饰器、迭代器、生成器
一、装饰器(decorator)
1.装饰器的本质是闭包函数,作用:在不改变函数的调用方式的情况下,给函数的前后添加新的功能
#装饰器的固定结构
def warpper(func): #定义装饰器函数
def inner(*args,**kwargs): #定义内部函数
# 函数执行前的代码 #添加新功能
ret = func(*args,**kwargs) #执行被装饰的函数
# 函数执行后的代码 #添加新功能
return ret #返回被装饰的函数
return inner #返回内部函数名 @wrapper #==> func1 = warpper(func1) #执行装饰器函数并返回内部函数名给func1
def func1():
pass func1() #执行内部函数
2.开放封闭原则:1.对扩展是开放的
2.对修改是封闭的
装饰器完美的遵循了这个开放封闭原则
3.多个装饰器装饰同一个函数
def wrapper1(func):
def inner(*args,**kwargs):
print(1)
func(*args,**kwargs)
print(2)
return inner def wrapper2(func):
def inner(*args,**kwargs):
print(3)
func(*args,**kwargs)
print(4)
return inner @wrapper1
@wrapper2
def f1():
print(123)
二、迭代器(iterator)
可迭代的:iterable,必须含有__iter__()方法 #可迭代协议
迭代器:iterator,必须含有__iter__()、__next__()方法 #包含__next__方法的可迭代对象就是迭代器
迭代器是可迭代的一部分
获得迭代器:可迭代的调用__iter__()方法
使用迭代器:迭代器调用__next__()方法
迭代器的特点:惰性运算、从前到后一次去取值,过程不可逆、节省内存空间
a = 'abcde' #a是可迭代对象
b = a.__iter__() #获得迭代器
print(b.__next__()) #a
print(b.__next__()) #b
判断一个变量是不是迭代器或者可迭代的:
1.判断这个变量是否含有__iter__()、__next__()方法
print('__iter__' in dir(变量))
print('__next__' in dir(变量))
2.判断这个变量是否是迭代器或者可迭代的
from collections import Iterable
print(isinstance(变量,Iterable)
from collections import Iterator
print(isinstance(变量,Iterator))
print('__iter__' in dir(range(20))) #True #range(20)是可迭代的
print('__next__' in dir(range(20))) #False #range(20)不是迭代器
range_iter = range(20).__iter__() #获得迭代器
from collections import Iterable
print(isinstance(range_iter,Iterable)) #True
from collections import Iterator
print(isinstance(range_iter,Iterator)) #True
#用while循环模拟for循环
li = [1,2,3,4]
li_iter = li.__iter__() #生成迭代器
while True:
try:
print(li_iter.__next__()) #使用迭代器
except StopIteration: #遇到异常break
break
三、生成器(generator)
生成器的本质是迭代器,因此生成器的所有好处都和迭代器一样
生成器的实现有两种方法:1.生成器函数:常规定义函数,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,下次在这个地方执行
2.生成器表达式
def generator_func(): #定义一个函数
print('a')
yield 1
print('b')
yield 2 g = generator_func() #返回一个生成器,不执行函数的任何内容
print('abc') #abc
print(next(g)) #a\n1
print(next(g)) #a\n2
Python学习(七) —— 装饰器、迭代器、生成器的更多相关文章
- Python中的装饰器,迭代器,生成器
1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...
- python中的装饰器迭代器生成器
装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码 2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- python大法好——装饰器、生成器、迭代器
1.装饰器 1. 不能修改被装饰的函数的源代码 2. 不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1 函数即“变量” 2 高阶函数 a:把一个函数名当做实参传给另外一个函数(不修改 ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- Day4 装饰器——迭代器——生成器
一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...
- 精析python中的装饰器、生成器
装饰器: 在编程时,要遵循一个原则,就是开放-封闭原则. 在不破坏原函数的情况下,要想对原函数进行一些修饰,那么这里就要用到装饰器. 例如:你完成了一些用函数写成的项目,此时公司正在年度考核,你需要给 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
随机推荐
- c++ 值转换
1.double,float 四舍五入,保留小数位数. void MainWindow::on_pushButton_clicked() { double number=3.141592; ); qD ...
- 【原创】大数据基础之Flume(2)kudu sink
kudu中的flume sink代码路径: https://github.com/apache/kudu/tree/master/java/kudu-flume-sink kudu-flume-sin ...
- 清北学堂 清北-Day1-R2-监听monitor
题目描述 [背景] 不阅读本题的[背景]并不影响通过本题. 三体信息中没有包含对三体⼈⽣物形态的任何描述,⼈类要在四百多年以后才能真正看到三体⼈.在阅读信息时,叶⽂洁只能把三体⼈想象成⼈类的形象. 1 ...
- Confluence 6 使用 WebDAV 客户端来对页面进行操作
下面的部分告诉你如何在不同的系统中来设置原生的 WebDAV 客户端,这个客户端通常显示在你操作系统的文件浏览器中,例如,Windows 的 Windows Explorer 或者 Linux 的 K ...
- Confluence 6 恢复一个站点问题解决
如果你在导入的时候遇到了问题,检查下面的一些提示. 你的文件太大而不能上传?这个是非常常见的错误.出现的原因是备份文件不能在规定的时间内上传到服务器上.为了避免这个错误,放置你的导出文件到 < ...
- Confluence 6 理解你许可证的用户数
基于你的许可证类型,在你 Confluence 可以被注册的用户也许有限制. 在许可证明细页面中,将会告诉当前使用了多少的许可证(你注册的用户数量). 包括仅仅在 Confluence 中可以使用gl ...
- (六)STL仿函数functor
1.仿函数为算法服务,特点是重载操作符() 2.一共分为3大类,包括算术类,逻辑运算类,相对关系(比较大小):都继承了binary_function 3.仿函数的一些调用示例,其中右边的仿函数没有继承 ...
- vue.js的计算机属性学习
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- http超文本协议
当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了We ...
- SyntaxError: EOL while scanning string literal
在Python 中,这个提示,一般是因为特殊字符引起的,比如换行符,比如 \ 等. 下面有几个示例: 1. 换行符 # 源错误代码 get_tabs="select b.owner,b.ta ...