在这段代码 sn-p 中找到并被“裸”( ) 包围的形式的表达式称为生成器推导。它产生一种特定类型的迭代,称为 Python 中的生成器。
还有其他类型的理解。被裸括号包围的表达式将是一个列表推导。示例:
[char for char in "string"]
这将产生一个列表:
['s','t','r','i','n','g']
而“裸”大括号(又名集合推导式)产生一个集合:
{char for char in "string"}
这使得集合:
{'s','t','r','i','n','g'}
(也有字典推导式。)
正如我一开始所说,在这种something for something in something_else 形式的语句周围只使用括号会产生一种特殊的迭代器,称为 Python 中的生成器(而不是像上面的示例那样的列表或集合) .
然而,在 Python 中,很多其他的东西都是可迭代的,包括字符串。在生成器内部,每个字符在字符串被迭代时被检索,一次一个,因为它被依次调用,s,t,...等等。检索到的字符然后是引用的对象char 用于该迭代。
ord(char) 部分将ord 函数依次应用于每个char,因为字符串被迭代。 ord 函数只是查找从字符串中检索到的特定字符的 unicode 编号。然后,该 unicode 值是当前迭代的整体生成器的结果。
要从生成器中获取值,您必须以某种方式对其进行迭代 - 例如使用 next() 或 for...in 语句。但通常您也可以将生成器作为参数应用到任何接收可迭代参数的函数。在这种情况下,sum()(这显然是为了将一系列连续的参数添加在一起)被应用于生成器的所有结果。生成器的每个产生的结果都是系列的成员。
所以代码的整体效果是将字符串字符的所有 unicode 值加在一起。 2014 年的总体结果似乎只是巧合。那里没有发生任何神秘或神奇的事情。