繁体   English   中英

“any()”函数如何与“x in y for x in z”这样的迭代一起工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM