Wanneer gebruik je “while” of “for” in Python

Ik ondervind problemen wanneer ik een while-lus of een for-lus in Python moet gebruiken. Het lijkt erop dat mensen de voorkeur geven aan een for-lus (minder coderegels?). Is er een specifieke situatie die ik het een of het ander moet gebruiken? Is het een kwestie van persoonlijke voorkeur? De codes die ik tot nu toe heb gelezen, deden me denken dat er grote verschillen tussen zijn.


Antwoord 1, autoriteit 100%

Ja, er is een enorm verschil tussen terwijl en voor.

De for-instructie herhaalt zich door een verzameling of een itereerbaar object of generatorfunctie.

De while-instructie loopt gewoon door totdat een voorwaarde False is.

Het heeft geen voorkeur. Het is een kwestie van wat uw gegevensstructuren zijn.

Vaak vertegenwoordigen we de waarden die we willen verwerken als een range(een actuele lijst), of xrange(die de waarden genereert) (Bewerken: In Python 3 is rangenu een generator en gedraagt het zich als de oude functie xrange. xrangeis verwijderd uit Python 3) . Dit geeft ons een gegevensstructuur die op maat is gemaakt voor de for-instructie.

Over het algemeen hebben we echter een kant-en-klare verzameling: een set, tuple, lijst, kaart of zelfs een string is al een itereerbare verzameling, dus we gebruiken gewoon een for-lus.

p>

In een paar gevallen willen we misschien dat er wat functionele programmeerverwerking voor ons wordt gedaan, in welk geval we die transformatie als onderdeel van iteratie kunnen toepassen. De functies sorteden enumeratepassen een transformatie toe op een iterabele die natuurlijk past bij de for-instructie.

Als je geen nette gegevensstructuur hebt om doorheen te itereren, of als je geen generatorfunctie hebt die je verwerking aanstuurt, moet je whilegebruiken.


Antwoord 2, autoriteit 29%

whileis handig in scenario’s waarin de verbreekvoorwaarde niet logisch afhankelijk is van een bepaalde volgorde. Denk bijvoorbeeld aan onvoorspelbare interacties:

while user_is_sleeping():
     wait()

Natuurlijk zou je zoueen geschikte iterator kunnen schrijven om die actie in te kapselen en toegankelijk te maken via for– maar hoe zou dat de leesbaarheid ten goede komen?¹

Gebruik in alle andere gevallen in Python for(of een geschikte functie van hogere orde die de lus inkapselt).

¹ ervan uitgaande dat de functie user_is_sleepingFalseretourneert indien false, kan de voorbeeldcode worden herschreven als de volgende for-lus:

for _ in iter(user_is_sleeping, False):
    wait()

Antwoord 3, autoriteit 19%

De foris de meest pythonische keuze voor het herhalen van een lijst, omdat het eenvoudiger en gemakkelijker te lezen is.

Bijvoorbeeld dit:

for i in range(11):
    print i

is veel eenvoudiger en gemakkelijker te lezen dan dit:

i = 0
while i <= 10:
    print i
    i = i + 1

Antwoord 4, autoriteit 6%

Allereerst zijn er verschillen tussen de for-lus in Python en in andere talen.
Terwijl het in python een lijst met waarden herhaalt (bijvoorbeeld: voor waarde in [4,3,2,7]), werkt het in de meeste andere talen (C/C++, Java, PHP enz.) als een while-lus, maar gemakkelijker om te lezen.

For-lussen worden over het algemeen gebruikt wanneer het aantal iteraties bekend is (bijvoorbeeld de lengte van een array), en terwijl lussen worden gebruikt wanneer u niet weet hoe lang het duurt (bijvoorbeeld de bubble sortalgoritme dat doorloopt zolang de waarden niet gesorteerd zijn)


Antwoord 5, autoriteit 4%

Overweeg het verwerken van iterables. Je kunt het doen met een forlus:

for i in mylist:
   print i

Of je kunt het doen met een while-lus:

it = mylist.__iter__()
while True:
   try:
      print it.next()
   except StopIteration:
      break

Beide codeblokken doen in wezen hetzelfde op in wezen dezelfde manier. Maar de for-lus verbergt het maken van de iterator en de afhandeling van de StopIteration-uitzondering, zodat u ze niet zelf hoeft af te handelen.

De enige keer dat ik me kan bedenken dat je een while-lus zou gebruiken om een iterable af te handelen, zou zijn als je om de een of andere reden rechtstreeks toegang moet krijgen tot de iterator, b.v. onder bepaalde omstandigheden moest u items in de lijst overslaan.


Antwoord 6, autoriteit 4%

voorloops wordt gebruikt
wanneer u definitieve iteratieheeft (het aantal iteraties is bekend).

Voorbeeld van gebruik:

  • Herhaal door een lus met een bepaald bereik: for i in range(23):.
  • Herhaal door collecties (string, lijst, set, tuple, woordenboek): for book in books:.

terwijllus is een onbepaalde iteratiedie wordt gebruikt wanneer een lus wordt herhaald
onbekend aantal keren en eindigen wanneer aan een voorwaardeis voldaan.

Merk op dat in het geval van een while-lus het ingesprongen lichaam van de lus ten minste één variabele in de testconditie moet wijzigen, anders is het resultaat een oneindige lus.

Voorbeeld van gebruik:

  • De uitvoering van het codeblok vereist dat de gebruiker de opgegeven invoer invoert: while input == specified_input:.

  • Als je een voorwaarde hebt met vergelijkingsoperatoren: while count < limit and stop != False:.

Referenties: Voor Loops Vs. While Loops, Udacity Data Science, Python.org.


Antwoord 7, autoriteit 3%

For-lussen maken het meestal duidelijker wat de iteratie doet. Je kunt ze niet altijd direct gebruiken, maar meestal kan de iteratielogica met de while-lus in een generatorfunctie worden gewikkeld. Bijvoorbeeld:

def path_to_root(node):
    while node is not None:
        yield node
        node = node.parent
for parent in path_to_root(node):
    ...

In plaats van

parent = node
while parent is not None:
    ...
    parent = parent.parent

Antwoord 8

Als uw gegevens vuil zijn en het niet werkt met een for-lus, moet u uw gegevens opschonen.


Antwoord 9

while loop is beter voor normale loops
for loop is veel beter dan while loop bij het werken met strings, zoals lijsten, strings etc.

Other episodes