一。可迭代的对象(也就是可以用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. 如何禁止同IP站点查询和同IP站点查询的原理分析 Robots.txt屏蔽BINGBOT

    很多站长工具中都有“同IP站点查询”.“IP反查域名”这种服务不少人都不知道是什么原理,其实这些服务几乎都是用BING(以前的LIVE)来实现 的,BING有个特别功能 BING抓取页面时会把站点的I ...

  2. Linux kernel manpages

    https://www.linuxquestions.org/questions/linux-newbie-8/man-pages-for-kernel-functions-758389/ 在Linu ...

  3. Selenium3 Python3 Web自动化测试从基础到项目实战之二浏览器的不同设置

    在前面一个章节我们知道了如何通过webdriver去初始化我们得driver,然后我们只需要通过driver就能够去做我们得自动化,首先我们知道我们需要知道得是当我们有driver之后,我们剩下得就是 ...

  4. 【selenium+Python unittest】之发送带中文附件的邮箱

    完整原码如下: import smtplib from email.mime.text import MIMEText #from email.header import Header from em ...

  5. SQLite集成与用法

    本文转载至 http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/fra ...

  6. 九度OJ 1012:畅通工程 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7052 解决:3034 题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工 ...

  7. PECL的安装和使用

    下载并安装pear脚本 cd /usr/local/php/bin/ curl -o go-pear.php http://pear.php.net/go-pear.phar ./php go-pea ...

  8. 【题解】NOI2015软件包管理器

    [题解][P2146 NOI2015]软件包管理器 实际上就是树链剖分板子题. 对于\(install\)操作,直接查询它到\(0\)节点有多少已经安装了的,再用总数减去它. 对于\(uninstal ...

  9. SP1437 Longest path in a tree(树的直径)

    应该是模板题了吧 定义: 树的直径是指一棵树上相距最远的两个点之间的距离. 方法:我使用的是比较常见的方法:两边dfs,第一遍从任意一个节点开始找出最远的节点x,第二遍从x开始做dfs找到最远节点的距 ...

  10. 我的Java开发学习之旅------>Java经典排序算法之快速排序

    一.算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod).(1) 分治法的 ...