Ahoj, jsem začátečník v pythonu 2.7 a snažím se vytvořit program pomocí funkcí, který ze seznamu odebere určitá čísla. Je možné seznam poslat funkci jako argument? Podle mě s tím nějak nejde pracovat.
Fórum › Python
Smí být argument funkce seznam?
Jak už zde bylo zmíněno, seznam může sloužit jako argument. Samotný seznam však můžeš uvnitř funkce upravit, aniž bys ho používal jako argument a následně z funkce vracel jeho hodnotu pomocí return.
>>> seznam = list(range(10))
>>> def uprav_seznam():
for index in range(len(seznam)):
seznam[index] += 10
>>> seznam
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> uprav_seznam()
>>> seznam
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Seznam je vlastně taková globální proměnná, kterou můžeš číst i přepisovat uvnitř funkce.
#5 sputnikone
Jestli jsem poradil špatně, tak se omlouvám. Samozřejmě se to dá napsat i bez upravování globální proměnné uvnitř funkce. Stačí vytvořit kopii seznamu, který chceš upravit.
>>> def uprav_seznam(seznam):
kopie_seznamu = seznam[:]
for i in range(len(kopie_seznamu)):
kopie_seznamu[i] += 10
return kopie_seznamu
>>> seznam_1 = list(range(10))
>>> seznam_2 = list(range(5))
>>> seznam_1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> seznam_2
[0, 1, 2, 3, 4]
>>> seznam_1 = uprav_seznam(seznam_1)
>>> seznam_2 = uprav_seznam(seznam_2)
>>> seznam_1
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> seznam_2
[10, 11, 12, 13, 14]
Jenom mi vrtá hlavou, co je na upravování globální proměnné uvnitř funkce špatného. Nevidím důvod, proč bych měl vytvářet kopii seznamu a posléze ještě vracel její hodnotu, když to jde upravit ve funkci přímou cestou. V tento okamžik se dá funkce použít na přepsání, kteréhokoliv seznamu (pokud tedy bude obsahovat čísla), ale takhle by to fungovalo i v předchozím příspěvku, kdybych u něj také použil argument.
Rozhodně není pravda, že se seznam implicitně chová jako globální proměnná! Je pravda, že v Pythonu se chová scope v porovnání s jinými jazyky trochu jinak a i proměnné definované v rámci modulu jsou 'vidět' i ve funkcích, ale to pouze za předpokladu, že dále ve funkci neinicializujeme lokální proměnnou se stejným jménem. Pokud ve funkci vytvoříme proměnnou se stejným jménem, už s původní "globální" nic společného nemá, pokud opravdu není globální díky statementu global. V tvých příkladech se pak kód chová "slušně" jen díky tomu, že nepracuješ s primitivním datovým typem a operuješ nad objektem definovaným v rámci modulu, pokud bys chtěl do proměnné například přiřadit jinou hodnotu, už se bez global neobejdeš.
Ohledně toho, co je na tom špatné: dnes se už od začátku programátorům vtlouká do hlavy, že jsou globální proměnné špatné. Prvním důvodem je nečitelnost, druhým důvodem je větší náchylnost k bugům. V případě kódu, který jsi tu uvedl ty, to pak platí dvojnásob. Pokud by už obsah seznamu nebyl znova potřeba, rozhodně bych byl alespoň pro první snippet s předáním seznamu jako argumentu funkce.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Předávání pole jako argument funkce — založil shamania
Python vs C++ argument passing — založil Stampl
Volanie ľubovolného počtu funkcií cez argument inej funkcie. — založil Task1337
Volání funkce z jiné třídy ukazatelem typu obecné funkce — založil pretis
Moderátoři diskuze