一。可迭代的对象(也就是可以用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 之闭包,装饰器,生成器的更多相关文章

  1. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  2. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  3. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  4. python高级-闭包-装饰器

    闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...

  5. Python之迭代器&装饰器&生成器&正则

    1.迭代器 迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束.类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数 ...

  6. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  7. python之闭包+装饰器

    闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...

  8. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  9. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  10. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

随机推荐

  1. 还需要学习的十二种CSS选择器

    在前面的文章中,我们在介绍了<五种你必须彻底了解的CSS选择器>,现在向大家介绍,还需要学习的另外十二种CSS选择器.如果你还没有用过,就好好学习一下,如果你已经熟知了就当是温习. 一.X ...

  2. a标签javascript传参不正确的解决办法!

    代码部分: <a href="javascript:void(0);" onClick="findList(${goodsClassify.id})"&g ...

  3. 【转载】【selenium+Python WebDriver】之元素定位

    总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...

  4. 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL, ...

  5. 018 nginx与第三模块整合[一致性哈希模块整合]

    nginx第三方模块官网:http://wiki.nginx.org/HttpUpstreamConsistentHash nginx第三方模块下载地址:https://github.com/repl ...

  6. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  7. android Bluetooth-蓝牙

    bluetooth 一.开启蓝牙 1.获取BluetoothAdapter BluetoothAdapter.getDefaultAdapter() 2.判断手机设备是否 有蓝牙模块 3.开启蓝牙设备 ...

  8. UIScrollView奇葩不滑动

    首先要说声尼玛,真奇葩,从来都没有遇到过这个问题,首先描述一下背景: 我是用XIB拖拽了一个UIScrollView在View上,然后设置了frame,在ViewDidLoad里面,设置了scroll ...

  9. HDU 1853 Cyclic Tour[有向环最小权值覆盖]

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  10. 九度OJ 1157:中位数 (中位数、排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2188 解决:1294 题目描述: 中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一 ...