• python基础(十)--函数进阶


    嵌套函数

    >>> graphic = '三角形'
    >>> def chang():
        graphic = '正方形'
        def chang1():                            #内部嵌套的函数命名可相同
            graphic = '圆形'
            print('第三层打印',graphic)
        chang1()                                 
        print('第二层打印',graphic)
    >>> chang()
    第三层打印 圆形
    第二层打印 正方形
    >>> print('第一层打印',graphic)
    第一层打印 三角形
    #在各自的命名空间中同名变量不受影响

    匿名函数

    lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

    语法为 lambda [arg1 [,arg2,.....argn]]:expression ,以变量的方式调用 sum = lambda arg1, arg2: arg1 + arg2 

    装饰器

    装饰器的作用:在原先代码不改变的情况扩展功能

     def test(f):
        def inner():
        print('hello')
        f()
        return inner        # 返回内部函数对象,内部不调用,这种现象称为‘‘闭包’’
                
    @test
    def log():
        print('world')    
    
    # @test 相当于执行 log= test(log) 
    
    log()                # 现在的log()相当于inner()
    --------------------
    hello
    world

     装饰器的参数传递

    def test(f):
        def inner(*arg):
        print('hello')
        f(*arg)             #此处f(*arg)是原先login函数的调用
        return inner
    
    @test
    def login(x=None):
        if x == 'xing':
        print('world')
    
    login()           #不传参数,因为inner函数是可选参数,f(*arg)则中则为默认参数x = None
    ---------------
    # hello
    --------------
    login('xing')
    ---------------
    # hello
    # world

    递归函数

    递归函数需设停止递归的条件

    递归代码还有代码的话,递归结束后还会依次执行

    def calc(n):
        print(n )
        n = int(n /2) # 50
        if n > 0:
            calc(n) # 50
        print(n)

    生成器

    a = [x for x in range(10)]
    b = (x for x in range(10))
    print(a)
    print(b)
    -------------------
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # <generator object <genexpr> at 0x00505070>

    生成器函数

    使用yield关键字

    def g_test():
        while True:
            print('hello')
            n = yield 5           # yield是暂停并return 5
            print(n)
    
    g = g_test()                 # 必选先执行赋值变量操作
    g.__next__()                 # 刚建立的生成器必须先执行此步
    print(g.__next__())
    g.send('world')              # send方法可发送值给n
    ------------------------
    hello           
    
    None           # 执行完第一个__next__(),n并未赋值,print(n)为None
    hello             
    5                  # yield 5 返回了5 ,print()出来了
    
    world
    hello                                    
  • 相关阅读:
    【转】Linux逻辑卷管理
    oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。
    切换用户后whoami打印用户的问题
    tomcat版本号修改已dwr配置错误安全漏洞整改
    [LeetCode]: 64: Minimum Path Sum
    [LeetCode]: 292: Nim Game
    [LeetCode]: 22 : Generate Parentheses
    [LeetCode]: 121: Best Time to Buy and Sell Stock
    [LeetCode]: 62: Unique Paths
    [LeetCode]: 145: Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/lalaxing/p/11322535.html
Copyright © 2020-2023  润新知