红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61A】CS61A——Design

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