Het weglaten van accolades maakt iets wat in praktisch alle talen irrelevant is, whitespace, opeens wel relevant. Als je per ongeluk (bv omdat je op een andere pc werkt), een tab teken in plaats van 4 spaties oid gebruikt, dan is het indentation level niet meer gelijk en verslikt Python zich erin,
...en als je per ongeluk een accolade of een puntkomma vergeet in een taal als bijv. C krijg je ook een syntax error van de compiler.
of doet dingen die je niet verwacht.
Zoals?
Hetzelfde geldt waarschijnlijk ook (al heb ik dit niet getest) voor newline characters die op Windows \r\n moeten zijn en op Unix slechts \n. Als je dit mixt boeit het voor de compilers van andere talen helemaal niets, alle whitespace wordt geskipt. In Python kan dat dan weer onverwachte resultaten geven.
Python kan gewoon omgaan met een mix van LF en CR+LF.
(Ik gebruik hier expres niet \n, omdat de betekenis hiervan context-afhankelijk is. Zo is bijv. \n gedefinieerd als een newline in C, niet als linefeed.)Het weglaten van de puntkomma aan het einde van elk statement doet wederom hetzelfde; ik moet trucjes met line continuation characters doen om mijn statement over meerdere regels te splitsen om het leesbaar te houden.
Dan zijn je regels te lang. Daarnaast zijn er bepaalde constructies in Python die geen eens line continuation characters nodig hebben (namelijk de constructies die (), [] en {} gebruiken).
De mogelijkheid om strings te enclosen in dubbele of enkele aanhalingstekens maakt het minder overzichtelijk en resulteert in code die door meerdere personen geschreven wordt in gebrek aan consistentie.
Die mogelijkheid stelt je in mijn ogen juist in staat om overzichtelijkere code te schrijven aangezien je escaping in bepaalde gevallen kunt ontwijken. In het volgende voorbeeld hoef ik in Python niets te escapen: 'deze Python string bevat "quotes" die niet geëscapet hoeven te worden'.
In C++ geeft dit duidelijk het verschil tussen characters en strings aan.
En Python koos ervoor om geen chars te hebben. Guido vond dat je daarvoor strings ter lengte 1 kon gebruiken.
En waar zijn essentiele operators zoals ++ en -- in Python (zowel prefix als postfix)?
Die zijn niet essentieel. Als je in Python iets wilt verhogen, dan gebruik je +=1.
Waarom is de syntax van de ternary operator in Python zo ondoorzichtig en tegenintuitief?
Wat is er niet intuitief aan het volgende?
print x/y if y != 0 else 'Cannot divide'
(Lees het eens hardop voor)
Waarom moet in een taal, die claimt leesbaarheid van de code voorop te hebben staan, elseif of else if, vervangen worden door elif?
Je hebt dan zeker ook problemen met het kunnen lezen van #elif van de C preprocessor?

Waarom moet er een dubbele punt voor een block staan als de indentation al genoeg is?
Staat in de Python FAQ.
Dan hadden ze net zo goed accolades kunnen gebruiken, dan was het einde tenminste ook zichtbaar.
Je kan het einde toch zien als je een stuk code tegenkomt dat minder ver is ingesprongen?
Waarom is na 10 jaar van invoering, unicode nog steeds niet het standaard string type maar moet je er nog steeds een u voorzetten om je upper en lower functies goed te laten werken? Granted, dit is in C++ ook niet zo, maar dit zou juist een van de sterke punten van een nieuwe high-level programmeertaal moeten zijn.
Python 3Ook is de invloed die je hebt op wanneer variabelen en object gekopiëerd worden veel te beperkt in Python, tov C++ waarin je door middel van pointers dan wel references daar volledige controle over hebt en je dus nooit voor verassingen komt te staan.
Het model van Python is echter heel simpel. Alle variabelen verwijzen naar een object en alleen verwijzingen worden gekopieerd (bij assignment en function calls).
En dan is bijvoorbeeld al een functie copy om dictionaries in Python te kopieren, maakt die weer alleen een kopie van de dictionary zelf, maar de values blijven naar dezelfde dingen wijzigen zodat de kopie nog steeds niet onafhankelijk is van het origineel. Nee, dan moet je er weer een extra package bijhalen om een deepcopy te maken.
Als je deepcopy nodig hebt, dan denk ik dat je opnieuw naar je probleem of je programmeerstyle moet kijken. Probeer bijv. een oplossing te vinden die functioneler van aard is.
Zo kan ik nog wel even doorgaan, maar mijn punt is wel duidelijk denk ik. Dingen die C++ juist zo onzettend handig maken missen gewoon van Python. Over C# kan ik weinig zeggen, hier heb ik me nog nooit aan gewaagd.
Dingen die Python zo ontzettend handig maken mis ik daarentegen in C++.

Ik heb op zich niets tegen scripttalen of andere high-level talen, maar je hoort regelmatig dat ze de heilige graal van het programmeren zijn en daar ben ik het niet mee eens; het is heel erg een kwestie van smaak en ook van toepassingsgebied.
C++ heeft zeker een toepassingsgebied, maar dat gebied is lang niet meer zo groot als het vroeger was. De kracht van andere high level talen is juist dat je geen/minder rekening hoeft te houden met low level details waar je in bijv. C++ wel rekening mee moet houden.
Overigens kun je in C++ ook functies behandelen als variabele (zij het van type pointer).
Voor de introductie van lambda's waren functies in C++ nou niet echt bepaald first-class citizens. Hoe zou je de volgende Python functie implementeren in C++ zonder C++0x's lambda's?
compose = lambda f, g: lambda x: f(g(x))C++ doet echter wel garanties over de argumenten die deze variabele moet accepteren, terwijl Python dat niet doet.
Python is dan ook wat dynamischer ingesteld dan C++. C++ is meer gericht op het geven van statische garanties, terwijl Python flexibeler probeert te zijn door deze niet te geven. Het flexibelere aspect is niet geheel zonder gevaar, maar er zijn ook onveilige dingen in C++ te vinden (die niet in Python voorkomen) waarbij de compiler je ook geen statische garantie kan geven.
Tuples als return type zijn wel handig, maar in principe kan je daar in C++ net zo goed een vector oid voor gebruiken.
Tuples zijn hier in Python vooral handig i.c.m. unpacking. Zonder unpacking zou het minder aangenaam zijn geweest.
[Reactie gewijzigd door RayNbow op 2 augustus 2024 22:39]