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.如果说装 ...
随机推荐
- 高阶函数:sorted
排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的 ...
- ETL拉链算法汇总大全
拉链算法总结大全: 一.0610算法(追加) 1.删除仓库表的载入日期是本次载入日期的数据,以支持重跑 delete from xxx where start_dt >=$tx_date; 2. ...
- 转:3.3V和5V电平双向转换——NMOS管
分简单,仅由3个电阻加一个MOS管构成,电路图如下: 此电路来自于飞利浦的一篇设计指导文档,是I2C总线官方推荐使用的电平转换电路.在实际使用过程中,需要尤其注意NMOS管的选型以及上拉电阻阻值的选取 ...
- gulp入门-压缩js/css文件(windows)
类似于grunt,都是基于Node.js的前端构建工具.不过gulp压缩效率更高. 工具/原料 nodejs/npm 方法/步骤 首先要确保pc上装有node,然后在global环境和项目文件中都in ...
- Dell 刀片服务器CentOS6.5mini开机20~30分钟宕机
今天查看系统日志发现大量的nf_conntrack: table full, dropping packet. 错误 cat /var/log/messages | moreJun 7 09:52: ...
- python学习(四)字符串学习
#!/usr/bin/python # 这一节学习的是python中的字符串操作 # 字符串是在Python中作为序列存在的, 其他的序列有列表和元组 # 1. 序列的操作 S = 'Spam' # ...
- FreeRTOS在神舟IV号开发板的应用demo
下面一个可以直接编译运行的例子,FreeRTOS的版本是V7.1.0,芯片是STM32F107VCT6,使用的开发环境是Keil uVision5. 这里例子创建了四个任务,每个任务控制一个LED的亮 ...
- linux支持的machine-types
在内核文件中arch/arm/tools/mach-types定义目前内核支持的板卡.芯片等: ##machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number ...
- 字符串查找strpos()函数用法
#如果id=3 在字符串中查找出3是否存在.$str="2,12,33,22,55"; if(strpos(','.$id.',',','.$str.',')!==FALSE){ ...
- Executors几种常用的线程池性能比较
java编程中,经常会利用Executors的newXXXThreasPool生成各种线程池,今天写了一小段代码,简单测试了下三种常用的线程池: import com.google.common.ut ...