learnxinyminutes-docs/cs-cz/python3.html.markdown
Tomas Bedrich f31f35a32e Functions
2015-09-09 17:09:18 +02:00

665 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
language: python3
contributors:
- ["Louie Dinh", "http://pythonpracticeprojects.com"]
- ["Steven Basart", "http://github.com/xksteven"]
- ["Andre Polykanine", "https://github.com/Oire"]
- ["Tomáš Bedřich", "http://tbedrich.cz"]
translators:
- ["Tomáš Bedřich", "http://tbedrich.cz"]
filename: learnpython3.py
---
Python byl vytvořen Guidem Van Rossum v raných 90. letech. Nyní je jedním z nejpopulárnějších jazyků.
Zamiloval jsem si Python pro jeho syntaktickou čistotu - je to vlastně spustitelný pseudokód.
Vaše zpětná vazba je vítána! Můžete mě zastihnout na [@louiedinh](http://twitter.com/louiedinh) nebo louiedinh [at] [email od googlu] (anglicky).
Poznámka: Tento článek je zaměřen na Python 3. Zde se můžete [naučit starší Python 2.7](http://learnxinyminutes.com/docs/python/).
```python
# Jednořádkový komentář začíná křížkem
""" Víceřádkové komentáře používají tři uvozovky nebo apostrofy
a jsou často využívány jako dokumentační komentáře k metodám
"""
####################################################
## 1. Primitivní datové typy a operátory
####################################################
# Čísla
3 # => 3
# Aritmetické operace se chovají běžným způsobem
1 + 1 # => 2
8 - 1 # => 7
10 * 2 # => 20
# Až na dělení, které vrací desetinné číslo
35 / 5 # => 7.0
# Při celočíselném dělení je desetinná část oříznuta (pro kladná i záporná čísla)
5 // 3 # => 1
5.0 // 3.0 # => 1.0 # celočíselně dělit lze i desetinným číslem
-5 // 3 # => -2
-5.0 // 3.0 # => -2.0
# Pokud použiteje desetinné číslo, výsledek je jím také
3 * 2.0 # => 6.0
# Modulo
7 % 3 # => 1
# Mocnění (x na y-tou)
2**4 # => 16
# Pro vynucení priority použijte závorky
(1 + 3) * 2 # => 8
# Logické hodnoty
True
False
# Negace se provádí pomocí not
not True # => False
not False # => True
# Logické operátory
# U operátorů záleží na velikosti písmen
True and False # => False
False or True # => True
# Používání logických operátorů s čísly
0 and 2 # => 0
-5 or 0 # => -5
0 == False # => True
2 == True # => False
1 == True # => True
# Rovnost je ==
1 == 1 # => True
2 == 1 # => False
# Nerovnost je !=
1 != 1 # => False
2 != 1 # => True
# Další porovnání
1 < 10 # => True
1 > 10 # => False
2 <= 2 # => True
2 >= 2 # => True
# Porovnání se dají řetězit!
1 < 2 < 3 # => True
2 < 3 < 2 # => False
# Řetězce používají " nebo ' a mohou obsahovat UTF8 znaky
"Toto je řetězec."
'Toto je také řetězec.'
# Řetězce se také dají sčítat, ale nepoužívejte to
"Hello " + "world!" # => "Hello world!"
# Dají se spojovat i bez '+'
"Hello " "world!" # => "Hello world!"
# Řetězec lze považovat za seznam znaků
"Toto je řetězec"[0] # => 'T'
# .format lze použít ke skládání řetězců
"{} mohou být {}".format("řetězce", "skládány")
# Formátovací argumenty můžete opakovat
"{0} {1} stříkaček stříkalo přes {0} {1} střech".format("tři sta třicet tři", "stříbrných")
# => "tři sta třicet tři stříbrných stříkaček stříkalo přes tři sta třicet tři stříbrných střech"
# Pokud nechcete počítat, můžete použít pojmenované argumenty
"{jmeno} si dal {jidlo}".format(jmeno="Franta", jidlo="guláš") # => "Franta si dal guláš"
# Pokud zároveň potřebujete podporovat Python 2.5 a nižší, můžete použít starší způsob formátování
"%s se dají %s jako v %s" % ("řetězce", "skládat", "jazyce C")
# None je objekt (jinde NULL, nil, ...)
None # => None
# Pokud porovnáváte něco s None, nepoužívejte operátor rovnosti "==",
# použijte raději operátor "is", který testuje identitu.
"něco" is None # => False
None is None # => True
# None, 0, a prázdný řetězec/seznam/slovník se vyhodnotí jako False
# Vše ostatní se vyhodnotí jako True
bool(0) # => False
bool("") # => False
bool([]) # => False
bool({}) # => False
####################################################
## 2. Proměnné a kolekce
####################################################
# Python má funkci print
print("Jsem 3. Python 3.")
# Proměnné není třeba deklarovat před přiřazením
# Konvence je používat male_pismo_s_podtrzitky
nazev_promenne = 5
nazev_promenne # => 5
# Názvy proměnných mohou obsahovat i UTF8 znaky
název_proměnné = 5
# Přístup k předtím nepoužité proměnné vyvolá výjimku
# Odchytávání vyjímek - viz další kapitola
neznama_promenna # Vyhodí NameError
# Seznam se používá pro ukládání sekvencí
sez = []
# Lze ho rovnou naplnit
jiny_seznam = [4, 5, 6]
# Na konec seznamu se přidává pomocí append
sez.append(1) # sez je nyní [1]
sez.append(2) # sez je nyní [1, 2]
sez.append(4) # sez je nyní [1, 2, 4]
sez.append(3) # sez je nyní [1, 2, 4, 3]
# Z konce se odebírá se pomocí pop
sez.pop() # => 3 a sez je nyní [1, 2, 4]
# Vložme trojku zpátky
sez.append(3) # sez je nyní znovu [1, 2, 4, 3]
# Přístup k prvkům funguje jako v poli
sez[0] # => 1
# Mínus počítá odzadu (-1 je poslední prvek)
sez[-1] # => 3
# Přístup mimo seznam vyhodí IndexError
sez[4] # Vyhodí IndexError
# Pomocí řezů lze ze seznamu vybírat různé intervaly
# (pro matematiky: jedná se o uzavřený/otevřený interval)
sez[1:3] # => [2, 4]
# Odříznutí začátku
sez[2:] # => [4, 3]
# Odříznutí konce
sez[:3] # => [1, 2, 4]
# Vybrání každého druhého prvku
sez[::2] # =>[1, 4]
# Vrácení seznamu v opačném pořadí
sez[::-1] # => [3, 4, 2, 1]
# Lze použít jakoukoliv kombinaci parametrů pro vytvoření složitějšího řezu
# sez[zacatek:konec:krok]
# Odebírat prvky ze seznamu lze pomocí del
del sez[2] # sez je nyní [1, 2, 3]
# Seznamy můžete sčítat
# Hodnoty sez a jiny_seznam přitom nejsou změněny
sez + jiny_seznam # => [1, 2, 3, 4, 5, 6]
# Spojit seznamy lze pomocí extend
sez.extend(jiny_seznam) # sez je nyní [1, 2, 3, 4, 5, 6]
# Kontrola, jestli prvek v seznamu existuje, se provádí pomocí in
1 in sez # => True
# Délku seznamu lze zjistit pomocí len
len(sez) # => 6
# N-tice je jako seznam, ale je neměnná
ntice = (1, 2, 3)
ntice[0] # => 1
ntice[0] = 3 # Vyhodí TypeError
# S n-ticemi lze dělat většinu operací, jako se seznamy
len(ntice) # => 3
ntice + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
ntice[:2] # => (1, 2)
2 in ntice # => True
# N-tice (nebo seznamy) lze rozbalit do proměnných jedním přiřazením
a, b, c = (1, 2, 3) # a je nyní 1, b je nyní 2 a c je nyní 3
# N-tice jsou vytvářeny automaticky, když vynecháte závorky
d, e, f = 4, 5, 6
# Prohození proměnných je tak velmi snadné
e, d = d, e # d je nyní 5, e je nyní 4
# Slovníky ukládají klíče a hodnoty
prazdny_slovnik = {}
# Lze je také rovnou naplnit
slovnik = {"jedna": 1, "dva": 2, "tři": 3}
# Přistupovat k hodnotám lze pomocí []
slovnik["jedna"] # => 1
# Všechny klíče dostaneme pomocí keys() jako iterátor. Nyní ještě potřebujeme
# obalit volání v list(), abychom dostali seznam. To rozebereme později.
# Pozor, že jakékoliv pořadí klíčů není garantováno - může být různé.
list(slovnik.keys()) # => ["dva", "jedna", "tři"]
# Všechny hodnoty opět jako iterátor získáme pomocí values(). Opět tedy
# potřebujeme použít list(), abychom dostali seznam. Stejně jako
# v předchozím případě, pořadí není garantováno a může být různé
list(slovnik.values()) # => [3, 2, 1]
# Operátorem in se lze dotázat na přítomnost klíče
"jedna" in slovnik # => True
1 in slovnik # => False
# Přístup k neexistujícímu klíči vyhodí KeyError
slovnik["four"] # Vyhodí KeyError
# Metoda get() funguje podobně jako [], ale vrátí None místo vyhození KeyError
slovnik.get("jedna") # => 1
slovnik.get("čtyři") # => None
# Metodě get() lze předat i výchozí hodnotu místo None
slovnik.get("jedna", 4) # => 1
slovnik.get("čtyři", 4) # => 4
# metoda setdefault() vloží prvek do slovníku pouze pokud tam takový klíč není
slovnik.setdefault("pět", 5) # slovnik["pět"] je nastaven na 5
slovnik.setdefault("pět", 6) # slovnik["pět"] je pořád 5
# Přidání nové hodnoty do slovníku
slovnik["čtyři"] = 4
# Hromadně aktualizovat nebo přidat data lze pomocí update(), parametrem je opět slovník
slovnik.update({"čtyři": 4}) # slovnik je nyní {"jedna": 1, "dva": 2, "tři": 3, "čtyři": 4, "pět": 5}
# Odebírat ze slovníku dle klíče lze pomocí del
del slovnik["jedna"] # odebere klíč "jedna" ze slovnik
# Množiny ukládají ... překvapivě množiny
prazdna_mnozina = set()
# Také je lze rovnou naplnit. A ano, budou se vám plést se slovníky. Bohužel.
mnozina = {1, 1, 2, 2, 3, 4} # mnozina je nyní {1, 2, 3, 4}
# Přidání položky do množiny
mnozina.add(5) # mnozina je nyní {1, 2, 3, 4, 5}
# Průnik lze udělat pomocí operátoru &
jina_mnozina = {3, 4, 5, 6}
mnozina & jina_mnozina # => {3, 4, 5}
# Sjednocení pomocí operátoru |
mnozina | jina_mnozina # => {1, 2, 3, 4, 5, 6}
# Rozdíl pomocí operátoru -
{1, 2, 3, 4} - {2, 3, 5} # => {1, 4}
# Operátorem in se lze dotázat na přítomnost prvku v množině
2 in mnozina # => True
9 in mnozina # => False
####################################################
## 3. Řízení toku programu, cykly
####################################################
# Vytvořme si proměnnou
promenna = 5
# Takto vypadá podmínka. Na odsazení v Pythonu záleží!
# Vypíše "proměnná je menší než 10".
if promenna > 10:
print("proměnná je velká jak Rusko")
elif promenna < 10: # Část elif je nepovinná
print("proměnná je menší než 10")
else: # Část else je také nepovinná
print("proměnná je právě 10")
"""
Smyčka for umí iterovat (nejen) přes seznamy
vypíše:
pes je savec
kočka je savec
myš je savec
"""
for zvire in ["pes", "kočka", "myš"]:
# Můžete použít formát pro složení řetězce
print("{} je savec".format(zvire))
"""
range(cislo) vrací itarátor čísel od 0 do cislo
vypíše:
0
1
2
3
"""
for i in range(4):
print(i)
"""
range(spodni_limit, horni_limit) vrací itarátor čísel mezi limity
vypíše:
4
5
6
7
"""
for i in range(4, 8):
print(i)
"""
Smyčka while se opakuje, dokud je podmínka splněna.
vypíše:
0
1
2
3
"""
x = 0
while x < 4:
print(x)
x += 1 # Zkrácený zápis x = x + 1. Pozor, žádné x++ neexisuje.
# Výjimky lze ošetřit pomocí bloku try/except(/else/finally)
try:
# Pro vyhození výjimky použijte raise
raise IndexError("Přistoupil jste k neexistujícímu prvku v seznamu.")
except IndexError as e:
print("Nastala chyba: {}".format(e))
# Vypíše: Nastala chyba: Přistoupil jste k neexistujícímu prvku v seznamu.
except (TypeError, NameError): # Více výjimek lze zachytit najednou
pass # Pass znamená nedělej nic - nepříliš vhodný způsob ošetření chyb
else: # Volitelný blok else musí být až za bloky except
print("OK!") # Vypíše OK! v případě, že nenastala žádná výjimka
finally: # Blok finally se spustí nakonec za všech okolností
print("Uvolníme zdroje, uzavřeme soubory...")
# Místo try/finally lze použít with pro automatické uvolnění zdrojů
with open("soubor.txt") as soubor:
for radka in soubor:
print(radka)
# Python běžně používá iterovatelné objekty, což je prakticky cokoliv,
# co lze považovat za sekvenci. Například to, co vrací metoda range(),
# nebo otevřený soubor, jsou iterovatelné objekty.
slovnik = {"jedna": 1, "dva": 2, "tři": 3}
iterovatelny_objekt = slovnik.keys()
print(iterovatelny_objekt) # => dict_keys(["jedna", "dva", "tři"]). Toto je iterovatelný objekt.
# Můžeme použít cyklus for na jeho projití
for klic in iterovatelny_objekt:
print(klic) # vypíše postupně: jedna, dva, tři
# Ale nelze přistupovat k prvkům pod jejich indexem
iterovatelny_objekt[1] # Vyhodí TypeError
# Všechny položky iterovatelného objektu lze získat jako seznam pomocí list()
list(slovnik.keys()) # => ["jedna", "dva", "tři"]
# Z iterovatelného objektu lze vytvořit iterátor
iterator = iter(iterovatelny_objekt)
# Iterátor je objekt, který si pamatuje stav v rámci svého iterovatelného objektu
# Další hodnotu dostaneme voláním next()
next(iterator) # => "jedna"
# Iterátor si udržuje svůj stav v mezi jednotlivými voláními next()
next(iterator) # => "dva"
next(iterator) # => "tři"
# Jakmile interátor vrátí všechna svá data, vyhodí výjimku StopIteration
next(iterator) # Vyhodí StopIteration
####################################################
## 4. Funkce
####################################################
# Pro vytvoření nové funkce použijte def
def secist(x, y):
print("x je {} a y je {}".format(x, y))
return x + y # Hodnoty se vrací pomocí return
# Volání funkce s parametry
secist(5, 6) # => Vypíše "x je 5 a y je 6" a vrátí 11
# Jiný způsob, jak volat funkci, je použít pojmenované argumenty
secist(y=6, x=5) # Pojmenované argumenty můžete předat v libovolném pořadí
# Lze definovat funkce s proměnným počtem (pozičních) argumentů
def vrat_argumenty(*argumenty):
return argumenty
vrat_argumenty(1, 2, 3) # => (1, 2, 3)
# Lze definovat také funkce s proměnným počtem pojmenovaných argumentů
def vrat_pojmenovane_argumenty(**pojmenovane_argumenty):
return pojmenovane_argumenty
vrat_pojmenovane_argumenty(kdo="se bojí", nesmi="do lesa")
# => {"kdo": "se bojí", "nesmi": "do lesa"}
# Pokud chcete, lze použít obojí najednou
# Konvence je používat pro tyto účely názvy *args a **kwargs
def vypis_vse(*args, **kwargs):
print(args, kwargs) # print() vypíše všechny své parametry oddělené mezerou
vypis_vse(1, 2, a=3, b=4) # Vypíše: (1, 2) {"a": 3, "b": 4}
# * nebo ** lze použít k rozbalení N-tic nebo slovníků!
ntice = (1, 2, 3, 4)
slovnik = {"a": 3, "b": 4}
vypis_vse(ntice) # Vyhodnotí se jako vypis_vse((1, 2, 3, 4)) jeden parametr, N-tice
vypis_vse(*ntice) # Vyhodnotí se jako vypis_vse(1, 2, 3, 4)
vypis_vse(**slovnik) # Vyhodnotí se jako vypis_vse(a=3, b=4)
vypis_vse(*ntice, **slovnik) # Vyhodnotí se jako vypis_vse(1, 2, 3, 4, a=3, b=4)
# Viditelnost proměnných - vytvořme si globální proměnnou x
x = 5
def nastavX(cislo):
# Lokální proměnná x překryje globální x
x = cislo # => 43
print(x) # => 43
def nastavGlobalniX(cislo):
global x
print(x) # => 5
x = cislo # Nastaví globální proměnnou x na 6
print(x) # => 6
nastavX(43)
nastavGlobalX(6)
# Funkce jsou first-class objekty
def vyrobit_scitacku(pricitane_cislo):
def scitacka(x):
return x + pricitane_cislo
return scitacka
pricist_10 = vyrobit_scitacku(10)
pricist_10(3) # => 13
# Klíčové slovo lambda vytvoří anonymní funkci
(lambda parametr: parametr > 2)(3) # => True
# Lze použít funkce map() a filter() z funkcionálního programování
map(pricist_10, [1, 2, 3])
# => <map object at 0x0123467> - iterovatelný objekt s obsahem: [11, 12, 13]
filter(lambda x: x > 5, [3, 4, 5, 6, 7])
# => <filter object at 0x0123467> - iterovatelný objekt s obsahem: [6, 7]
# S generátorovou notací lze dosáhnout podobných výsledků, ale vrací seznam
[pricist_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7]
# Generátorová notace funguje i pro slovníky
{x: x**2 for x in range(1, 5)} # => {1: 1, 2: 4, 3: 9, 4: 16}
# A také pro množiny
{pismeno for pismeno in "abeceda"} # => {"d", "a", "c", "e", "b"}
####################################################
## 5. Třídy
####################################################
# We subclass from object to get a class.
class Human(object):
# A class attribute. It is shared by all instances of this class
species = "H. sapiens"
# Basic initializer, this is called when this class is instantiated.
# Note that the double leading and trailing underscores denote objects
# or attributes that are used by python but that live in user-controlled
# namespaces. Methods(or objects or attributes) like: __init__, __str__,
# __repr__ etc. are called magic methods (or sometimes called dunder methods)
# You should not invent such names on your own.
def __init__(self, name):
# Assign the argument to the instance's name attribute
self.name = name
# An instance method. All methods take "self" as the first argument
def say(self, msg):
return "{name}: {message}".format(name=self.name, message=msg)
# A class method is shared among all instances
# They are called with the calling class as the first argument
@classmethod
def get_species(cls):
return cls.species
# A static method is called without a class or instance reference
@staticmethod
def grunt():
return "*grunt*"
# Instantiate a class
i = Human(name="Ian")
print(i.say("hi")) # prints out "Ian: hi"
j = Human("Joel")
print(j.say("hello")) # prints out "Joel: hello"
# Call our class method
i.get_species() # => "H. sapiens"
# Change the shared attribute
Human.species = "H. neanderthalensis"
i.get_species() # => "H. neanderthalensis"
j.get_species() # => "H. neanderthalensis"
# Call the static method
Human.grunt() # => "*grunt*"
####################################################
## 6. Modules
####################################################
# You can import modules
import math
print(math.sqrt(16)) # => 4
# You can get specific functions from a module
from math import ceil, floor
print(ceil(3.7)) # => 4.0
print(floor(3.7)) # => 3.0
# You can import all functions from a module.
# Warning: this is not recommended
from math import *
# You can shorten module names
import math as m
math.sqrt(16) == m.sqrt(16) # => True
# Python modules are just ordinary python files. You
# can write your own, and import them. The name of the
# module is the same as the name of the file.
# You can find out which functions and attributes
# defines a module.
import math
dir(math)
####################################################
## 7. Advanced
####################################################
# Generators help you make lazy code
def double_numbers(iterable):
for i in iterable:
yield i + i
# A generator creates values on the fly.
# Instead of generating and returning all values at once it creates one in each
# iteration. This means values bigger than 15 wont be processed in
# double_numbers.
# Note range is a generator too. Creating a list 1-900000000 would take lot of
# time to be made
# We use a trailing underscore in variable names when we want to use a name that
# would normally collide with a python keyword
range_ = range(1, 900000000)
# will double all numbers until a result >=30 found
for i in double_numbers(range_):
print(i)
if i >= 30:
break
# Decorators
# in this example beg wraps say
# Beg will call say. If say_please is True then it will change the returned
# message
from functools import wraps
def beg(target_function):
@wraps(target_function)
def wrapper(*args, **kwargs):
msg, say_please = target_function(*args, **kwargs)
if say_please:
return "{} {}".format(msg, "Please! I am poor :(")
return msg
return wrapper
@beg
def say(say_please=False):
msg = "Can you buy me a beer?"
return msg, say_please
print(say()) # Can you buy me a beer?
print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :(
```
## Ready For More?
### Free Online
* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com)
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
* [Dive Into Python](http://www.diveintopython.net/)
* [Ideas for Python Projects](http://pythonpracticeprojects.com)
* [The Official Docs](http://docs.python.org/3/)
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
* [Python Course](http://www.python-course.eu/index.php)
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
### Dead Tree
* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20)
* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20)
* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20)