Python学习day13-函数进阶(1)
闭包函数
闭包函数,从名字理解,闭即是关闭,也就是说把一个函数整个包起来。正规点说就是指函数内部的函数对外部作用域而非全局作用域的引用。
为函数传参的方式有常用有以下两种:
-
用参数的形式
xxxxxxxxxx
51def func(x):
2print(x)
34func(1)
5
-
包给函数
xxxxxxxxxx
111def outter(x):
2x = 1
34def inner():
5print(x)
6return inner
7f = outter(1)# outter的返回值为inner所以会执行到print(x)
8
9f()
10f()
11
闭包函数的应用
闭包的意义在哪呢,其返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用的时候,都会优先调用外层包裹的作用域。
其主要应用领域就在于延迟计算和爬虫领域,可以简化代码量,也会使代码更加的稳定。
装饰器
装饰器是一个逻辑上比较复杂的概念,所幸我们并不必追究太深,只需知道其使用方法和大概原理即可。
所以什么是装饰器呢,个人理解装饰器就是包裹在函数外面的另外一个函数,而且装饰器的起到对原函数增加功能的作用,且不影响原函数的调用和存在。
需要注意的是,装饰器本身其实是任意可调用的对象,被装饰的对象也可以是任意可调用的对象。
装饰器的实现必须遵循的两大原则在于:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
装饰器模板
这里咱们就不举例那些非常复杂的装饰器模型了,只会越看越晕,我们只需要记住并熟练一个装饰器的模板就可以了,万能模板如下:
xxxxxxxxxx
def deco(func):
def wrapper(*args,**kwargs):
# 在这里写需要添加并实现的功能
res = fun(*args,**kwargs)
return res
return wrapper
# 调用方式如下
def f1():
print('from f1')
f1 = deco(f1)
f1()
迭代器
迭代是一个比较常见的概念,迭代,也就是更新换代,一个接着一个改变,但单纯的重复并不是迭代。
可迭代对象
Python中一切皆对象(注意,此对象非彼对象)。对于这一切对象中,只要是有__iter__
方法的对象,都是可迭代对象。
xxxxxxxxxx
name = 'nick'.__iter__
lis = [1,2].__iter__
tup = (1,2).__iter__
dic = {'name':'nick'}.__iter__
s1 = {'a','b'}.__iter__
f = open('file','r',encoding = 'utf8')
f.__iter__
f.close()
迭代器对象
可迭代对象是有__iter__
方法的对象,而迭代器对象则是同时有__iter__
和__next__
方法的对象。
其实只有文件本身即是可迭代对象又是迭代器对象,别的对象都需要用__iter__
拿到迭代器本身才可以用__next__
方法。
for循环的原理
for循环其实就是一种迭代器循环,in后面必须是可迭代的对象,这点在leetcode
刷题的时候就可以碰到,但凡是碰到链表类型的题目,都是不能放在for循环里的,也不能用len
测量其长度,就是因为链表类型不可迭代。
其实for循环的内层原理类似于while然后捕捉错误,比如:
xxxxxxxxxx
lt = [1,2,3]
lt_iter = lt.__iter__()
while 1:
try:
print(lt_iter.__next__())
except StopIteration:
break
# for循环本身到最后也是报错的StopIteration,只不是内部做了处理,捕捉到报错直接break了,所以for循环的本质还是while循环。