[CS61A-Fall-2020]學習記錄四 Lecture4中有意思的點
前言
首先,本文不是總結歸納,只是記錄一些有趣的知識點罷了
正文
assert
課堂中在講授函數,如
from math import pi
def area_circle(r):
return r * r * pi
但老師提出,當r為-10時,函數不會報錯,于是引入assert來檢測參數
from math import pi
def area_circle(r):
# 參數應為正數
assert r > 0, 'A length must be positive'
return r * r * pi
assert r > 0
也就是當r大于0時,無事發生;否則發生錯誤并提示后面的語句
Higher-Order Functions
一開始讀題并不懂,什么是高等級的函數呢?課上有個例子大致如下
def make_adder(k):
def adder(n):
return n + k
return adder
make_adder函數內又定義了個adder函數
此時,如果調用make_adder(1),會返回一個k為1的adder函數
而如果調用make_adder(1)(2),則相當于調用adder(2),此時k=1
像這樣的方式可以十分方便地減少重復代碼,分離函數功能,更接近DRY(Don't Repeat Yourself)
Lambda
square = lambda x: x * x
lambda表達式使得簡單函數無需用def定義后再調用
在python中,與def相比,lambda定義出的函數有一個特點,那就是沒有內在自己的名字
直接輸入上式, square,會發現在內存中,square對應的函數其實是lambda,不叫square
老師表示該功能在python中不常用,但其他有的地方會很重要,故學習并記錄
下面是一個稍微有些難度的例子,與lambda本身關系不大
# 尋找到f值為True的正數x
def search(f):
x = 0
while True:
if f(x):
return x
x += 1
def square(x):
return x * x
# 可以求出y對應的x滿足f(x) == y
def inverse(f):
return lambda y: search(lambda x, f(x) == y)
這里的inverse函數在初次看的時候有些令人費解,但一點點看
首先從輸出結果
>>> sqrt = inverse(square)
>>> square(8)
64
>>> sqrt(64)
8
可見sqrt通過inverse承擔了解平方的功能
inverse中f對應的是square,而在search函數中的f對應的是lambda x, f(x) == y
sqrt(64)的64則是賦給了y,然后再在search中尋找讓f(x) == y成立的正數x并返回
If的另一種表達
直接舉栗子比較清晰
x = 0
x = 1 if x > 0 else x = -1
x > 0是條件,滿足該條件時執行if前,否則執行else后
當作拓展知識吧

浙公網安備 33010602011771號