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