Smí být argument funkce seznam? – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Smí být argument funkce seznam? – Python – Fórum – Programujte.comSmí být argument funkce seznam? – Python – Fórum – Programujte.com

 

Arthas
~ Anonymní uživatel
6 příspěvků
28. 1. 2013   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 78.80.240.–
KIIV
~ Moderátor
+43
God of flame
28. 1. 2013   #2
-
0
-

prekvapilo by me kdyby to python neumel... a google prekvapive souhlasi ze to jde

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m4r100
Návštěvník
28. 1. 2013   #3
-
0
-

Nejde z toho uplne pochopit jaky mas problem, ale mozna chces modifikovat ten zasilany seznam a to nejde. Musis z te funkce vracet novy zmodifikovany seznam (a prepsat stary) nebo v argumentu poslat odkaz na dany seznam.

Nahlásit jako SPAM
IP: 94.113.27.–
kocourOggy0
Newbie
28. 1. 2013   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 89.177.70.–
Věčný začátečník nejen v Pythonu.
sputnikone+1
Věrný člen
29. 1. 2013   #5
-
0
-

#4 kocourOggy
No jasný, když to nejde, tak tam prostě prásknem globální proměnou, ať se to hýbe...

Nahlásit jako SPAM
IP: 90.176.68.–
Arthas
~ Anonymní uživatel
6 příspěvků
29. 1. 2013   #6
-
0
-

Díky, pomohlo to ;)

Nahlásit jako SPAM
IP: 78.80.240.–
kocourOggy0
Newbie
31. 1. 2013   #7
-
0
-

#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.

Nahlásit jako SPAM
IP: 89.177.70.–
Věčný začátečník nejen v Pythonu.
sairon0
Newbie
5. 2. 2013   #8
-
+2
-
Zajímavé

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.

Nahlásit jako SPAM
IP: 62.245.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý