Riesili sme tu s kolegami jeden priklad, ktory na prvy pohlad bol syntakticky
nespravne. Potom som na neho narazil na
http://docs.python.org/tut/node6.html#SECTION006400000000000000000 a z
dokumentacie som zistil, ze je dokonca syntakticky spravne.
Tak som sa s for-else chcel zoznamit a tak som si vytvoril 3 testcase:
# cyklus sa vykona
for x in 'a':
pass
else:
print "test1"
# cyklus sa vykona a breakne
for x in 'a':
break
else:
print "test2"
# cyklus sa nevykona
for x in '':
pass
else:
print "test3"
Vysledok zodpoveda tomu, co vravi dokumentacia, ale mne to pride zvratene.
Preco to else zavisi na break vo vnutri cyklu a nie na tom, ci sa cyklus
vykonal, alebo nie? Ked totiz na toto narazi niekto, kto sa python uci, tak
sa z toho osype ( pisem prilezitostne v pythone uz 2 roky a je to aj moj
pripad ).
Mozete mi niekto ozrejmit, co tym autor myslel a preco je ta logika postavena
prave takto? Intuicia mi totiz hovori, ze else by sa malo vykonat prave ked
sa nevykona ani jeden priebeh cyklu...
Dik
--
Dusan
0 pruchodu cyklem je typicky OK
predstavme si napr. nejake hledani
for i in nekde:
if nasel(i):
print "Nasel"
break
else:
print "Nenasel"
tohle bude fungovat i pokud nekde bude prazdne
Miloslav Ponkrác
tak se proste else pod for cyklus rovnou.
> _______________________________________________
> Python mailing list
> Pyt...@py.cz
> http://www.py.cz/mailman/listinfo/python
Správně má být slůvko NEJNEPŘEHLEDNĚJŠÍ, ale to asi je jasné
Miloslav Ponkrác
Miloslav Ponkrác
David Michal napsal(a):
Pozor, tohle dela neco uplne jinyho, ekvivalent puvodniho kodu je neco jako:
nasel = False
for i in nekde:
if nasel(i):
print "Nasel"
nasel = True
break
if not nasel:
print 'nenasel'
Me se ta konstrukce docela libi, jenom bych to nenazyval else
Ahoj Supermane,
ohledne necitelnosti Pythonu a citelnosti C; urcite znas:
(* (void(*)( ) ) 0) ( );
autor A. Koenig, ktery k tomu rika: “Takovyhle vyrazy jsou OK, nebojte se jich.”
WTF?!
Stepan
jednak je ten výraz čitelný, jednak ho lze snadno zjednodušit a dále
zčitelnit, a v praxi člověk dbající na čitelnost použije spíš:
typedef void(*prazdna_funkce)();
prazdna_funkce(NULL)();
případně takto:
static_cast<void(*)()>(NULL)();
Nicméně je to výraz, a výraz může dosahovat obstojné složitosti i v
Pythonu a jiných jazycích. Navíc je to výraz, jehož hlavním principem je
přetypování a zachování správného statického typu, což je věc, kterou
srovnávat s Pythonem s dynamickým typováním (za což Python platí
pomalostí) je poněkud pasé. A navíc je to výraz neužitečný, k ničemu, je
vhodný jenom k tomu, abyste uměle vyrobili chybu v programu a operační
systém Vás odstřelil - nic jiného neudělá.
Zatímco tu kritizuji konstrukce Pythonu, a Ty jsou opravdu čím dál více
IMHO vymýšleny k nečitelnosti. Čemuž se nedivím, Python je one man show,
a když si key-man poněkud začne hrát, tak Python má smůlu.
A nezlobte se, základní konstrukce typu podmíněné přiřazení, select a
další jsou v C (a mnoha dalších jazycích) podstatně čitelnější, než v
Pythonu. Ale možná je to tím, že s Rossumem opravdu nesouzním -
například mi hlava nebere, proč Rossum nemá nic proti else po cyklu (v
tom je jedinečný, žádný jiný programovací jazyk neshledal tuto
konstrukci užitečnou a nezbytnou), zatímco proti velmi užitečné
konstrukci select (která je v obrovské spoustě jazyků, vlastně v
naprosté většině) se brání jako zbytečné.
Miloslav Ponkrác
Stepan napsal(a):
Chyba byla u me :)
Stepan