Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[python] for-else -> wtf?

0 views
Skip to first unread message

Dusan Zatkovsky

unread,
Apr 23, 2008, 9:23:14 AM4/23/08
to pyt...@py.cz
DD.

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

Michal Molhanec

unread,
Apr 23, 2008, 9:49:54 AM4/23/08
to Konference PyCZ
Dusan Zatkovsky napsal(a):

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

superman

unread,
Apr 23, 2008, 11:43:29 AM4/23/08
to Konference PyCZ
Já osobně tyto konstrukce používat nebudu. Sice jsem o nich ani nevěděl,
a jak vidím, vůbec to nevadí. Vidím, že "made by Python inventor"
opravdu už začíná poněkud poněkud. Zlaté dobře čitelné Céčko! Zatím jsou
nové konstrukce podmíněného přiřazení v Pythonu a tato konstrukce else
po cyklu mým soukromým kandidátem na najpřehlednější existující zápis ze
všech programovacích jazyků, co jsem za cca 20 let své praxe poznal.

Miloslav Ponkrác

David Michal

unread,
Apr 23, 2008, 11:48:10 AM4/23/08
to Konference PyCZ
Mne se ta konstrukce libi. Nez-li psat neco jako:
if nekde:

for i in nekde:
if nasel(i):
print "Nasel"
break
else:
print 'nenasel'

tak se proste else pod for cyklus rovnou.

> _______________________________________________
> Python mailing list
> Pyt...@py.cz
> http://www.py.cz/mailman/listinfo/python

superman

unread,
Apr 23, 2008, 11:45:33 AM4/23/08
to Konference PyCZ
oprava - ve větě: "Zatím jsou nové konstrukce podmíněného přiřazení v
Pythonu a tato konstrukce else po cyklu mým soukromým kandidátem na
najpřehlednější existující zápis ze všech programovacích jazyků, co jsem
za cca 20 let své praxe poznal."

Správně má být slůvko NEJNEPŘEHLEDNĚJŠÍ, ale to asi je jasné

Miloslav Ponkrác

superman

unread,
Apr 23, 2008, 12:20:51 PM4/23/08
to Konference PyCZ
Já to nikomu neberu, klidně si to používejte do libosti, a vyjádřil jsem
svůj názor, který samozřejmě nevydávám za pravdu (ostatně tady se ani k
pravdě dobrat nejde). Podle mého subjektivního názoru jsou to
konstrukce, která snižují čitelnost programu. Vlastně já už se ani
nesměju, když čtu argumenty pána co vytvořil Python, jak kritizuje C,
Lisp a jeho nečitelnost, jak zamítá jednu syntaxi za druhou, protože je
málo čitelný a vymyslí a prosadí patvar, jehož čitelnost a přehlednost
se blíží k mínus nekonečnu. Ale jak říkám, jde o můj subjektivní názor,
a nedělám si nároky na jeho obecnou platnost.

Miloslav Ponkrác

David Michal napsal(a):

Michal Molhanec

unread,
Apr 24, 2008, 9:17:11 AM4/24/08
to Konference PyCZ
David Michal napsal(a):
> Mne se ta konstrukce libi. Nez-li psat neco jako:
> if nekde:
> for i in nekde:
> if nasel(i):
> print "Nasel"
> break
> else:
> print 'nenasel'

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

David Michal

unread,
Apr 24, 2008, 9:23:20 AM4/24/08
to Konference PyCZ
No jo sakrys, omlouvam se.
David

Stepan

unread,
Apr 24, 2008, 12:29:53 PM4/24/08
to pyt...@py.cz

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

 

 

superman

unread,
Apr 24, 2008, 3:27:59 PM4/24/08
to Konference PyCZ
Ahoj Štěpáne,

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):

Stepan

unread,
Apr 24, 2008, 4:46:24 PM4/24/08
to pyt...@py.cz
diky za konstruktivni odpoved.
Jasne, diskutovat o kvalitach C nema cenu. Jen ten vyraz mi
prisel 'hrube' necitelnej (ma volat program na adrese 0).

Chyba byla u me :)

Stepan

0 new messages