python 之闭包,装饰器,生成器
一。可迭代的对象(也就是可以用for循环,generator 是生成器的意思)

怎么判断是否可迭代呢?通俗的方法建立一个for循环
高大上的方法是:
In [40]: from collections import Iterable
In [42]: isinstance("abc",Iterable) ####是不是Iterable创建的实例,如果是就是True,不是则False
Out[42]: True In [44]: isinstance(100,Iterable)
Out[44]: False



#########################闭包###########################

运行结果:

应用例子:


#################装饰器#########################
下图是装饰器原理图:

完整版:
[root@master gaoji]# cat 02-装饰器.py
#!/usr/local/bin/python3
# -*- coding:utf-8 -*- def w(func):
def inner():
print('----正在验证权限----')
func()
return inner @w ## @w等价于f1 = w(f1)
def f1():
print('----f1----')
@w ## @w等价于f1 = w(f1)
def f2():
print('---f2---') #f1 = w(f1)
f1()
#f2 = w(f2)
f2()
运行结果:
[root@master gaoji]# python 02-装饰器.py
----正在验证权限----
----f1----
----正在验证权限----
---f2---
##############两个装饰器###############
[root@master gaoji]# vim 03-装饰器.py
1 #!/usr/local/bin/python3
2 # -*- coding:utf-8 -*-
3
3
4 def makeItaic(func):
1 #!/usr/local/bin/python3
2 # -*- coding:utf-8 -*-
3
4 def makeItaic(func):
5 def inner():
6 print('--1--')
7 return "<b>" +func() + "</b>"
8 return inner
9 def makeBolt(func):
10 def inner():
11 print('--2--')
12 return "<i>" +func() + "</i>"
13 return inner
14
15 @makeItaic #test1 = makeItaic(test1)
16 @makeBolt #test1 = makeBolt(test1) 返回值“<i>hello-world-1</i>”
17 def test1():
18 print('--3--')
19 return 'hello-world-1'
20
21
22
23 print(test1())
结果:
[root@master gaoji]# python3 03-装饰器.py
--1--
--2--
--3--
<b><i>hello-world-1</i></b>
流程图:


很重要的一点:装饰器在装饰的函数调用前,就已经装饰好了
装饰是倒着装饰,调用确实从上往下的
##############例子代码##############
1.使用装饰器对无参数的函数进行装饰
def func(functionName):
print("---func---1---")
def func_in():
print("---func_in---1---")
functionName()
print("---func_in---2---") print("---func---2---")
return func_in @func
def test():
print("----test----") #test = func(test) test()
2.使用装饰器对有参数的函数进行装饰
def func(functionName):
print("---func---1---")
def func_in(a, b):#如果a,b 没有定义,那么会导致16行的调用失败
print("---func_in---1---")
functionName(a, b)#如果没有把a,b当做实参进行传递,那么会导致调用12行的函数失败
print("---func_in---2---") print("---func---2---")
return func_in @func
def test(a, b):
print("----test-a=%d,b=%d---"%(a,b)) test(11,22)
3.使用装饰器对有不定长参数的函数进行装饰
def func(functionName):
print("---func---1---")
def func_in(*args, **kwargs):#采用不定长参数的方式满足所有函数需要参数以及不需要参数的情况
print("---func_in---1---")
functionName(*args, **kwargs)#这个地方,需要写*以及**,如果不写的话,那么args是元祖,而kwargs是字典
print("---func_in---2---") print("---func---2---")
return func_in @func
def test(a, b, c):
print("----test-a=%d,b=%d,c=%d---"%(a,b,c)) @func
def test2(a, b, c, d):
print("----test-a=%d,b=%d,c=%d,d=%d---"%(a,b,c,d)) test(11,22,33) test2(44,55,66,77)
4.使用装饰器对有返回值的函数进行装饰
def func(functionName):
print("---func---1---")
def func_in():
print("---func_in---1---")
ret = functionName() #保存 返回来的haha
print("---func_in---2---")
return ret #把haha返回岛17行处的调用 print("---func---2---")
return func_in @func
def test():
print("----test----")
return "haha" ret = test()
print("test return value is %s"%ret)
5.通用装饰器
def func(functionName):
def func_in(*args, **kwargs):
print("-----记录日志-----")
ret = functionName(*args, **kwargs)
return ret return func_in @func
def test():
print("----test----")
return "haha" @func
def test2():
print("----test2---") @func
def test3(a):
print("-----test3--a=%d--"%a) ret = test()
print("test return value is %s"%ret) a = test2()
print("test2 return value is %s"%a) test3(11)
6.带有参数的装饰器
def func_arg(arg):
def func(functionName):
def func_in():
print("---记录日志-arg=%s--"%arg)
if arg=="heihei":
functionName()
functionName()
else:
functionName()
return func_in
return func #1. 先执行func_arg("heihei")函数,这个函数return 的结果是func这个函数的引用
#2. @func
#3. 使用@func对test进行装饰
@func_arg("heihei")
def test():
print("--test--") #带有参数的装饰器,能够起到在运行时,有不同的功能
@func_arg("haha")
def test2():
print("--test2--") test()
test2()
python 之闭包,装饰器,生成器的更多相关文章
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- Python之迭代器&装饰器&生成器&正则
1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数 ...
- python三大器(装饰器/生成器/迭代器)
1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...
- python之闭包+装饰器
闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
随机推荐
- SpringMvc aop before
1.config.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans ...
- wifi认证Portal开发系列(一):Radius与FreeRadius简介
RADIUS 维基百科上的介绍: Remote Authentication Dial-In User Service (RADIUS) is a networking protocol that p ...
- 本地filezilla&servervsftp搭配使用
环境:本地ubuntu系统&serverubuntu系统 本地安装filezilla apt-get install filezilla '安装filezilla filezilla '执行 ...
- 【PyCharm编辑器】之报:Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click.问题
如上图,输入一个单词时会出现波浪线,报:Spellchecker inspection helps locate typos and misspelling in your code, comment ...
- difference between VM, Docker and Vagrant区别
VM: VirtualBox, VMware Docker Vagrant using which you can create VMs or container. It interacts wit ...
- 模式匹配之surf----特征点检测学习_2(surf算法)
在上篇博客特征点检测学习_1(sift算法) 中简单介绍了经典的sift算法,sift算法比较稳定,检测到的特征点也比较多,其最大的确定是计算复杂度较高.后面有不少学者对其进行了改进,其中比较出名的就 ...
- <LeetCode OJ> 121. /122. Best Time to Buy and Sell Stock(I / II)
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- iOS-代理托付的使用
#import "Rigester_ViewController.h" #import "Rigester_ViewController.h" @interfa ...
- dubbo介绍及其使用案例
dubbo介绍及其使用案例 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果 ...
- c++中的重载、覆盖和隐藏
1 重载发生在同一个类内部. 同一个类内部,具有相同的函数名,但是参数列表不同,那么就是重载.因为c++编译器编译时,将函数名和函数列表一起对函数进行了重命名. 2 覆盖和隐藏发生在子类和父类之间. ...