1.2 Elements of Programming
1.2.6 The Non-Pure Print Function
>>> print(print(1), print(2))
1
2
None None
注意 print(1)和 print(2)的返回值是 None。
1.4 Designning Functions
1.4.1 Documentation
docstring。在函数名后在``````中描述函数信息。第一行用来描述函数,接着空一行,接着可以描述参数等。
help(pressure)可以查看函数帮助信息。
>>> def pressure(v, t, n):
"""Compute the pressure in pascals of an ideal gas.
Applies the ideal gas law: http://en.wikipedia.org/wiki/Ideal_gas_law
v -- volume of gas, in cubic meters
t -- absolute temperature in degrees kelvin
n -- particles of gas
"""
k = 1.38e-23 # Boltzmann's constant
return n * k * t / v
1.4.2 Default Argument Values
带有默认值的函数形参在调用函数时不赋值表示使用默认值,可以用其他值代替。
1.5 Control
1.5.4 Conditional Statements
Boolean contexts. 除了 0,None,false 其他都为 True。
1.5.5 Iteration
pred, curr = curr, pred + curr
先计算=右边的表达式,才会更新=左边的值。
1.6 Higher-Order Functions
1.6.1 Functions as Arguments
函数做形参
1.6.3 Nested Definitions
在函数中定义函数
def sqrt(a):
def sqrt_update(x):
return average(x, a/x)
def sqrt_close(x):
return approx_eq(x * x, a)
return improve(sqrt_update, sqrt_close)
子函数可以调用父函数的形参。
1.6.4 Functions as Returned Values
函数做返回值
def square(x):
return x * x
def successor(x):
return x + 1
def compose1(f, g):
def h(x):
return f(g(x))
return h
def f(x):
"""Never called."""
return -x
square_successor = compose1(square, successor)
result = square_successor(12)
1.6.6 Currying
把一个需要传入多个参数的函数,转化为一串只接收一个参数的函数。
def curried_pow(x):
def h(y):
return pow(x, y)
return h
>>>curried_pow(2)(3)
8
1.6.7 Lambda Expressions
匿名函数,只能有一句 return 语句。
def compose1(f, g):
return lambda x: f(g(x))
lambda x : f(g(x))
"A function that takes x and returns f(g(x))"
1.6.9 Function Decorators
函数装饰器。
def trace(fn):
def wrapped(x):
print('-> ', fn, '(', x, ')')
return fn(x)
return wrapped
@trace
def triple(x):
return 3 * x
>>> triple(12)
-> <function triple at 0x102a39848> ( 12 )
36
相当于
def triple(x):
return 3 * x
triple = trace(triple)
加了装饰器的 triple 函数后,不仅仅只会返回计算得到的 3*x,还会执行装饰器中的打印语句。
1.7 Recursive Functions
1.7.2 Mutual Recursion
两个函数互相递归。
判断一个数是偶数还是奇数:
def is_even(n):
if n == 0:
return True
else:
return is_odd(n-1)
def is_odd(n):
if n == 0:
return False
else:
return is_even(n-1)
result = is_even(4)
1.7.4 Tree Recursion
函数体内调用自己超过一次。
斐波那契数列:
def fib(n):
f n == 1:
return 0
if n == 2:
return 1
else:
return fib(n-2) + fib(n-1)
result = fib(6)