Az előadás nagyvonalakban a hivatalos Python tutorial-t követi.
A Python egy olyan általános körben használható magas szintű programozási nyelv, aminek az egyik alapelve az olvasható kód írása egy nagyon tiszta szintaxis használatával. 1991-ben alkotta meg Guido Van Rossum.
Nevét a Monthy Python ihlette, nem az állat.
python
ú.n. interpretált nyelvTöbb módon is futtathatunk python kódot.
Parancssorból futtatható, pl interaktívan:
$ python
Ekkor interaktív pythont kapunk amibe közvetlen írhatunk parancsokat.
De lefuttathatunk parancssorból egy létező python file-t is (.py kiterjesztésű file):
$ python hello.py
Ekkor lefut a program és ha van szöveges kimenete a programnak az látható lesz a parancssorban.
Itt az interpreter a python
(.exe
)
A Jupyter egy böngészőn keresztül használható fejlesztői környezet pythonhoz, mely a tavalyi Sage notebookhoz hasonlít. Ez az amit az előadás írásához használunk és gyakorlaton is fogjuk használni.
Indítani egy IPython szervert a következő paranccsal tudunk a leibniz
-en:
$ ipython notebook --port=##### --no-browser --ip=127.0.0.1
Ahol a ##### helyére egy 9000 és 20000 közti számot írjunk. Ekkor böngészőben a localhost:##### oldalon érhetjük el az IPython notebookunkat.
Itt a van egy program, ami a böngészőben látható felületet kezeli és az még több belső interpreter-t (kernel) is használhat.
De az ipython
maga is egy interpreter.
Az újabb verziókban az ipython notebook
helyett a jupyter notebook
parancs használatos (saját gépen könnyebb lesz).
A Jupyter képes több kernelt is használni, pl a Python és a Sage is ilyenek, de más nyelvekhez is vannak kernel-ek.
A Spyder egy grafikus fejlesztői környezet pythonhoz, a leibniz
-en fent van de kényelmesen telepíti bárki bármilyen oprendszerre.
Ez nem interpreter, hanem egy program ami a kód írását és futtatását könnyíti meg, de muszáj használnia egy interpretert.
Az Anaconda disztribúciót javaslom. Van minden főbb asztali oprendszerre (Linux, Mac, Windows)
Ez tartalmaz parancssori (python
, ipython
), notebook (jupyter
) és grafikus (Spyder
) környezetet is nem beszélve sok hasznos függvénykönytárról.
Az objektumok a nyelv alapelemei, ezekkel fogunk dolgozni. Minden objektumnak van típusa. A következő típusokkal kezdjük:
int
(egész): 2354, -12float
(lebegőpontos szám): 1.0, -23.567, 2.3E4bool
(logikai): True, Falsestr
(karakterlánc, sztring): "kiskutya", "Volt egyszer egy kiskutya"Dolgok típusát lekérdezhetjük a type
paranccsal.
type(5.0)
Az objektumok műveletekkel összekapcsolva kifejezéseket adnak, melyek kiértékelve valamilyen típusú objektumot adnak. Az egész és a lebegőpontos műveletek:
a + b
összeadása - b
kivonása * b
szorzása / b
osztás (Python 2.7-ben int/int = int, Python 3-tól float)a // b
egész osztása % b
maradékképzésa ** b
hatványozás (NEM a ^ b
, mint a sage-ben!)a == b, a < b, a > b, a <= b, a >= b, a != b, a <> b
eredményük bool
Logikai műveletek bool-típusúak közt:
a and b
, „és”a or b
, „megengedő vagy” not a
, „nem”Stringeken alapvető műveletek:
a + b
, konkatenálása in b
, tartalmazás vizsgálat (eredménye bool)5 + 11
2 ** 251
a = 54
b = a - 50
a * b
54 > 12
b < 0
54 > 12 or b < 0
s = "macska"
"ma" in s
s = "kis" + s
s
Három módon adhatunk meg karakterláncokat:
s = "kiskutya"
type(s)
s = 'kiskutya'
type(s)
s = """Volt egyszer egy kiskutya.
Elment a vásárba."""
type(s)
s
Itt a vezérlő karaketerek (\n a sorvége jel) és az ékezetes karakterek UTF-8 kódja (á betű kódja c3a1, \x után a bájt hexa kódja) jelenik meg. A print utasítás olvashatóan írja ki:
print s
Az első kettőnek kényelmi szerepe van, mert amelyik idézőjelet nem használjuk a string jelzésére azt használhatjuk a stringben. Például:
print "Egy 'macskaköröm' " + 'ketto "macskaköröm"'
'Van ilyen: \' meg ilyen: "'
print 'Van ilyen: \' meg ilyen: "'
A harmadikban használhatunk sortörést és ez a stringben is sortörésként fog megjelenni. Míg a többi jelöléssel sortörést a \n
kifejezéssel tudunk tenni.
További speciális karakterek stringekben: \\\\ (\\), \' ('), \" ("), \n
(új sor), \t
(tab)
Itt a Jupyterben az egyes cellák eredménye az utolsó érték ami kiértékelődött, de például, ha parancssorban futtatunk egy korábban megírt python file-t, akkor még ez sem lesz kiírva. Ha valamit ki akarunk írni azt konkrétan meg kell tennünk:
5 + 8
5 + 7
a = 5
print a
a = 15
print a * 2
a
string = "kiskutya"
"Volt egyszer egy " + string
print "Volt egyszer egy %s, elment a vásárba." % string
Ha egy stringben %s
szerepel akkor utána %
jellel behelyettesíthetünk erre a pozícióra egy másik stringet. Több behelyettesítés esetén:
print "Volt %s egy %s, elment a %s." % ("egyszer", "kiskutya", "vásárba")
Nem csak stringeket lehet behelyettesíteni, egész vagy lebegőpontos számokat is lehet:
print """A %d egy decimális egész (integer),
a %f pedig egy lebegőpontos (floating point) szám.""" % (23, 1.0/3)
% |
típus | példa | eredmény |
---|---|---|---|
%s |
sztring | "Volt egyszer egy %s" % "kiscica" |
"Volt egyszer egy kiscica" |
%d |
egész | "Volt egyszer %d kiscica" % 1 |
"Volt egyszer 1 kiscica" |
%f |
lebegőpontos | "Volt egyszer %f kiscica" % math.pi |
"Volt egyszer 3.141593 kiscica" |
"Volt egyszer %d %s és osztozniuk kellett %fdkg sajton" % (3, 'kisegér', math.pi) |
"Volt egyszer 3 kisegegér és osztozniuk kellett 3.141593dkg sajton" |
Egy sorba több dolgot is kiírhatunk, ha a print után vesszővel választjuk el. Ekkor szóközzel elválasztva lesznek kiírva.
Ha nem akarunk új sort kezdeni kiírás után, akkor a print-et fejezzük be egy vesszővel, jelezve hogy még folytatni akarjuk.
Üres print egyszerűen új sort kezd.
print 1, 3.14, "kutya"
print "macska",
print "teve",
print
print "vége"
Ha már kiírni tudunk dolgokat, akkor tanuljunk meg beolvasni is:
raw_input()
a = 5
nev = raw_input("Mi a neved? ")
print "Szia %s!" % nev
input() > 10
input() ** 10
A különbség a raw_input
és input
között ez:
a = raw_input()
a + " macska"
b = input()
b + " macska"
Azaz a raw_input
mindig stringként olvassa be bármit is adunk meg, míg az input
megpróbálja értelmezni azt amit beírtunk:
type(input())
Érdemes megjegyezni, hogy ez biztonsági résnek tekinthető, például
python
>>> intput()
exit()
x = input()
if x < 0:
print "ez negatív"
elif x == 0:
print "ez nulla"
elif x == 1:
print "ez egy"
else:
print "ez sok"
Az elif
-ek száma tetszőleges, de se az elif
se az else
megadása nem kötelező.
Ha az eredeti feltétel teljesül (igazra értékelődik), akkor az ő blokkjába eső (alatta behúzott) kód fut le, ha nem teljesül akkor az első olyan elif
blokk fut le aminek a feltétele igaz, ha ezek se igazak akkor az else
ág blokkja fut le, feltéve hogy van.
A behúzás (indentálás) legelterjedtebb mértéke a négy szóköz.
n = 1000
a = 1
while a ** 3 <= n:
print a ** 3, # a vessző miatt egy sorba kerülnek
a = a + 1
print "vége"
A while
ciklus blokkja lefut újra és újra, amíg teljesül a ciklus feltétele.
Így tehát a fenti kód addig növeli az a
változót, amíg annak köbe legalább 1000 nem lesz.
Ciklusokat és elágazásokat egymásba ágyazhatunk:
A híres Collatz- vagy $3x+1$-probléma:
a = input()
while a != 1:
print a, # a vessző miatt egy sorba kerülnek
if a % 2 == 0:
a = a / 2
else:
a = a * 3 + 1
Ezt megtehetjük akárhány mélységig (ciklusok is ágyazhatók egymásba):
a = input()
if type(a) == int:
while a != 1:
print a, # a vessző miatt egy sorba kerülnek
if a % 2 == 0:
a = a / 2
else:
a = a * 3 + 1
else:
print "Egesz szamot adjunk meg"
A fenti kód már azt is teszteli, hogy a felhasználó egész számot adott-e meg. Védjük ki azt is, ha negatív számot adott meg:
a = input()
if type(a) == int:
if a < 0:
a = -1 * a
while a != 1:
print a, # a vessző miatt egy sorba kerülnek
if a % 2 == 0:
a = a / 2
else:
a = a * 3 + 1
else:
print "Egesz szamot adjunk meg"
Végül már csak a 0 alesetet kell kizárni, hisz 0-ra se működik:
a = input()
if type(a) == int and a != 0:
if a < 0:
a = -1 * a
while a != 1:
print a, # a vessző miatt egy sorba kerülnek
if a % 2 == 0:
a = a / 2
else:
a = a * 3 + 1
else:
print "Nullatol kulonbozo egesz szamot adjunk meg"
Ciklusokban használható a break utasítás, hogy a feltételt figyelmen kívül hagyva azonnal kiugorjunk a ciklusból:
n = input("Adj meg egy negyzetszamot 10000 alatt! ")
a = 0
while a ** 2 < 10000:
if a ** 2 == n:
break
a = a + 1
if a ** 2 < 10000:
print "A négyzetszám gyöke: %d" % a
else:
print "Hazudtál! :("
Ha több ciklus van egymásba ágyazva, akkor a legbelső ciklusból ugrik ki, melynek blokkjában van.