0
votes

Comment la fonction "any ()" fonctionne-t-elle avec une itération comme "x en y pour x en z"?

J'essaie de comprendre ce qui se passe dans n'importe quelle fonction. Je ne peux pas comprendre la boucle à l'intérieur. Quelqu'un peut-il le décomposer pour moi?

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()


2 commentaires

Est-ce que cela répond à votre question? Comment fonctionnent toutes les fonctions de Python?


C'est une expression génératrice. Connaissez-vous les compréhensions de listes? Si oui, vous pouvez imaginer cet appel comme any([website in line for website in blocked_sites]) . Si non, envisagez d'en apprendre davantage à leur sujet: docs.python.org/3/tutorial / ...


4 Réponses :


2
votes

La fonction any() intégrée à Python renvoie True si un élément de l'itérable est vrai. Si l'itérable est vide, renvoie False .

La syntaxe à l'intérieur de la fonction any dans cet exemple ( x in y for x in z ) est connue sous le nom d' expression de générateur .

[La syntaxe des expressions génératrices] est la même que pour les compréhensions, sauf qu'elle est placée entre parenthèses au lieu de crochets ou d'accolades.

La principale différence entre un générateur et une compréhension est qu'un générateur évalue paresseusement (au besoin) tandis qu'une compréhension évalue immédiatement toutes les variables. Plus précisément, une expression de générateur produit un nouvel objet générateur qui évalue paresseusement les variables chaque fois que sa méthode next() est appelée.

Dans ce cas, l'expression du générateur effectue une itération dans un conteneur appelé blocked_sites . Pour chaque website dans blocked_sites , il vérifie si le site Web est contenu dans la line courante du fichier.

Ainsi, si un site Web bloqué est trouvé dans une ligne du fichier, cette ligne est ignorée.


1 commentaires

Pouvez-vous élaborer sur le processus en cours dans la boucle? J'essaie de comprendre ce qui se passe quand il dit: site Web en ligne pour site Web dans les sites bloqués ... prend-il une ligne du fichier texte que j'ai ouvert et essaie de le faire correspondre avec les éléments de la liste bloqués? Est-ce ce qui se passe là-bas?



0
votes

Le code est similaire à celui-ci (fournissant la version longue de ce code):

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)


0 commentaires

1
votes

Pour compléter la réponse de Christopher Peisert, j'ai divisé le code en la manière dont on pourrait étendre l'instruction any pour la rendre plus lisible (mais pas préférable code-vice).

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()


0 commentaires

0
votes

any() retournera true si l'un des éléments qui lui sont remis est "véridique" (comme if x: :). Il prend dans ce cas un générateur comme paramètre. Parce que le code de compréhension est sans entourage [] et {} et aussi entre (), l'implication est qu'il s'agit d'un générateur.

for website in blocked_sites:
    if website in line:
        return True
return False


0 commentaires