美文网首页
python——迭代器,闭包

python——迭代器,闭包

作者: Jalynn葸 | 来源:发表于2018-05-03 11:28 被阅读13次

迭代器

可迭代对象

可以用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-----

相关文章

  • python 迭代器 闭包

    迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,...

  • python 迭代器 闭包

    迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,...

  • python——迭代器,闭包

    迭代器 可迭代对象 可以用for循环的数据类型 判断是否可迭代 生成器一定是迭代器,可用next()的也可以迭代。...

  • python 迭代器 闭包

    迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,...

  • 15.迭代器、生成器、装饰器

    一、实验目的 迭代器 生成器 生成器表达式 闭包 装饰器 二、知识要点 1.迭代器 迭代是Python最强大的功能...

  • Lua语言学习教程

    lua闭包 函数尾调用 迭代器

  • 5、迭代器实现

    闭包实现迭代器 迭代函数实现迭代器 --1,调用迭代函数,(把状态变量和控制变量当做参数传递给迭代函数) 状态变...

  • day2-python3函数

    今天练习了python3的各类型函数。包括: 基本语法 高级函数 递归 生成器与迭代器 闭包与装饰器 练习题代码实...

  • 闭包与迭代器

    1. 闭包的基本使用与特性 闭包定义会为每个参数和返回值类型推导一个具体的类型,但是不能推导两次闭包能捕捉环境中的...

  • 跟诸子学游戏 Lua基础

    1:使用闭包创建迭代器 2:泛型for保存状态变量和控制变量,将状态变量传入迭代器,进行迭代,这个属于无状态迭代器...

网友评论

      本文标题:python——迭代器,闭包

      本文链接:https://www.haomeiwen.com/subject/wqdcrftx.html