解剖一条(模糊?)Python代码

2024-06-16 15:00:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读另一个关于堆栈溢出(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中输入上述内容将打印:

^{pr2}$

所以我不得不花整个上午的时间去理解上面的清单。。。理解。。。事情。我不太清楚地声明它是模糊的,但这仅仅是因为我只编写了一个半月的程序,所以不确定这种构造在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如果语句c in this.d的计算结果为True,则“and”语句执行其最右边的任何内容,在本例中是this.d[c]
三。如果语句c in this.d的计算结果为False(这在Jaime的代码中从未发生过),那么“or”语句将执行其最右边的任何内容,在本例中是循环c for c in this.s。在

我说得对吗?在

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

另外,为了加分,禅宗档案里关于荷兰人的奇怪的一行是怎么回事?在

编辑:虽然现在说出来让我感到羞耻,但直到三秒钟前,我还以为Guido van Rossum是意大利人。在读了他的维基百科文章后,我至少理解了,如果不能完全理解的话,为什么会有这句话。在


Tags: orin内容forbs语句thisgb
3条回答

你对流程的看法是正确的。在

循环是一种[dosomething(c) for c in this.s]它是一种列表理解,应该被理解为this.s中所有c的dosomething

荷兰语部分是关于Guido Van Rossum python的创建者是荷兰人。在

你的分析很接近。这是一个列表理解。(顺便说一句,如果去掉外部方括号,则会产生相同的输出,这称为生成器理解)

有一些文档here。在

列表理解的基本形式是

[expression for var in enumerable if condition]

它们的评估顺序如下:

  1. 计算结果是可枚举的
  2. 每个值依次分配给var
  3. 条件已检查
  4. 计算表达式

结果是条件为true的可枚举项中每个元素的表达式值列表。在

这个例子没有使用条件,所以在添加了一些括号之后,剩下的是:

^{pr2}$

this.s是可枚举的。c是迭代变量。c in this.d and this.d[c] or c是表达式。在

c in this.d and this.d[c] or c使用python逻辑运算符的短路特性来实现与this.d[c] if c in this.d else c相同的功能。在

总而言之,我一点也不认为这是混乱的。一旦你理解了列表理解的力量,它看起来就很自然了。在

列表理解行中的运算符如下关联:

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

删除列表理解:

^{pr2}$

删除用于模拟if-else语句的and/or布尔诡计:

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

相关问题 更多 >