![](/img/trans.png)
[英]Why does x**y%z doesn't work like pow(x, y, z) if y is negative?
[英]How does the "any()" function work with a iteration like "x in y for x in z"?
我试图了解任何函数内部发生了什么。 无法理解其中的循环。 谁能帮我分解一下?
with open(host_temp,'r+') as f:
c = f.readlines()
f.seek(0)
for line in c:
if not any(website in line for website in blocked_sites):
f.write(line)
f.truncate()
如果可迭代对象的任何元素为True
,Python 内置的any()
函数将返回True
。 如果可迭代对象为空,则返回False
。
本示例中any
函数内部的语法( x in y for x in z
)称为生成器表达式。
[生成器表达式的语法] 与推导式相同,只是它用括号括起来,而不是用方括号或花括号括起来。
生成器和理解式之间的主要区别在于,生成器懒惰地(根据需要)评估,而理解式立即评估所有变量。 更准确地说,生成器表达式会生成一个新的生成器对象,每当调用其next()
方法时,该对象都会懒惰地计算变量。
在这种情况下,生成器表达式正在迭代名为blocked_sites
的容器。 对于blocked_sites
每个website
,它会检查该网站是否包含在文件的当前line
中。
因此,如果在文件的一行中发现任何被阻止的网站,则会跳过该行。
为了补充 Christopher Peisert 的回答,我将代码拆分为如何扩展any
语句以使其更具可读性(但不是可取的代码副)。
with open (host_temp,'r+') as f:
c = f.readlines()
f.seek(0)
for line in c:
website_in_blocked_sites = False
for website in blocked_sites:
if website in line:
website_in_blocked_sites = True
if website_in_blocked_sites:
f.write(line)
f.truncate()
代码与此类似(提供此代码的长版本):
for line in c:
is_website_in_line = []
for website in blocked_sites:
is_website_in_line.append(website in line) # website in line check if a string is within another, so it returns either True or False
if not any(is_website_in_line) # if all of the list has False values
f.write(line)
如果任何传递给它的元素是“真实的”(与if x:
相同any()
将返回 true。 在这种情况下,它将生成器作为参数。 因为理解代码没有包围 [] 和 {} 以及 () 之间,这意味着它是一个生成器。
for website in blocked_sites:
if website in line:
return True
return False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.