一。可迭代的对象(也就是可以用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. RF--- selenium

  2. 搭建SpringMVC+Hibernate4+Spring3+Ajax+Maven项目

    首先新建一个Maven项目.百度一下会有非常多实例,这里就不介绍了,直接奔主题. 如题:这里使用的是Hibernate4和Spring3,使用的JPA和Spring注解,然后JDK版本号是1.7 以下 ...

  3. ArcMap中使用ArcPy实现Geometry与WKT的相互转换

    在Web GIS迅猛发展的今天,使用浏览器来进行交互以其方便性.快捷性被广大用户所推崇,那么在传输格式方面,都已比較简单的JSON或者WKT来解决网络带宽带来的数据压力. 在ArcGIS10.2版本号 ...

  4. PHP第四课 了解经常使用的函数

    学习概要: 一.语言结构 二.自己定义函数 三.变量作用域 四.静态变量 五.函数返回值 六.參数 七.默认參数 八.引用參数 九.可变个数函数 十.回调函数 十一.变量函数 十二.递归函数 十三.文 ...

  5. 企业级API设计

    最近对service的API设计,在team内有些讨论,主要集中在API是足够抽象.通用好呢, 还是具体.易用好? 其实这个是要折衷的,通用的好处是以后更改API的可能性小,但坏处是想要通用,里面的字 ...

  6. 49 个jquery代码经典片段

    49 个jquery代码经典片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一 些则是真正有用的函数或方法,他们能够帮助你又快又 ...

  7. python学习(八)阶段性总结

    这里学习了python的一点点基础然后来总结一下 python是一个强类型的语言 数字: 数字的类型大概有:整数.浮点数.复数.固定精度的十进制数.带分子和分母的有理数 数字与字符串之间不能直接相加, ...

  8. Linux进入单用户模式

    有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...

  9. Array容易被忽略的join

    var lists, items = '', i; lists = [{ Fruits:'苹果' },{ Fruits:'香蕉' },{ Fruits:'菠萝' }]; /*items += '< ...

  10. 11 redis之rdb快照持久化

    一:Redis持久化配置 Redis的持久化有2种方式[快照,是日志] 二:Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 // 如果3 ...