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()
4 Réponses :
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.
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?
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)
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()
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
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 / ...