python——迭代器,闭包

迭代器

可迭代对象

可以用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-----
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容