Re: [問題] 這兩句沒註釋的程式碼,懇請翻譯教學.

作者: HuangJC (吹笛牧童)   2023-01-26 07:58:54
因為這篇讓我有學到東西,所以來回一下吧..
※ 引述《ruthertw (督人無數就是我)》之銘言:
: Github上一堆不寫註釋的,
你有沒有把程式建起來,試著補足不全的部份,去做實驗?
: 搞不懂以下兩句:
: if o_filename not in map(lambda img: img['filename'], imgs):
: ...
: ...
: ...
: else:
: img = [ele for ele in imgs if ele['filename'] == o_filename][0]
> img['filename']
由這行看,img 可能是個 dict 結構,這行則是取出 dict 中 key 為 filename 的元素
(img 可能還擁有其他元素,比如長,寬,color palette, bitmap 等等)
> lambda img: img['filename']
這是種匿名函式的寫法, 尤其用在簡易取值運算
如果函式命名為 fn 就能寫成下式
fn = lambda img: img['filename']
而這行又等義於
def fn(img):
return img['filename']
》map(lambda img: img['filename'], imgs)
這樣就可以把這句,代換成 map(fn, imgs)
fn 要先定義好才能這樣代換
也因為全打在一行可以省掉 fn, 所以叫匿名函式
map(fn, imgs) 是把 fn 依序在 imgs 元素裡執行的方法,
所以 imgs 是個 tuple or list
以 a = map(fn, imgs) 來討論
返回的 a 是個迭代器
若用 list(a) 就可以把迭代器轉化為 list
> if o_filename not in map(lambda img: img['filename'], imgs):
這句在我的拆解,等於是 if o_filename not in a:
o_filename 是檔名,看來是字串
這樣的句子,a 這個迭代器會自動被展開成 tuple
所以這句是:若 o_filename 這個檔名,沒出現在 imgs 裡的話
執行你的 ...
若有出現,執行 else 下的
》img = [ele for ele in imgs if ele['filename'] == o_filename][0]
這句是 img = b[0] 這種型式,取得 tuple or list 裡第一個元素
tuple or list 若要翻譯,統稱陣列也蠻順眼的 XD
其中 b = [ele for ele in imgs if ele['filename'] == o_filename]
我這次學到的就這個了,這等效於
b = list()
for ele in imgs:
if ele['filename'] == o_filename:
b.append(ele)
我原本不知道這種形成 list 的方式還可以加上 if 語句
這下我的程式又要更簡潔啦~
拆成這樣若還看不懂,你需要步進執行工具,比如 PyCharm
可以步進,執行到一半還可以看變數

Links booklink

Contact Us: admin [ a t ] ucptt.com