函数的进阶2

本节内容:

1.函数的嵌套回顾及延伸

2.闭包

3.迭代器

4.递归

我们说了,函数的嵌套有两种,其中一种就是:函数里面还有函数:

def 函数1:
def 函数2:
下面的这种也叫作函数的嵌套,虽然没有调用。
def func():
    func1()

①函数的嵌套:

1 def func1():
2     print(2)
3     func2()
4 def func2():
5     print(1)
6 func1()

解构:

1 *c,a,b,d,e = [1,2,3,4]
2 print(c)

结果:

[]

函数名的使用:

首先我们来看看:

1 def func():
2     pass
3 print(func)  # 得到了函数的内存地址

结果:

<function func at 0x0000000001CFC1E0>

说明,打印函数会得到一个函数的内存地址。

那么我们可以利用函数的值(地址)来命名变量。

1 def func():
2     print(1)
3 a = func
4 
5 a()
6 func()  # 函数名可以当做值赋值给变量

函数名可以被当做元素放在容器里。

1 def func():
2     print(1)
3 #
4 def func2():
5     print(2)
6 #
7 li = [func,func2]
8 print(li)  # 函数名可以当做元素放到容器里
1 def func():
2     def aa():
3         print(2)
4         return None
5     return aa()  # return None
6 func() # func() == None

 1 def f():
 2     def a():
 3         def b():
 4             def c():
 5                 return '哈撒给!'
 6             return c()
 7         return b()
 8     return a()
 9 print(f())
10 
11 结果:哈撒给!

下面有一道经典的例题:

1 for i in range(3):
2     def func(x):
3         print(x*i)
4     func(2)  
5 
6 结果:0 2 4

加深难度:

1 li = [] # [func,func,func]
2 for i in range(3):
3     def func(x):
4         print(x*i)
5     li.append(func)
6 
7 for func in li: # [func,func,func]
8     func(2)

1 li = []
2 for i in range(3):
3     def func(x,y=i):
4         print(x*y)
5     li.append(func)
6 
7 for func in li:
8     func(2)
1 def s():
2     print(1)
3 
4 def func(s11):
5     s11()
6 
7 func(s)

2.闭包

1.一个嵌套函数
2.在嵌套函数的内部函数使用外部(非全局的变量)的引用
满足以上两条就是闭包
1 def wrapper():
2     a = 10
3     def inner():
4        print(a)
5     return inner
6 inner = wrapper()
7 inner()
1 def func1():
2     name = "alex"
3     def func2():
4         print(name)
5         # 闭包
6     func2()
7 func1()
8 # 结果: alex

我们可以使用__closure__来检测函数是否是闭包. 使用函数名.__closure__返回cell就是
闭包. 返回None就不是闭包

3.迭代器

 首先我们说说,可迭代对象:

可以被for的就是可迭代对象

具有.__iter__方法的就是可迭代对象
a = 对象.__iter__ 就是 创建一个迭代器
具有__iter__和__next__ 就是一个迭代器
1 li = [1,2,3]
2 a = li.__iter__()
3 print(a.__next__())
4 print(a.__next__())  #一个一个取
5 print(a.__next__())
迭代器特性:
1.惰性机制,一次输出一个值
2.不能从下向上走
3.一次性的,用完就没了

 4.递归

猜你喜欢

转载自www.cnblogs.com/chitangyuanlai/p/10537369.html