迭代器
可迭代对象
可以用for循环的数据类型
判断是否可迭代
生成器一定是迭代器,可用next()的也可以迭代。
>>> from collections import Iterable
>>> isinstance("abc",Iterable)
True #是迭代器对象
>>> isinstance(100,Iterable)
False
>>> isinstance((x for x in range(10)),Iterable) #生成器也是迭代器
True
iter()
可把列表等,转化为可迭代对象
闭包
函数的引用
def test():
print("__________")
b = test
b()
运行结果:
__________
闭包
在函数里面再定义一个函数,并且这个函数用到了外面函数的变量,那么将这个函数用到的一些变量
def test(number):
print("$$$$$$$$$$$$$$$")
def test_in(number2):
print("%%%%%%")
print(number+number2)
print("***********************")
return test_in
ret = test(100)
print("&"*30)
ret(1)
ret(100)
ret(200)
运行结果:
$$$$$$$$$$$$$$$
***********************
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
%%%%%%
101
%%%%%%
200
%%%%%%
300
闭包的应用
def test(a,b):
def test_in(x):
print(a*x + b)
return test_in
line1 = test(1,1)
print(line1(5))
line2 = test(2,2)#
print(line2(1))
运行结果:
6
4
装饰器
def test1():
print("---1---")
def test1():
print("-------2------")
test1()
运行结果:
-------2------
def w1(func):
def inner():
print("---验证权限---")
func()
return inner
def test1():
print("-------1------")
def test2():
print("------2-------")
test1 = w1(test1)
test1()
运行结果:
------1-------
---验证权限---
上面等价于下面:
def w1(func):
def inner():
print("---验证权限---")
func()
return inner
@w1
def test1():
print("-------1------")
def test2():
print("------2-------")
test1()
def w1(func):
def inner():
print("---验证权限---")
if False:
func()
else:
print("没有权限")
return inner
#test1 = w1(test1)
@w1
def test1():
print("-------1------")
def test2():
print("------2-------")
test1()
运行结果:
---验证权限---
没有权限
两个装饰器的执行顺序和运行结果
def w1(func):
print("---正在装饰1---")
def inner():
print("正在验证权限1")
func()
return inner
def w2(func):
print("---正在装饰2222---")
def inner():
print("正在验证权限2")
func()
return inner
@w1
@w2
def test1():
print("-------1------")
test1()
运行结果:
---正在装饰2222---
---正在装饰1---
正在验证权限1
正在验证权限2
-------1------
def func(funcName):
print("-----func---1-----")
def func_in():
print("-----func_in---1-----")
funcName()
print("-----func_in---2-----")
print("-----func---2-----")
return func_in
def test():
print("-------test-----")
test = func(test)
test()
------------------------------------------------------------
def func(funcName):
print("-----func---1-----")
def func_in():
print("-----func_in---1-----")
funcName()
print("-----func_in---2-----")
print("-----func---2-----")
return func_in
@func
def test():
print("-------test-----")
#test = func(test)
test()
result:
-----func---1-----
-----func---2-----
-----func_in---1-----
-------test-----
-----func_in---2-----
含有参数的装饰器
def func(funcName):
print("-----func---1-----")
def func_in(a,b):#如果没有a,b则会导致后面调用失败
print("-----func_in---1-----")
funcName(a,b)#如果没有a,b则会导致后面调用失败
print("-----func_in---2-----")
print("-----func---2-----")
return func_in
@func
def test(a,b):
print("a = %d, b = %d"%(a,b))
#test = func(test)
test(11,22)
运行结果
-----func---1-----
-----func---2-----
-----func_in---1-----
a = 11, b = 22
-----func_in---2-----
不定长参数的装饰器
def func(funcName):
print("-----func---1-----")
def func_in(*args,**kwargs):#如果没有a,b则会导致后面调用失败
print("-----func_in---1-----")
funcName(*args,**kwargs)#如果没有a,b则会导致后面调用失败
print("-----func_in---2-----")
print("-----func---2-----")
return func_in
@func
def test(a,b,c,d):
print("a = %d, b = %d"%(a,b))
#test = func(test)
test(11,22,33,66)
运行结果:
-----func---1-----
-----func---2-----
-----func_in---1-----
a = 11, b = 22 c = 33
-----func_in---2-----
使用装饰器对有返回值的函数进行装饰
def func(funcName):
print("-----func---1-----")
def func_in():
print("-----func_in---1-----")
ret = funcName() #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
print("-----func_in---2-----")
return ret
print("-----func---2-----")
return func_in
@func
def test():
print("-------test-----")
return "哈哈哈哈哈哈"
ret = test()
print(ret)
运行结果:
-----func---1-----
-----func---2-----
-----func_in---1-----
-------test-----
-----func_in---2-----
哈哈哈哈哈哈
通用的装饰器
def func(funcName):
#通用装饰器
def func_in(*args,**kwargs):
print("记录日志")
ret = funcName(*args, **kwargs) #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
return ret
return func_in
@func
def test():
print("-------test-----")
return "哈哈哈哈哈哈"
@func
def test2():
print("------test2--------")
@func
def test3(a):
print("----------aaaaa = %d"%a)
ret = test()
print(ret)
a = test2()
print(a)
test3(22)
运行结果:
记录日志
-------test-----
哈哈哈哈哈哈
记录日志
------test2--------
None
记录日志
----------aaaaa = 22
带有参数的装饰器
1、先执行func_arg("ahhahah")函数,这个函数return 的结果是func这个函数的引用
2、@func
3、使用@func对test进行装饰
def func_arg(arg):
def func(funcName):
def func_in():
print("-----记录日志------%s"%arg)
funcName() #如果有返回值,则保存返回来的“哈哈哈哈哈哈”
return func_in
return func
@func_arg("hahahha")
def test():
print("-------test-----")
test()
运行结果:
-----记录日志------hahahha
-------test-----
网友评论