Yucon schreef op vrijdag 20 november 2020 @ 16:57:
[...]
Oh, ik ga echt niet happen hoor

Ik kan namelijk geen moment zitten met veranderingen. Sterker nog, ik juich veranderingen en verbeteringen toe maar dan wel als ze echt duidelijk voordeel hebben.
Die for/else vind ik helemaal niet makkelijker dan zo'n vlaggetje. Eerder ingewikkelder. Dus dan vind ik het niet zo sterk om het toe te voegen tenzij ik een reden over het hoofd zie.
C++:
1
2
3
4
5
6
7
8
9
| int i = 0;
while(i<10) {
doiets(i);
i++;
}
///////
for(int i=0; i<10; i++) {
doiets(i);
} |
De for in C/C++ vind ik helemaal niet makkelijker dan while. Eerder ingewikkelder. Dat is zo ongeveer wat je zegt. Zelfde idee, je maakt iets leesbaarder en verkleint hopelijk de kans op fouten.
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| found = False
for item in whatever:
if item == "degoeie":
doiets(item)
found = True
break
if not found:
print("Niet gevonden")
#######
for item in whatever:
if item == "degoeie":
doiets(item)
break
else:
print("Niet gevonden") |
Ik vind dit laatste qua leesbaarheid een stuk beter. Je vindt dat misschien in eerste instantie niet omdat je het niet eerder gezien hebt en niet kent uit andere talen, en dat wordt op de een of andere manier op Python geprojecteerd als "verkeerd". Gelukkig zijn verschillende talen verschillend.
Late edit: in zowel het while-voorbeeld als de for met found introduceer je een variabele (i / found) buiten de scope van de loop, waardoor niet per se 100% duidelijk is dat deze onlosmakelijk van elkaar verbonden horen te zijn. Ook kunnen die elders in de code ook al in gebruik kan zijn met eventueel een andere betekenis, waarvan je potentieel de waarde overschrijft, en blijven deze variabelen na de loop ook nog bestaan. In de C++-for declareer je i binnen de scope van de loop (tenminste, dat hoor je te doen) waardoor een eventueel reeds bestaande variabele gewoon genegeerd wordt, en die in de loop-scope verdwijnt ook weer als de loop klaar is. Als je meerdere soortgelijke whiles in dezelfde scope hebt blijft de i-variabele na de eerste declaratie gewoon bestaan en kan je met verkeerd copy/pasten de initializer vergeten mee te kopiëren, die staat namelijk op een andere regel, terwijl de code wel compileert maar niet doet wat je wilt. In het geval van Python zijn er überhaupt geen declaraties dus qua code is er geen verschil tussen een nieuwe en een hergebruikte variabele. Met een for/else is heel de found-variabele niet nodig en heb je dus ook niet de kans dat je een bestaande variabele met dezelfde naam per ongeluk overschrijft.[/edit]
En else if heeft op zich wel denkbare toepassingen. Meestal zie ik het echter gebruikt worden als een tweede if waarbij een tweede voorwaarde gecheckt wordt. Eentje die in de praktijk niet zal optreden als al aan de eerste voldaan is, maar tegelijkertijd ook weer zonder dat het belangrijk is dat die eerste niet optreedt omdat dat eigenlijk toch niet mogelijk is.
iets als
if kleur = rood dan 123
elseif kleur = blauw dan 456
pragmatisch gezien is
if kleur = rood dan 123
if kleur = blauw dan 456
precies evengoed.. alleen theoretisch iets minder performance door die tweede check.
Dit heeft echt helemaal niks met performance te maken, en je voorbeeld is fout. Pragmatisch gezien is het hetzelfde als
code:
1
2
| if kleur = rood dan 123
if kleur != rood and kleur = blauw dan 456 |
Dat is dus een hoop meer typwerk waarin fouten kunnen voorkomen, zeker als je de check op rood eens wilt vervangen door groen en dat bij de tweede check vergeet. Als je dan ook nog checks op groen, paars, geel, oranje, wit en zwart wilt zit je al gauw tegen een ontzettend lelijke bult code aan te kijken, waar elseif-jes het leesbaar houden. En dan heb ik het nog niet eens gehad over het veranderen van de kleur-variabele in een van de bodies. Een ander voorbeeld is deze:
code:
1
2
| if aantal < 123 dan kleur = rood
elseif aantal < 456 dan kleur = blauw |
Als je dat pragmatisch hetzelfde beschouwt met "if" in plaats van "elseif" op de tweede regel, gaat er iets flink fout als aantal = 2.
[
Voor 18% gewijzigd door
DataGhost op 26-11-2020 16:35
]