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                                    
原文地址:https://www.cnblogs.com/lalaxing/p/11322535.html