Functional Abstraction
Lambda表达式所在的environment关系
如下例子
1
2
3
4
5
a = 1
def f(g):
a = 2
return lambda y:a*g(y)
f(lambda y: a+y)(a)注意行4与行5的lambda函数的区别:
- 行4的lambda函数是f函数内定义的函数,他的父级为f,因此此时传入的a=2
- 行5的lambda函数是f函数外定义的函数,他的父级为global,因此此时传入的a=1
Choosing Names
给函数或变量命名时,要注重传达意思
命名需要传达与之相关值的意义或目的
值的类型最好记录在函数的docstring中
函数名一般包括它们的作用,表现或返回值
为一些重复使用的复合表达式命名
如果需要注释代码,命名可以长一些
如果用于数字,数学运算与函数抽象,命名可以短一些
Error&Traceback
报错有三种形式:
- Syntax errors:执行前即可发现,通常由于表达式不正确引起
- Runtime errors:执行时由python解释器发现的错误。当这些错误发生时,会得到一个Traceback,来提示是在哪里发生了何种错误,错误发生时程序在做什么
- Logical error:不会被解释器发现,需要自己进行测试发现问题
Decorator
装饰器用于给现有模块(原函数)进行功能拓展,通过接受一个函数来返回一个新的函数或修改原来的函数
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
def trace1(fn):
"""
return a version of fn that first print before it is called
fn - a function of 1 argument
"""
def traced(x):
print("Calling",fn,"on argument",x)
return fn(x)
return traced
@trace1
def square(x):
return x*x等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
def trace1(fn):
"""
return a version of fn that first print before it is called
fn - a function of 1 argument
"""
def traced(x):
print("Calling",fn,"on argument",x)
return fn(x)
return traced
def square(x):
return x*x
square = trace1(square)返回值都相同
1
2
3
>>> square(5)
Calling on argument 5
25