» Poradna » Programy

Pythonu - Objasnění chyby

 |   |  Macintosh OS X Chrome 98.0.4758.80

Ahoj, potřebuji objasnit chybu, mám takový kód (jen pro ukázku), funguje a nevrací žádnou chybu.živá ukázka zde:https://www.online-python.com/6UNylo9sMfPokud ale v řádkufor x in range(0, 1):změním počet cyklů třeba na 2for x in range(0, 2):dostanu chybuživá ukázka zde:https://www.online-python.com/voa9JSpetBDokáže někdo zkušený poradit? Děkuji

Mohlo by vás také zajímat

Odpovědi na otázku

avatar
 | Microsoft Windows 10 Firefox 91.0

V cyklu nesmis menit promennou cyklu. Protoze delas cyklus s promennou "x", nesmis tam mit "x += 1"

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 91.0

Jinak tam mas jeste dalsi chyby, ale na to prijdes sam :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 91.0

Jo a tu chybu ti to vraci proto, ze michas spoustu veci dohromady. Mas tam ve tride metodu "data", ale pak te tride nastavis atribut "data" na cislo (coz "vymaze" tu metodu) a nasledne se pokusis volat uz neexistujici metodu "data()".Zkus but trochu kreativnejsi v nazvech promennych, atributu a metod. Kdyz vsechno pojmenujes "data", je v tom hrozny zmatek a vede to k podobnym chybam.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X Chrome 98.0.4758.80

Python nedokáže rozlišit, že volám ClassOne.data() jako metodu, nebo že volám ClassOne.data jako proměnnou?Dyť jsou to dvě rozlišné věci. Děkuji

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Linux Chrome 96.0.4664.45

všechno v pythonu je objekt

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X Chrome 98.0.4758.80

Tak že neexistuje mít v jedné class stejný název pro var i metodu?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 98.0.4758.81

To snad nejde v žádném jazyku, kolidovaly by názvy. Ty musí být dané jednoznačně.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 98.0.4758.80

To není vůbec pravda, můžeš pojmenovat názvem data jak metodu tak proměnnou, musíš ale volat obojí přes instanci požadované třídy, ne pomocí objektu, pak dostaneš chybu.Pro mínuskáře klidně předvedu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 91.0

Tak ja se teda hlasim, me by zajimala ukazka kodu, kde to takhle funguje.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 98.0.4758.80

OK, jak dorazím domů. pošlu link..

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 97.0.4692.99

Nevim, jestli jsem to pochopil, ale proc by to nemelo jit?class one: data=1 def __init__(self): self.data() def data(self): self.data=2class two: def __init__(self,one): self.one = one self.data() def data(self): return self.one.dataone = one()two = two(one)for x in range ( 0, 3): print(two.data())

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 97.0.4692.99
 | Microsoft Windows 10 Chrome 98.0.4758.81

Zkus si zavolat one.data()

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 97.0.4692.99

? Chová se to dle ocekavani, objekt byl sice přepsan, ale trida splnila bez chyby to co mela. Nebo jsem to nepochopil.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 98.0.4758.81

Jde o to, ze to nefunguje zaroven.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 98.0.4758.81

No právě, v Pythonu nedělám, ale taky se mi to moc nezdá. Sice to asi prošlo, neřval že je chyba, ale korektní to asi nebude. Něco jako kdysi ve starém Céčku (a stále to některý kompilátor "pustí"):if (x=5)...dnes už na to často kompilátory řvou, alespoň varováním když už ne chybou. Ale staré Céčko to prostě zkompilovalo tak, že proměnné x "správně" přiřadilo hodnotu 5, pak došlo k VŽDY k vyhodnocení podmínky jako TRUE. Jo, taky se to v podstatě chová podle očekávání, kompilátor to pustil, ale korektní to není.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 98.0.4758.81

Na tom co napsal dedek ani neni nic nekorektniho, v Pythonu jde libovolne prepisovat promenne, jenom to pak muze vest k chybam, proto je mnohem lepsi mit to pojmenovane prehledne.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 98.0.4758.81

Že to "neřve" neznamená že je to korektní, právě kvůli tomu že si v tom člověk může nadělat "bordel".

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X Chrome 98.0.4758.80

Děkuji za cennou informaci, na výsledek to ale nemá žádný vliv, chyba je tam stejná a nevím proč.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Linux Firefox 96.0

Tri veci:0. Nechapes jak funguje "for x in range...", neni nutne nastavovat x=0 nebo jej rucne inkrementovat1. Trida v ramci sebe sama referencujes pomoci "self" tj. "ClassOne.data=2" -> "self.data=2"2. Nerozlisujes mezi tridou a objektem co je instanci te tridy

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X Chrome 98.0.4758.80

Já nechci vytvářet instanci té třídy, chci volat jen metody té třídy, proto nepoužívám self.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 99.0.4844.0

To už chce talent takhle zmršit takhle jednoduchý kód....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Android Chrome 98.0

Ten kód vůbec nedává smysl, zřejmě vůbec nevíš, jak fungují třídy. Bohužel z toho nevyčtu, čeho chceš dosáhnout, takže ti nemůžu moc pomoct. Máš tam ale pár zásadních chyb.
Máš pojmenovaný parametr stejně jako funkci (data vs data()), tomu se vyhýbej, mimo jiné to je důvod, proč to vyhazuje chybu.
Pokud se chceš uvnitř třídy odkazovat na její vlastní parametr nebo funkci, používá se výhradně self.něco, ne název třídy, tím totiž pokaždé vytváříš novou.
Tady máš příklad jednoduché třídy, třeba ti to trochu vyjasní jejich fungování.
https://www.online-python.com/0TzPtZ2UFc

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Objasnění, Živá ukázka, Ukázka