码迷,mamicode.com
首页 > 编程语言 > 详细

Python_Example_装饰器

时间:2018-11-14 22:45:27      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:测试   使用   访问   plain   iterable   包括   表示   __name__   后退   

 Author: 楚格

2018-11-14  21:09:01

IDE: Pycharm2018.02   Python 3.7   

KeyWord :  MySQL封装

Explain: 

 

--

# coding=utf-8
#---------------------------------
‘‘‘
# Author : chu ge
# Function:
#
‘‘‘
#---------------------------------
‘‘‘
迭代器:
迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置对象。
迭代器对象从集合的第一个元素开始访问,
直到所有的元素被访问完结束。迭代器只能往前不会后退。

1.可迭代对象
以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如,list,tuple,dict,set,str
一类是generator,包括生成器和带yield的generator function
这些可以直接作用于for循环的对象统称可迭代对象:iterable

2.判断是否可以迭代
可以使用isinstance()判断一个对象是否是iterable对象:
e.g
form collection import Iterable
isinstance([],Iterable)
>>true
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,
知道最后抛出stopiterable错误表示无法继续返回下一个值。

3迭代器
可以被next()函数调用并不断返回下一个值的对象为迭代器:iterable。
可以使用isinstance()判断一个对象是否是iterator对象:
form collection import Iterator
isinstance((x for x in range(10)),Iterator)
>>true
isinstance([],Iterator)
false

4.iter()函数
生成器都是iterator对象,但list,dict,str虽然是iterable,却不是iterator
把list,dict,str等iterable变成iterator可以使用iter()函数:

总结:
凡是可以作用于for循环对象的都是iterable类型:
凡是可作用于next()函数的对象都是iterator类型,
集合数据类型如list,dict,str等是iterable但不是iterator
不过可以通过iter()函数获得一个iterator对象。


》》》


闭包

1.函数引用
def line_conf(a,b):
def line(x):
:return a*x + b
:return line

line1 = line_conf(1,1)
line2 = line_conf(4,5)
print(line1(5))
print(line2(5))

2.什么是闭包
函数line与a,b构成闭包。
在创建闭包的时候,我们通过line_conf的参数a,b说明了二个变量的取值
这样,我们就确定了函数的最终形式(y = x + 1 和 y = 4x +5)
我们只需要变换参数a,b,就可以获得不同的直线表达函数。
由此,我们可以看到,闭包也具有提高代码可复用性的作用

如果没有闭包,我们需要每次创建直线函数的同时说明abx.
这样,我们就需要更多的参数传递,也减少了代码的可移植性。
1.闭包 优化了变量,原来需要类对象完成的工作,闭包也可以完成。
2.由于闭包引用了外部函数局部变量,则外部函数的局部变量没有及时释放,消耗内存


》》》


装饰器
1.
装饰器必须是闭包函数!!
1.1
def foo():
Print("foo")

foo # 表示函数
f00() # 表示执行foo函数

1.2
def foo():
print("foo")
foo = lambda x: x+1
foo() # 执行下面的lambda表达式,而不是原来的foo函数,因为foo这个名字

2.
写代码要循序,开发封闭原则
开放:对扩展开发
封闭:以实现功能代码块
代码可以增加,不能删除代码

# 闭包函数
def w1(func):
def inner():
# 验证 1
# 验证 2
func()
return inner

语法糖:特殊功能 @
@w1
def f1():
print("f1")

@w1
def f2():
print("f2")

举例
# 定义函数,完成包裹数据
def makeBold(fn):
print("1")
def wrapped():
print("2")
print("----1----")
print("3")
print("cao1")
fn()
print("cao")
return "<b>" + fn() + "</b>"
print("4")
return wrapped


#定义函数:完成包裹数据
def makeItalic(fn):
print("5")
def wrapped():
print("6")
print("----2----")
print("7")
return "<i>"+fn()+"</i>"
print("8")
return wrapped

# 只要python解释器执行到这个代码,那么就会自动的进行装饰
# 而不是等到调用的时候才装饰的
# @makeBold
# def test1():
# print("test 1")
# return "hello 1"
#
# @makeItalic
# def test2():
# print("test 2")
# return "hello 2"

@makeItalic
@makeBold
def test3():
print("test 3")
return "hello 3"



print(test3())
》》
1
4
5
8
6
----2----
7
2
----1----
3
cao1
test 3
cao
test 3
<i><b>hello 3</b></i>



4.装饰器功能
4.1引用日志
4.2函数执行统计时间
4.3执行函数前进行预处理
4.4执行函数后清理功能
4.5权限校验功能
4.6缓存



5装饰器实例
5.1函数

#不定长度到带参数
def func(functionName):
print("---func---")
# def func_in(aa,ss):# 固定参数
def func_in(*args,**kwargs): # 不定参数#*args元组**kwargs字典
print("---func_in----")
ret = functionName(*args,**kwargs)
return ret
print("---func2---")
return func_in

@func
def test(a,b):
print("---test-a=%d,b=%d--"%(a,b))
return "hello"
这个例子包括:无参数,有参数和无固定参数和带返回值

#带参数通用装饰器
def func_arg(arg): #新增
print("--python--")
def func(functionName):
print("---func---")
# def func_in(aa,ss):# 固定参数
def func_in(*args,**kwargs): # 不定参数#*args元组**kwargs字典
print("---func_in----")
ret = functionName(*args,**kwargs)
return ret
print("---func2---")
return func_in
return func

@func_arg("cao") #新增
def test(a,b):
print("---test-a=%d,b=%d--"%(a,b))
return "hello"
---
a=test(11,23)
print(a)
》》
--python--
---func---
---func2---
---func_in----
---test-a=11,b=23--
hello











‘‘‘

‘‘‘
# --------------------------------
# 导入模块
# 1.系统库
# 2.第三方库
# 3.相关定义库
# --------------------------------
‘‘‘
# 1.系统库
import sys
import os

#2.第三方库

‘‘‘
# ------------------------------------------
# 导入:同级不同文件夹
# 先文件夹__init__注释,其次引用name.py
# 最后 使用具体 类class 或者 函数function 名称
# ------------------------------------------
‘‘‘

‘‘‘
# ------------------------------------------
# 导入:同级同文件夹
# 先引用name.py
# 后 使用具体 类class 或者 函数function 名称
# ------------------------------------------
‘‘‘

‘‘‘
# ============================================================================
# Class : 类
# Explain : 输入参数
# : 输出参数
# ============================================================================
‘‘‘

‘‘‘
# ============================================================================
# Function:
# Explain : 输入参数
# : 输出参数
# ============================================================================
‘‘‘
#带参数通用装饰器
def func_arg(arg):
print("--python--")
def func(functionName):
print("---func---")
# def func_in(aa,ss):# 固定参数
def func_in(*args,**kwargs): # 不定参数#*args元组**kwargs字典
print("---func_in----")
ret = functionName(*args,**kwargs)
return ret
print("---func2---")
return func_in
return func

@func_arg("cao")
def test(a,b):
print("---test-a=%d,b=%d--"%(a,b))
return "hello"
# ============================================================================
‘‘‘
# ============================================================================
# 测试专用
# ============================================================================
‘‘‘
if __name__ == "__main__":
a=test(11,23)
print(a)

Python_Example_装饰器

标签:测试   使用   访问   plain   iterable   包括   表示   __name__   后退   

原文地址:https://www.cnblogs.com/caochucheng/p/9960396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!