• 函数进阶


    命名空间

    若变量x = 1,1存放于内存中,x也存放于内存中,名称空间存放x与1绑定关系的地方。

    • locals( ):是函数内的名称空间,包括局部变量和形参
    • globals( ):全局变量,函数定义所在模块的名字空间
    • __ builtins __:内置模块的名称空间

    不同变量的作用域不同就是由这个变量所在的命名空间决定的。

    作用域即范围

    • 全局范围:全局存活,全局有效
    • 局部范围:临时存活,局部有效

    作用域的查找顺序

    n = 10
    def func():
        n = 20
        print('func:',n)
        def func1():
            n = 30
            print('func1:',n)
            def func2():
                print('func2:',n)
            func2()
        func1()
    func()
    
    func: 20
    func1: 30
    func2: 30
    

    查找顺序:LEGB

    • L:locals
    • E:enclosing 外部嵌套函数的命名空间
    • G:globals
    • B:buintins

    闭包

    def func():
        n = 10
        def func1():
            print('func1:',10)
        return func1
    
    f = func()
    print(f)
    f()
    
    <function func.<locals>.func1 at 0x005B9B28>
    func1: 10
    

    装饰器

    flag = False
    
    def login(func):
        print(func)
        def inner(*args):
            global flag
            _acc = 'q1ang'
            _pwd = '123'
            if flag == False:
                print('未登录')
                acc = input('Account:').strip()
                pwd = input('Password:').strip()
                if acc == _acc and pwd == _pwd:
                    flag = True
                else:
                    print('账号/密码错误!')
            else:
                print('已登录')
            if flag:
                func(*args) #henan()
        return inner
    
    @login
    def henan(t):
        print('this is henan',t)
    @login
    def ningxia():
        print('this is ningxia')
    
    # henan = login(henan) #inner
    
    henan('nihao')
    ningxia()
    

    生成器

    a = list(range(10))
    b = (i+1 for i in a)  
    print(b)  # <generator object <genexpr> at 0x0031FE40>
    next(b)  
    # 1 → 2 → 3 → ... → 10 → Traceback (most recent call last): 
    # File "<stdin>", line 1, in <module>
    # StopIteration
    for i in b:  # 自动跳出循环
        print(b)
    

    生成器的调用

    a = list(range(10))
    b = (i+1 for i in a)  
    list(b)  # [1,2,3,4,5,6,7,8,9,10]
    

    列表生成器

    a = list(range(10))
    b = [i+1 for i in a]  # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    斐波那契数列

    def fib(m):
        n, a, b = 0, 0 ,1
        while n < m:
            yield b  # 函数执行过程冻结在这一步,并且把b的值返回给外面的next()
            a, b = b, a + b
            n = n + 1
        return 'done'
    f = fib(15)  # 未执行,只生成了生成器
    next(f)
    
    for i in f:
        print(i)
    

    send( )

    • 唤醒并继续执行
    • 发送一个信息到生成器内
    def range1(n):
        count = 0
        while count < n:
            print('count',count)
            count += 1
            sign = yield count
            print('sign',sign)
    n = range1(10)
    n1 = next(n)
    n.send('stop')
    '''
    count 0
    sign stop
    count 1
    '''
    

    迭代器

    可以直接用于 for 循环的对象统称为可迭代对象:Iterable

    • 集合数据类型 list、tuple、dict、set、str
    • generator 生成器,可以被 next( ) 调用并不断返回下一个值的对象称为迭代器:Iterator
    from collections import Iterable
    print(isinstance('abc',Iterable))  # True
    
    from collections import Iterator
    print(isinstance((i for i in range(10)),Iterator))  # True
    
    print(isinstance(iter([1,2,3,4,5]),Iterator))  # True  iter() 可以将可迭代对象转换为迭代器
    
  • 相关阅读:
    linux 统计文件行数的命令效率
    使用mysqldump导入不成功解决方法
    shell中获取当前目录
    shell读取文档中的命令并执行
    读取文件,文件内容包含空格Tab和回车提取想要的数据
    ls命令中的--time-style使用
    Vmware中网卡未启用,安装系统后再启用网卡,eth0如何设置
    lvm逻辑卷扩展方法
    linux小技巧 一
    解决ARCGIS10.2与VS2013不兼容
  • 原文地址:https://www.cnblogs.com/q1ang/p/9404651.html
Copyright © 2020-2023  润新知