Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: MaBo 26. 10. 2021, 21:43:22

Název: Správný zápis funkce v Pythonu
Přispěvatel: MaBo 26. 10. 2021, 21:43:22
Omlouvám se za dotaz začátečníka:
tohle funguje:

Kód: [Vybrat]
>>> def test(a):
...     print(a*a)
...

Tohle v .py souboru nefunguje(PyCharm):

Kód: [Vybrat]
def test(a):
    print(a * a)

Proč?
Moc díky za pomoc.
M.
Název: Re:správný zápis funkce v pythonu
Přispěvatel: _Jenda 26. 10. 2021, 22:02:03
Mně to funguje. Bude potřeba napsat co znamená nefunguje.
Kód: [Vybrat]
~> cat /tmp/a.py
def test(a):
    print(a * a)

test(666)
~> py3 /tmp/a.py
443556
~>
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 26. 10. 2021, 22:18:15
./testdef.py
./testdef.py: řádek 1: chyba syntaxe poblíž neočekávaného tokenu „(“
./testdef.py: řádek 1: `def test(a):'

Někde hold dělám chybu, ale nevím kde.
M.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 26. 10. 2021, 22:30:22
Jak to spoustis?
Ta hlaska vypada jako by to zkousel interpretovat shell(nebo cmd na windows) misto pythonu.

Mozna bude potreba pridat na zacatek souboru shebang (https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take (https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take))

nebo spoustet python a predat mu ten soubor jako argument a ne spoustet primo ten script.

edit: aha koukam pycharm... to by asi melo bejt chytry... ale stejne... jak to teda poustis?
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 26. 10. 2021, 22:36:32
mám tam
#!/usr/bin/python3

Je to ubuntu 20.10

buď
python testdef.py

nebo
./testdef.py


Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 26. 10. 2021, 23:00:57
Jestli dobre ctu tu chybu tak to rika, ze na radku 1 mas "def test(a):" tak kde mas to #!/usr/bin/python3?

a je na te ceste opravdu ten python?
co vypise: "/usr/bin/python3 --version"?

a co "python --version"?
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 26. 10. 2021, 23:19:05
sh -vx ./testdef.py
#!/usr/bin/env python3
def test(a):
./testdef.py: 2: Syntax error: "(" unexpected
a není výstup, ale když zkusím mimo def x(), např. níže uvedené, tak to funguje

a = input("Zadej délku strany čtverce: ")
a = float(a)
o = a * 4
S = a ** 2
print("Obvod čtverce: ", o)
print("Obsah čtverce: ", S)

Jde o to, že neumím zprovoznit funkci.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: strojar 27. 10. 2021, 07:34:31
To by moh bejt bordel v odsazení.
Chtělo by to vidět tu funkci v kontextu okolo.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 08:39:58
Funkce je v poradku.
problem je ta exekuce.... ted sem to vyzkousel
Mam soubor testdef.py
Kód: [Vybrat]
#!/usr/bin/python
def test (a):
    print (a * a)

test (5)

a tady vystup z konzole:
Kód: [Vybrat]
[lstpr@mframe tmp]$ sh -vx testdef.py
#!/usr/bin/python
def test (a):
testdef.py: line 2: syntax error near unexpected token `('
testdef.py: line 2: `def test (a):'
[lstpr@mframe tmp]$ python testdef.py
25
[lstpr@mframe tmp]$ chmod u+x testdef.py
[lstpr@mframe tmp]$ ./testdef.py
25
[lstpr@mframe tmp]$

Kdyz to spoustis tim sh -vx tak to ignoruje ten shebang.

Kdyby to byla chyba v tom pythonu tak to vypada trochu jinak. Napriklad:
Kód: [Vybrat]
  File "/home/lstpr/tmp/./testdef.py", line 2
    def test [a]:
             ^
SyntaxError: invalid syntax
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 08:45:41
/usr/bin/python3 --version
Python 3.9.7
...
python --version
Python 2.7.18

Tady jsou dvě verze, ale protože tomu nerozumím, nevím, jestli je to špatně nebo ne.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 08:54:06
/usr/bin/python3 --version
Python 3.9.7
...
python --version
Python 2.7.18

Tady jsou dvě verze, ale protože tomu nerozumím, nevím, jestli je to špatně nebo ne.
Je to v poradku.
python 3 prinesl nejaky nekompatibilni zmeny takze spousta systemu potrebuje obe verze.

Zkus tomu souboru pridat to pravo na spusteni "chmod u+x testdef.py" a spustit ho primo "./testdef.py"
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 09:00:41
Nastavil jsem tedy chmod u+x testdef.py  a v bash žádný výstup. Už před tím jsem to ale udělal i ručně a nemá to na exekuci žádný vliv.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: A.P.Hacker 27. 10. 2021, 09:27:14
kdybeste nam ukazal cely soubor, tak by byl problem davno vyresen.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: _Jenda 27. 10. 2021, 09:50:05
sh -vx ./testdef.py
Tohle znamená, že to spouštíš shellem, nikoli Pythonem. sh je úplně jiný programovací (skriptovací) jazyk a funkce se v něm nedefinují pomocí def a dvojtečky na konci, takže to samozřejmě nefunguje.
Nastavil jsem tedy chmod u+x testdef.py  a v bash žádný výstup.
Pokud je v tom souboru jenom definice funkce, ale žádný příkaz co by tu funkci spouštěl/co by něco vypisoval, tak logicky žádný výstup nebude.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 10:12:00
Ten soubor je
#!/usr/bin/python
def test (a):
    print (a * a)

exekuci provádím ./testdef.py. Čekal jsem, že se odřádkuje a já napíšu např.  test(55) a vyjde výstup, ale dělám to asi špatně. Jaký je tedy správný postup pro exekuci .py souborů v bash?
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: Aodh 27. 10. 2021, 10:25:49
Zruš mezeru mezi test a (5)
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 10:39:12
Zkoušel jsem zadat do tohotéž souboru i jiný z netu ukradený zdroják funkce, třeba
#!/usr/bin/python
def mocnina(m, n=3):
       print(m**n)

a po ./testdef.py se nic neděje.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: Petr Klejch 27. 10. 2021, 10:47:45
Zkoušel jsem zadat do tohotéž souboru i jiný z netu ukradený zdroják funkce, třeba
#!/usr/bin/python
def mocnina(m, n=3):
       print(m**n)

a po ./testdef.py se nic neděje.
Protoze jsi tu funkci definoval, ale nezavolal.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 10:50:56
Díky, a jak ji mám zavolat?
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 10:56:19
...
 Čekal jsem, že se odřádkuje a já napíšu např.  test(55) a vyjde výstup, ale dělám to asi špatně.
...

Tohle je chybne ocekavani...
bud si pustim python repl kam muzu psat to volani: python
nebo pustim program ktery je v souboru: python testdef.py
ale pak to jen probehne program a nic se nepocita/nezavola... protoze tam neni volani...

To co cekas se da udelat pomoci: python -i testdef.py

Coz znamena: spust mi python repl a naimportuj kod ze souboru testdef.py

Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 11:00:21
Díky, a jak ji mám zavolat?

volani funkce je to: test(55) co chces psat rucne... muze to byt i primo v tom souboru:
Kód: [Vybrat]
#!/usr/bin/python

def test (a):
    print (a * a)

test (55) # <- tohle je volani
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 11:10:40
Moc díky listoper a vlastně všem za pomoc. Psal jsem tu funkci špatně a nikde jsem se tohle nedočetl. To
#!/usr/bin/python3
def test(a):
       print(a * a)
test(55)

i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo? Opravdu moc se omlouvám za ty dotazy; v manuálech na netu jsem se nic z toho, co jste tu napsali, nedočetl.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: _Jenda 27. 10. 2021, 11:24:29
i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo?
Můžeš na začátek napsat
Kód: [Vybrat]
#!/usr/bin/env -S python3 -inebo
Kód: [Vybrat]
#!/usr/bin/python3 -iNicméně je to velmi nestandardní a nikdo to nedělá. Normálně se tohle řeší tak, že si pustíš ideálně ipython (což lidi používají mnohem raději než vestavěný REPL bez funkcí) a napíšeš from testdef import test.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 11:37:04
Moc díky listoper a vlastně všem za pomoc. Psal jsem tu funkci špatně a nikde jsem se tohle nedočetl. To
#!/usr/bin/python3
def test(a):
       print(a * a)
test(55)

i python -i testdef.py funguje. Jak mám tedy napsat fci v .py souboru, abych mohl v bash po ./tesdef.py zadat do test(...) libovolné číslo? Opravdu moc se omlouvám za ty dotazy; v manuálech na netu jsem se nic z toho, co jste tu napsali, nedočetl.

Ty chces v bash zavolat fukci kterou mas definovanou v pythonu....
Myslim, ze tvuj zivot bude jednodussi kdyz to chtit nebudes  ;)

Myslim, ze jsou lepsi cesty....

Co treba takhle:
Kód: [Vybrat]
#!/usr/bin/python
import sys

def test (a):
    return (a * a)

if __name__ == "__main__":
    arg = sys.argv [1]
    print(test (int (arg)))


pak to muzu volat z bash takhle:
Kód: [Vybrat]
./testdef.py 5
a 5 vymen za libovolne cislo...
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 12:27:20
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit

if __name__ == "__main__":
    arg = sys.argv [1]
    print(test (int (arg)))

Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: uetoyo 27. 10. 2021, 12:49:38
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit

if __name__ == "__main__":
    arg = sys.argv [1]
    print(test (int (arg)))

Pokud voláš modul jako program, pak je podmínka splněna a spustí se ten blok. Bežně se to tedy používá, pokud chceš aby modul fungoval i jako program. V podstatě tak funguje dost balíků/modulů v zakladní knihovně. Např. modul `venv`, který by ses určitě měl naučit používat. Python spustí modul venv a předá mu parametr `virtual_env_name`.

```
python -m venv virtual_env_name
``` 

Mrkni třeba tady:  https://github.com/python/cpython/blob/82a662e5216a9b3969054c540a759a9493468510/Lib/venv/__init__.py#L503

a dokumentace https://docs.python.org/3/library/__main__.html
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 13:00:11
uetoyo:
Tak tímhle jsem měl začít. Škoda, že tohle není popsáno v manuálech hned v lekcích o zápisech funkcí.
Moc díky.
Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: listoper 27. 10. 2021, 13:05:02
Moc díky listoper! Opravdu moc.
Takže jestli to správně chápu, tak musím nastudovat, jak vlastně python iniciuje skripty; zatím o tom vím kulový. Ale jestli máš ještě čas, mohl bys mi vysvětlit

if __name__ == "__main__":
    arg = sys.argv [1]
    print(test (int (arg)))

uetoyo to rika dobre.
Zkusim to vysvetlit jeste selsky...
Tohle if __name__ == "__main__": rika pokud je tenhle soubor spustenej jako program a ne treba importnutej nejakym jinym souborem....

Diky tomu ze to tam napises muzes tehle soubor primo spustit, ale i importovat jinym programem ktery chce taky pouzit funkci test....
Protoze v tom pripade ten vyraz bude false a:
Kód: [Vybrat]
    arg = sys.argv [1]
    print(test (int (arg)))
se nevykona takze tam zustane jen ta definice te funkce... a ne nejake nechtene vypisy na stdout

Název: Re:Správný zápis funkce v Pythonu
Přispěvatel: MaBo 27. 10. 2021, 13:36:09
listoper:
Neocenitelné rady. Díky.