一等函数
- 三个特点,能赋值给变量或者数据结构中的元素;作为参数传给函数;作为函数的返回结果。再加一点的话注意的是一等函数是运行时创建。
- key传参也可以是函数。
- callable可以判断是否是可调用的对象。
- 位置参数关键字参数见此文。有个小例子需要注意:
def tag(a,*b,c=None,**d ): if c is not None: print('c') if d : print('d') if b: print('b') if a: print('a') tag(1) tag(1,2) tag(e=5,a=1) tag(b=2,a=1) Print: a b a d a d a
最后一个输出注意下即可。
- 函数注解,举个例子即可:
def abc(a:str,b:'int > 0'=80) -> str:
分别代表位置参数,关键字参数,和返回值的注解。
设计模式
虽然设计模式与语言无关,但是并不是意味着每个设计模式都能在每一门语言中应用,在著名的《设计模式:可复用面向对象的软件基础》中的23个设计模式,有16个在动态语言中消失不见。
本章 不详述,在python设计模式中有详细论述。
装饰器与闭包
- 装饰器在此文中也有较为初步的论述,这里我们也是贴一个小例子:
def deco(func): print(1) def inner(): print(2) return inner @deco def target(): print(3) if __name__ == '__main__': print(4) target() Print: 1 4 2
注意输出顺序,在print(4)前注意的是,@deco已经执行了"print(1)"
-
简单概括一下装饰器,尽管表述可能不是很准确:“即使调用为A名字的函数,但被运行的函数‘另有其人’”。
-
上面两条其实概括了装饰器的特性,首先要确定的是它只是一个语法糖,能把装饰的函数替换成其他函数,同时装饰器在加载模块时可以立即执行。
-
变量的种类不能改变函数的定义体,即便局部变量是在后文定义,但是也不会因为这样就判断本地环境中的值为全局值。
-
闭包是指延伸了作用域的函数,其中包含函数定义体中引用,但是不再定义体中定义的局部变量。
-
Nonlocal:
def shuc(): a = 1 def csd(): a += 1 return a return csd b = shuc() print(b()) local variable 'a' referenced before assignment File "C:\Users\starinsun\Desktop\practice\fluent_python\3.py", line 4, in csd a += 1 File "C:\Users\starinsun\Desktop\practice\fluent_python\3.py", line 9, in <module> print(b())
而使用nonlocal即可把因+=出现的局部变量转化为自由变量。
def shuc(): a = 1 def csd(): nonlocal a a += 1 return a return csd b = shuc() print(b()) Print 2
.
-
"functools.lru_cache()"对于处理递归这类耗时的问题,通过其缓存特性,可以使其运行更快。只需要叠加装饰器即可。