Higher-Order Functions
图片不想改了,完整的就看库吧
iteration example
第一个例子是关于斐波那契序列的:求第n个斐波那契数,值得注意的是,习惯上0是第0个斐波那契数,以此类推[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpPOtBpq-1652191362443)(C:\Users\karl\AppData\Roaming\Typora\typora-user-images\image-20220327235406956.png)]
def fib(n):
"""Compute the nth Fibonacci number, for N >= 1."""
pred, curr = 0, 1 # 0th and 1st Fibonacci numbers
k = 1 # curr is the kth Fibonacci number
while k < n:
pred, curr = curr, pred + curr
k = k + 1
return curr
这种解法可以算出斐波那契数,但是第零个除外,做一下优化:
def fib(n):
"""Compute the nth Fibonacci number, for N >= 1."""
pred, curr = 1, 0 # 0th and 1st Fibonacci numbers
k = 0 # curr is the kth Fibonacci number
while k < n:
pred, curr = curr, pred + curr
k = k + 1
return curr
Designing Functions
前面书里已经讲过了,注意三个词:domain
,range
,behavior
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uN6Ey17Z-1652191362445)(C:\Users\karl\AppData\Roaming\Typora\typora-user-images\image-20220328000755413.png)]
遵循一些原则:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9W0ATdOn-1652191362446)(C:\Users\karl\AppData\Roaming\Typora\typora-user-images\image-20220328000831205.png)]
Higher Order Function
参数的泛化:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9ganDzf-1652191362446)(C:\Users\karl\AppData\Roaming\Typora\typora-user-images\image-20220328001929987.png)]
一般情况下,对每一个图形定义函数计算:
"""Generalization"""
from math import pi, sqrt
def area_square(r):
assert r > 0, "a length must be positive"
return r * r
def area_circle(r):
return r * r * pi
def area_hexagon(r):
return r * r * sqrt(3) * 3 / 2
但是每一个r应该均为正数,如果用三个assert
就会冗余,于是再定义一个函数泛化即可:
"""Generalization"""
from math import pi, sqrt
def area(r, shape_constant):
assert r > 0, "a length must be positive"
return r * r * shape_constant
def area_square(r):
return area(r, 1)
def area_circle(r):
return area(r, pi)
def area_hexagon(r):
return area(r, sqrt(3) * 3 / 2)
对计算过程的泛化:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdE62qyA-1652191362447)(C:\Users\karl\AppData\Roaming\Typora\typora-user-images\image-20220328002851382.png)]
"""Generalization"""
def cube(k):
return pow(k, 3)
def identity(k):
return k
def pi_term(k):
return 8 / ((4 * k - 3) * (4 * k - 1))
def summation(n, term):
"""sum of the first n terms of a sequence
>>> summation(5, cube)
225
>>> summation(5, identity)
15
>>> summation(5, pi_term)
3.041839618929402
"""
total, k = 0, 1
while k <= n:
total, k = total + term(k), k + 1
return total
def sum_naturals(n):
return summation(n, identity)
def sum_cube(n):
return summation(n, cube)
def sum_pi(n):
return summation(n, pi_term)
Functions as Return Values
def make_adder(n):
"""Return a function that takes one argument k and returns k + n.
>>> add_three = make_adder(3)
>>> add_three(4)
7
"""
def adder(k):
return k + n
return adder
带参数的函数调用,返回另一个函数:
![[Pasted image 20220404124011.png]]
lambda function
如果想将某个函数赋值给某个变量值,可以直接将函数的过程赋值给该变量值,不必在环境中增加函数名
>>> x = 10
>>> square = x * x #如果直接这样将无法完成函数的赋值
>>> square = lambda x: x * x
>>> square(4)
16
>>> square(5)
25
>>> square
<function <lambda> at 0x0000026298C7DF70>
lambda 表达式的函数没有return
,且不能包含任何statement
![[Pasted image 20220404130121.png]]
lambda vs. def
![[Pasted image 20220404130206.png]]
Return
![[Pasted image 20220404132317.png]]
square = lambda x: x * x
def search(f):
"""search the number until satisfied"""
x = 0
while not f(x):
x += 1
return x
def is_three(x):
return x == 3
def positive(x):
return max(0, square(x) - 100)
def reverse(f):
"""反函数"""
return lambda y: search(lambda x: f(x)==y)
>>> re = reverse(square)
>>> re(121)
11
>>> search(positive)
11
>>> search(is_three)
3
Control
![[Pasted image 20220404135653.png]]
if
语句确定哪些部分被执行而哪些部分不会,函数调用表达式则会执行所有operand
control expressions
这个前面书里有:
![[Pasted image 20220404140138.png]]
一个新的语句func(statement1 if statement2 else statement3)
![[Pasted image 20220404140615.png]]
Textbook_1.6_Higher-Order Functions
迭代计算出黄金比例:
"""guess out the golden ratio"""
def improve