2_2 Higher_Order_Function+Hog

这篇博客探讨了Python中的高阶函数概念,包括迭代、设计原则、函数作为返回值、lambda函数和控制表达式。此外,还介绍了Textbook 1.6章节中的Newton's Method和Currying。另一方面,文章详细讲解了名为Hog的游戏,阐述了游戏规则、附加规则和不同阶段的策略问题,如Free Bacon、Swine Align和Pig Pass。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值