Ez a leírás Python 3.5-ös verziójához készült, de bármilyen Python 3.3 feletti verzióhoz használható.
Az anyag elsajátításához nem szükséges Pythont és Jupytert telepíteni, de teljes értékűbb, ha te is ki tudod próbálni, át tudod írni az itt szereplő kódrészleteket. Amennyiben nem szeretnéd kipróbálni, ugorj a Python gyorstalpalóra.
Két lehetőségünk van:
https://www.continuum.io/downloads
https://wiki.python.org/moin/BeginnersGuide/Download
IDE-t (PyCharm) nem szükséges telepíteni, mert a felkészüléshez szükséges feladatokat ebben a notebookban lehet futtatni.
http://jupyter.readthedocs.org/en/latest/install.html (a Python telepítését is tartalmazza)
A Pythonnal együtt feltelepült a pip nevű csomagkezelő, amellyel minden további csomag telepíthető az alábbi paranccsal:
pip install csomagnév
A következő csomagokra mindenképp szükségünk lesz:
Most pedig ezt a notebookot fogjuk megnyitni és szerkeszteni.
jupyter notebook
parancsot, aminek hatására az alapértelmezett böngészőben megnyílik a jupyter fájlnézegetője. Ha mégsem nyílna meg, akkor a http://localhost:8888 -on találjuk alapértelmezetten (a port felüldefiniálható).Python_alapok.ipynb
nevű fájlhoz és indítsuk elA Jupyter notebookban cellákba rendezve keverhető a forráskód (Python, de más nyelvek is támogatottak), a Markdown szöveg és képek, illetve grafikonok. A Jupyter egyre népszerűbb kutatási és oktatási projektekben, a gravitációs hullámok felfedezői is ezt használták tutorial
Minden notebook cellákból épül fel, amik többfélék lehetnek:
Kiválaszthatunk egy vagy több szomszédos cellát, egy választása esetén kékkel jelöli a választottat. Ekkor Command mode-ban vagyunk. Az Enter lenyomásával vagy dupla kattintással léphetünk Edit mode-ba. Edit módból Esc-pel tudunk Command módba lépni. Command módban érhető el a Help a H gomb megnyomásával, ami tartalmazza az összes gyorsbillentyűt. Ezeket érdemes tanulmányozni és kipróbálni.
A cellákat többféle módon futtathatjuk:
A notebook mögött egy ún. kernel fut, ami azt jelenti, hogy a cellák közös interpretert használnak, tehát a változók közösek.
További hasznos információk:
In [1]:
print("Hello world\nvagy magyarul: Szia világ")
Kötelező az indentálás, 4 space a konvenció. Az indentálás jelöli a blokkok elejét és végét. A Jupyter automatikusan indentálja a következő sort, ha :-vel végződik az előző.
In [2]:
for x in range(3):
print(x)
A #-kal kezdődő sorok kommentek, többsoros komment """-pal kezdődik és végződik.
In [3]:
# én egy egysoros komment vagyok
"""
én egy többsoros komment vagyok
"""
Out[3]:
Az értékadás és az összehasonlítás szintaxisa megegyezik a C-s szintaxissal:
In [4]:
x = 6
print(x, x == 6, x == 3)
In [5]:
type(x), isinstance(x, int)
Out[5]:
Nincs implicit cast
In [6]:
# print("x: " + x) # TypeErrort ad
print("x: " + str(x)) # ez már helyes
print("x: {0}".format(x)) # python format string, automatikusan meghívja a paraméterekre az str függvényt
Dinamikus típusok
In [7]:
x = 6
print("x típusa: ", type(x))
x = "foo"
print("x típusa: ", type(x))
Miért nem kellett str(type(x))-et használni? Mert a print függvény a vesszővel elválasztott tetszőleges számú paraméterét kiírja. Az előző példában a + operátor hívásakor szükség lett volna az int paraméter implicit konverziójára.
Egyéb:
In [8]:
i = 2
f = 3.2
s = 'abc' # s[1] = 'a' hibát adna
t = (i, f, s)
b = True # False
type(i), type(f), type(s), type(t), type(b)
Out[8]:
A tuple elemei indexelhetők.
In [9]:
t[1]
Out[9]:
dict
: hash tábla alapú adattípusset
: halmaz. Értelmezettek a halmaz alapműveletek, mint a metszet (set1 & set2
), az unió (set1 | set2
) vagy a különbség (set1 - set2
)list
: alapvető tároló. Nem láncolt lista, hanem dinamikus tömb.
In [10]:
print('A None None-e: {}'.format(None is None))
print('A False None-e: {}'.format(False is None))
print('A 0 None-e: {}'.format(0 is None))
In [11]:
s = 'ez egy alma, az pedig egy Álma'
print(len(s))
print(s.startswith('abc'), s.endswith('a'))
try:
s[1] = 'n'
except TypeError:
print("Assignment failed")
print("A 20. karaktertől: {0}".format(s[20:]))
print("A 5-19. karakterig: {0}".format(s[5:20])) # a záróindex nincs benne!
print("A legutolsó karakter: {0}".format(s[-1:]))
In [12]:
d = {'a': 1, 'b': 2}
d['c'] = 3
d
Out[12]:
In [13]:
try:
d['d']
except KeyError:
print("Upsz")
In [14]:
l = [1, 2, 3, 'négy', 'öt'] # az elemek tetszőleges típusúak lehetnek
Az str-hez hasonlóan címezhető:
In [15]:
print("Az első két elem: {}".format(l[:2]))
print("A kettes indexű elem: {}".format(l[2]))
print("Az 1-3-as indexű elem: {}".format(l[1:4]))
Hatékonyan tudunk a végéhez új elemet fűzni:
In [16]:
l.append(6)
l
Out[16]:
In [17]:
print(list(range(5)))
Két dolgot is megfigyelhetünk:
További lehetőségek:
In [18]:
print("Számok -5-től 2-ig: {}".format(list(range(-5, 3))))
print("Számok kettesével: {}".format(list(range(0, 20, 2))))
In [19]:
a = 2
b = 3
print(a == 2 and b == 3)
print(a == 1 or b < 2)
In [20]:
3.2 / 1.1, 3.2 // 1.1
Out[20]:
Létezik hatványozó-operátor
In [21]:
2 ** 4
Out[21]:
A bitwise ÉS és VAGY megegyezik a C-s operátorokkal.
In [22]:
def print_my_name(firstname, lastname, title='Ms.'):
print('Hello {0} {1} {2}!'.format(title, firstname, lastname)) # format string, részletesebben ld. dokumentáció
Függvény hívásakor kétféleképpen adhatunk át paramétert:
In [23]:
print_my_name('Jakab', 'Gipsz', 'Mr')
print_my_name(lastname='Marga', firstname='Rita')
In [24]:
class A:
pass # ez a pythonos NOP
Konstruktort a init magic (tényleg!) függvénnyel írhatunk. Destruktort - garbage collectoros nyelv lévén - nincs. A del hívódik az objektum begyűjtésekor, azonban nem tudjuk, mikor fut le ez a függvény.
In [25]:
class A:
def __init__(self, param=42):
self.p = param
Minden metódusnak kötelező átvennie explicit a self paramétert, ezen keresztül fogja elérni az objektum attribútumait.
In [26]:
class NamePrinter:
def __init__(self, firstname, lastname, title='Ms.'):
self.firstname = firstname
self.lastname = lastname
self.title = title
def greet_with_title(self):
print('Hello {0} {1} {2}'.format(self.title, self.firstname, self.lastname, self.title))
def greet_without_title(self):
print('Hello {0} {1}'.format(self.firstname, self.lastname))
A példányosítás ugyanúgy paraméterezhető, mint a függvényhívás.
In [27]:
nm1 = NamePrinter('Jakab', 'Gipsz', 'Mr')
nm2 = NamePrinter(lastname='Marga', firstname='Rita')
nm1.greet_with_title()
nm2.greet_without_title()
A Python nyelv funkcióinak gazdagsága miatt nincs lehetőség minden részletet bemutatni, nem is erre törekedtem. Igyekeztem a laborhoz hasznos információkra felhívni a figyelmeteket.
Az anyag folyamatosan bővül. Ha érdekel, kövesd a repositoryt (Watch gomb).
Az esetleges hibákat kérlek jelezd nekem a emailben [keresztnevem] at aut_bme-hu email címen vagy GitHub issue-ban.