一、函数名的用法

打印函数名可以得到函数的内存地址

def func():
    pass

print(func)

 

函数名可赋值给变量:

def func():
    print(1)
a = func

函数名可放入容器类数据类型里:

def func():
    print(1)

def func2():
    print(2)

li = [func,func2]
print(li)  

函数名可以当做返回值返回给调用者

def func():
def aa():
print(2)
return aa
func()()

 

二、闭包

  在嵌套函数里,当内层函数调用非全局的外部函数的变量时,我们就称这个内层函数为闭包。

如下,函数inner就是一个闭包。

def wrapper():
    money = 10

    def inner(num):
        nonlocal money
        money += num
        print(money)

    return inner


wrapper()(100)

判断是不是闭包的方法:print(函数名.__closure__)若打印结果为None就不是闭包

闭包的优点:使用闭包, 可以保证外层函数中的变量在内存中常驻

闭包的缺点:内存溢出

 

三、迭代器

可迭代对象:满足python的可迭代协议,即内部具有__iter__()函数

迭代器:内部包含__iter__()函数与__iter__()函数

 

迭代器特性:

  1. 惰性机制
  2. 单向运行
  3. 随用随删

for循环其实就是利用了迭代器

li = [1, 2, 3, 4, 6, 7, 87, 8, 9, 90, 0, 0, 0, 0, 8, 7, 7, 67, ]
em = li.__iter__()
while 1:
    try:  
        print(em.__next__())

    except StopIteration:
        break

try语句是python排错语句,具体解释详见:

四、递归

def func(n):
    n+=1
    print(n)
    if n == 5:
        return
    func(n)
func(2)

递归默认层次:官方说明1000,实际测试998/99

递归的效率比较低,尾递归的用时 和 for的用时 是一样的,比for慢

递归的应用场景:在我们不明确循环的次数时用;递归操作文件目录