gpt4 book ai didi

python - 剖析一行(混淆?)Python

转载 作者:太空狗 更新时间:2023-10-29 20:39:11 25 4
gpt4 key购买 nike

我正在阅读关于 Stack Overflow 的另一个问题 (Zen of Python),我在 Jaime Soriano 的回答中看到了这一行:

import this
"".join([c in this.d and this.d[c] or c for c in this.s])

在 Python shell 中输入以上内容打印:

"The Zen of Python, by Tim Peters\n\nBeautiful is better than ugly.\nExplicit is
better than implicit.\nSimple is better than complex.\nComplex is better than
complicated.\nFlat is better than nested.\nSparse is better than dense.
\nReadability counts.\nSpecial cases aren't special enough to break the rules.
\nAlthough practicality beats purity.\nErrors should never pass silently.
\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to
guess.\nThere should be one-- and preferably only one --obvious way to do it.
\nAlthough that way may not be obvious at first unless you're Dutch.\nNow is
better than never.\nAlthough never is often better than *right* now.\nIf the
implementation is hard to explain, it's a bad idea.\nIf the implementation is
easy to explain, it may be a good idea.\nNamespaces are one honking great idea
-- let's do more of those!"

当然,我不得不花整个上午的时间来尝试理解上面列出的……理解……东西。我不愿断然宣布它混淆了,但这只是因为我只编程了一个半月,所以不确定这种结构在 python 中是否司空见惯。

this.s 包含上述打印输出的编码版本:

"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"

并且 this.d 包含一个字典,其中包含解码 this.s 的密码:

{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T', 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L', 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r', 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x', 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd', 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j', 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}

据我所知,Jaime 代码的执行流程是这样的:
1. 循环c for c in this.s给c赋值
2. 如果 this.d 中的语句 c 的计算结果为 True,则“and”语句执行恰好位于其右侧的任何内容,在本例中为 this.d[c].
3. 如果 this.d 中的语句 c 的计算结果为 False(这在 Jaime 的代码中从未发生过),则“or”语句会执行恰好位于其右侧的任何内容,在本例中为循环 c for c in this.s.

我对这个流程的看法是否正确?

即使我对执行顺序的判断是正确的,这仍然给我留下了很多问题。为什么 <1> 是第一个执行的,即使它的代码在几个条件语句之后排在最后?换句话说,为什么 for 循环开始执行并赋值,但实际上只是在代码执行的稍后时间返回值(如果有的话)?

此外,对于奖励积分,Zen 文件中关于荷兰人的奇怪行是什么?

编辑:虽然我现在说起来很丢脸,但直到三秒前我还以为 Guido van Rossum 是意大利人。阅读他的维基百科文章后,我至少掌握了(如果不是完全理解的话)为什么会有那一行。

最佳答案

列表理解行中的运算符是这样关联的:

"".join([(((c in this.d) and this.d[c]) or c) for c in this.s])

删除列表理解:

result = []
for c in this.s:
result.append(((c in this.d) and this.d[c]) or c)
print "".join(result)

删除用于模拟 if-else 语句的 and/or bool 技巧:

result = []
for c in this.s:
if c in this.d:
result.append(this.d[c])
else:
result.append(c)
print "".join(result)

关于python - 剖析一行(混淆?)Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3559124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com