Informatika1-2014/eloadas3
(Új oldal, tartalma: „=Bevezetés a Python nyelvbe= Az előadáshoz elsőszámú olvasmány a [http://docs.python.org/2.7/tutorial/ Python tutorial]. A Python egy olyan általános körben…”) |
(→Bevezetés a Python nyelvbe) |
||
20. sor: | 20. sor: | ||
<python> | <python> | ||
import this | import this | ||
+ | </python> | ||
+ | |||
+ | == Futtatása == | ||
+ | |||
+ | Egyelőre csak interaktívan: egyszerűen a python parancs terminálból indítva. | ||
+ | |||
+ | <bash> | ||
+ | $ python | ||
+ | Python 2.7.5+ (default, Sep 19 2013, 13:48:49) | ||
+ | [GCC 4.8.1] on linux2 | ||
+ | Type "help", "copyright", "credits" or "license" for more information. | ||
+ | >>> | ||
+ | </bash> | ||
+ | |||
+ | Sokkal jobb környezetet biztosít az ipython: | ||
+ | <bash> | ||
+ | $ ipython | ||
+ | Python 2.7.5+ (default, Feb 27 2014, 19:37:08) | ||
+ | Type "copyright", "credits" or "license" for more information. | ||
+ | |||
+ | IPython 0.13.2 -- An enhanced Interactive Python. | ||
+ | ? -> Introduction and overview of IPython's features. | ||
+ | %quickref -> Quick reference. | ||
+ | help -> Python's own help system. | ||
+ | object? -> Details about 'object', use 'object??' for extra details. | ||
+ | |||
+ | In [1]: | ||
+ | </bash> | ||
+ | |||
+ | Külön ablakot ad az IDLE (Interactive Development Environment): | ||
+ | |||
+ | <bash> | ||
+ | idle | ||
+ | </bash> | ||
+ | |||
+ | == Kódolás stílusa == | ||
+ | |||
+ | Stílus (code style) a [http://www.python.org/dev/peps/pep-0008 PEP 8 alapján] | ||
+ | * használj mindig 4 space-t minden egyes szinthez, de a folytatósort kezd még beljebb, | ||
+ | * a nagyobb kódrészeket tagold üres sorokkal (függvény, osztály, nagyobb kód blokk) | ||
+ | * használj space-t a vesző után és a legmagasabb szinten lévő operátorok körül | ||
+ | * használj docstring-et és ahol lehet a megjegyzés a saját sorára vonatkozzon, vagy azonos mértékben behúzva arra a blokkódra | ||
+ | * ahol lehet használj ASCII karakterkódolást | ||
+ | * 79 karakternél ne legyen hosszabb egy sor | ||
+ | * CamelCase elnevezési konvenciót kövesse az osztályok neve és lower_case_with_underscores a függvények és változók nevei | ||
+ | |||
+ | Érdemes megnézni a Google [http://google-styleguide.googlecode.com/svn/trunk/pyguide.html python code style] ajánlását is. | ||
+ | |||
+ | == Objektumok == | ||
+ | |||
+ | Objektumok: a nyelv alapelemei, ezekkel dolgozunk. Minden objektumnak típusa van. Négy felbonthatatlan skaláris alapobjektum: | ||
+ | * egész <code>int</code>: 2354, -12 | ||
+ | * lebegőpontos szám <code>int</code>: 1.0, -23.567, 2.3E4 | ||
+ | * logikai <code>bool</code>: <code>True</code>, <code>False</code> | ||
+ | * semmi <code>None</code> | ||
+ | |||
+ | |||
+ | == Műveletek, kifejezések == | ||
+ | |||
+ | 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: | ||
+ | * <code>a + b</code> összeadás | ||
+ | * <code>a - b</code> kivonás | ||
+ | * <code>a * b</code> szorzás | ||
+ | * <code>a / b</code> osztás (Python 2.7-ben int/int = int, Python 3-tól float) | ||
+ | * <code>a // b</code> egész osztás | ||
+ | * <code>a % b</code> maradékképzés | ||
+ | * <code>a ** b</code> hatványozás | ||
+ | * <code>a == b</code>, <code>a < b</code>, <code>a > b</code>, <code>a <= b</code>, <code>a >= b</code>, <code>a != b</code>, <code>a <> b</code> | ||
+ | |||
+ | Logikai műveletek bool-típusúak közt: | ||
+ | * <code>a and b</code>, „és” | ||
+ | * <code>a or b</code>, „megengedő vagy” | ||
+ | * <code>not a</code>, „nem” | ||
+ | |||
+ | |||
+ | == Azonosítók == | ||
+ | |||
+ | Az adatokat többszöri felhasználásra ''azonosítóval'' (''névvel'') láthatjuk el. | ||
+ | |||
+ | * a név betűvel vagy aláhúzással kezdődhet: [_a-zA-Z] | ||
+ | * a név további karakterei az előbbieken felül számok is lehetnek: [_a-zA-Z0-9] | ||
+ | * elméletileg bármilyen hosszú lehet a név | ||
+ | * név nem lehet foglalt szó | ||
+ | * nagybetű-kisbetű érzékeny, tehát a val1 név nem azonos a Val1 névvel | ||
+ | |||
+ | A foglalt szavak: | ||
+ | <python> | ||
+ | and del from not while | ||
+ | as elif global or with | ||
+ | assert else if pass yield | ||
+ | break except import print | ||
+ | class exec in raise | ||
+ | continue finally is return | ||
+ | def for lambda try | ||
+ | </python> | ||
+ | De ne használjuk a Python beépített neveinek, függvényeinek, kivételeinek neveit sem. Ezek megkaphatók a <code>dir(__builtins__)</code> paranccsal: | ||
+ | <Python> | ||
+ | >>> dir() | ||
+ | ['__builtins__', '__doc__', '__name__', '__package__'] | ||
+ | >>> dir(__builtins__) | ||
+ | ['ArithmeticError', 'AssertionError', ...... | ||
+ | </Python> | ||
+ | |||
+ | |||
+ | == Objektumhivatkozások == | ||
+ | |||
+ | Az értékadás (=) esetén valójában '''objektumhivatkozás''' történik, azaz az egyenlőség bal oldalán álló névhez egy hivatkozás kapcsolódik, mely az egyenlőség jobb oldalán álló objektumra mutat. Ez érthetővé teszi a következő kódot: | ||
+ | <python> | ||
+ | >>> a = 1 | ||
+ | >>> b = a | ||
+ | >>> a = 2 | ||
+ | >>> a | ||
+ | 2 | ||
+ | >>> b | ||
+ | 1 | ||
+ | </python> | ||
+ | A Python '''dinamikusan típusos''' nyelv, azaz az objektum, amire egy objektumhivatkozás mutat, lecserélhető egy más típusú objektumra (nem kell a változók típusát deklarálni). | ||
+ | <python> | ||
+ | >>> a = 1 | ||
+ | >>> type(a) | ||
+ | <type 'int'> | ||
+ | >>> a = "b" | ||
+ | >>> type(a) | ||
+ | <type 'str'> | ||
+ | </python> | ||
+ | Lehetséges a többszörös értékadás: | ||
+ | <python> | ||
+ | >>> a, b = 1, 2 | ||
+ | >>> a, b = b, a | ||
+ | >>> print a, b | ||
+ | 2 1 | ||
+ | </python> | ||
+ | |||
+ | == Karakterláncok (str) == | ||
+ | |||
+ | A karakterláncok megadása: "...", '...' vagy """...""" módon történhet: | ||
+ | <python> | ||
+ | >>> a="""itt 'ez' meg "az" van""" | ||
+ | >>> a | ||
+ | 'itt \'ez\' meg "az" van' | ||
+ | >>> print a | ||
+ | itt 'ez' meg "az" van | ||
+ | >>> type(a) | ||
+ | <type 'str'> | ||
+ | |||
+ | >>> c = 'aa\nbb' | ||
+ | >>> c | ||
+ | 'aa\nbb' | ||
+ | >>> print c | ||
+ | aa | ||
+ | bb | ||
+ | </python> | ||
+ | |||
+ | '''Védőkódok (eszkép karakterek, escape characters)''': | ||
+ | \ (folytatás új sorban), \\ (\), \' ('), \" ("), | ||
+ | \n (új sor), \t (tab). (Ha a karakterlánc elé '''r''' betűt írunk, a védőkódok nem érvényesek.) | ||
+ | |||
+ | '''Műveletek''' karakterláncokkal: | ||
+ | indexelés és szeletelés: | ||
+ | <python> | ||
+ | lánc[sorszám] | ||
+ | lánc[kezdet:vég] | ||
+ | lánc[kezdet:vég:lépés] | ||
+ | </python> | ||
+ | továbbá az '''+''' (összefűzés) és a '''*''' (többszörözés) műveletek: | ||
+ | <python> | ||
+ | >>> a = "ho" | ||
+ | >>> b = "rgasz" | ||
+ | >>> 3*a + b | ||
+ | 'hohohorgasz' | ||
+ | |||
+ | >>> c = _ # _ az előző eredmény | ||
+ | >>> c | ||
+ | 'hohohorgasz' | ||
+ | >>> c[:2]+c[6:] | ||
+ | 'horgasz' | ||
+ | >>> c[1:7:2] | ||
+ | 'ooo' | ||
+ | >>> c[1:6:2] | ||
+ | 'ooo' | ||
+ | >>> c[-1::-1] | ||
+ | 'zsagrohohoh' | ||
+ | >>> c[-3:4:-1] | ||
+ | 'agro' | ||
+ | </python> | ||
+ | |||
+ | Az indexekre kétféleképp gondolhatunk: | ||
+ | 1. a második index már nincs (ennek pl. az az értelme, hogy egy intervallum végét, és a következő elejét azonos érték jelzi, nem kell 1-et hozzáadni), | ||
+ | 2. az indexeket az elemek közé képzeljük, vagyis az elemek határait indexeljük: | ||
+ | |||
+ | <bash> | ||
+ | +---+---+---+---+---+---+---+ | ||
+ | | h | o | r | g | a | s | z | | ||
+ | +---+---+---+---+---+---+---+ | ||
+ | 0 1 2 3 4 5 6 7 | ||
+ | -5 -6 -5 -4 -3 -2 -1 | ||
+ | </bash> | ||
+ | |||
+ | '''A karakterláncok nem változtatható (immutable) objektumok''', vagyis a műveletek, tagfüggvények alkalmazása után új karakterlánc keletkezik: | ||
+ | <python> | ||
+ | >>> a = "aaaa" | ||
+ | >>> a[1] = b | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | TypeError: 'str' object does not support item assignment | ||
+ | </python> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | = Egyszerű programok = | ||
+ | |||
+ | == Szekvencia, bemenet, kimenet == | ||
+ | |||
+ | <python> | ||
+ | >>> nev = raw_input('Mi a neved? ') | ||
+ | Mi a neved? Laci | ||
+ | >>> print 'Szia %s!' % nev | ||
+ | Szia Laci! | ||
+ | </python> | ||
+ | |||
+ | Újabb szintaxis a kimenetre: | ||
+ | |||
+ | <python> | ||
+ | >>> nev = raw_input('Mi a neved?\n') | ||
+ | Mi a neved? | ||
+ | Laura | ||
+ | >>> ora = int(raw_input('Kb. mikor találkozzunk?\n')) | ||
+ | Kb. mikor találkozzunk? | ||
+ | 3 | ||
+ | >>> print 'Szia %s! Találkozzunk %d körül!' % (nev, ora) | ||
+ | Szia Laura! Találkozzunk 3 körül! | ||
+ | >>> print 'Szia {0}! Találkozzunk {1} körül!'.format(nev, ora) | ||
+ | Szia Laura! Találkozzunk 3 körül! | ||
+ | </python> | ||
+ | |||
+ | |||
+ | == Elágazás, ciklus == | ||
+ | |||
+ | === if === | ||
+ | |||
+ | <python> | ||
+ | >>> x = int(raw_input("Adj meg egy egész számot: ")) | ||
+ | Adj meg egy egész számot: 42 | ||
+ | >>> if x < 0: | ||
+ | ... print "ez negatív" | ||
+ | ... elif x == 0: | ||
+ | ... print "ez nulla" | ||
+ | ... elif x == 1: | ||
+ | ... print "ez egy" | ||
+ | ... else: | ||
+ | ... print "ez sok" | ||
+ | ... | ||
+ | ez sok | ||
+ | </python> | ||
+ | |||
+ | Az elif-ek száma tetszőleges, és ezzel elkerülhető a sok behúzás. | ||
+ | |||
+ | === while, braek, else === | ||
+ | |||
+ | '''''Írjuk ki az 1000 alatti Fibonacci-számokat:''''' | ||
+ | <python> | ||
+ | >>> n = 1000 | ||
+ | >>> a, b = 0, 1 | ||
+ | >>> while a < n: | ||
+ | ... print a, # a vessző miatt egy sorba kerülnek | ||
+ | ... a, b = b, a + b | ||
+ | ... | ||
+ | 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 | ||
+ | </python> | ||
+ | |||
+ | A while-nak is lehet else-ága és használható a break. | ||
+ | |||
+ | A pythonban nincs hátul tesztelő ciklusutasítás, a következővel helyettesíthető: | ||
+ | <python> | ||
+ | while True: | ||
+ | utasítások | ||
+ | if kilépési_feltétel: | ||
+ | break | ||
+ | (utasítások) | ||
+ | </python> | ||
+ | |||
+ | |||
+ | === for, break, else, continue === | ||
+ | |||
+ | <python> | ||
+ | >>> long_words = [u"Antidisestablishmentarianism", | ||
+ | u"Donaudampfschiffahrtselektrizitätenhauptbetriebswerkbauunterbeamtengesellschaft", | ||
+ | u"bejelentkezésszabályozási", u"fosszilisdinoszauruszhányásvilágranglista-megdöntés", | ||
+ | u"folyamatellenőrzésiügyosztályvezetőhelyettesképesítésvizsgálat-szervezéseitekkel"] | ||
+ | >>> for i in long_words: | ||
+ | ... print i, len(i) | ||
+ | ... | ||
+ | Antidisestablishmentarianism 28 | ||
+ | Donaudampfschiffahrtselektrizitätenhauptbetriebswerkbauunterbeamtengesellschaft 79 | ||
+ | bejelentkezésszabályozási 25 | ||
+ | fosszilisdinoszauruszhányásvilágranglista-megdöntés 51 | ||
+ | folyamatellenőrzésiügyosztályvezetőhelyettesképesítésvizsgálat-szervezéseitekkel 80 | ||
+ | </python> | ||
+ | |||
+ | '''''Döntsük el 10-ig minden egészről, hogy prím vagy összetett szám!''''' | ||
+ | <python> | ||
+ | >>> for n in range(2, 10): | ||
+ | ... for x in range(2, n): | ||
+ | ... if n % x == 0: | ||
+ | ... print n, '=', x, '*', n/x | ||
+ | ... break | ||
+ | ... else: | ||
+ | ... # ha a ciklusban nem talált osztót (nem volt break) | ||
+ | ... print n, 'prím' | ||
+ | ... | ||
+ | 2 prím | ||
+ | 3 prím | ||
+ | 4 = 2 * 2 | ||
+ | 5 prím | ||
+ | 6 = 2 * 3 | ||
+ | 7 prím | ||
+ | 8 = 2 * 4 | ||
+ | 9 = 3 * 3 | ||
+ | </python> | ||
+ | Az '''else''' a '''for'''-ral is használható! Szerencsétlen a névhasználat (jobb lenne pl. finally), de a szerkezet praktikus lehet. Az else ágra a ciklus utolsó végrehajtása után kerül a vezérlés (így akkor is, ha a ciklus egyszer sem fut le). Elkerüli viszont az else ágat a vezérlés, ha a break utasítással hagyjuk el a ciklust. | ||
+ | |||
+ | '''''Írjuk ki az 50 alatti páros számokat, de a 3-mal oszthatók helyett *-ot tegyünk!''''' | ||
+ | <python> | ||
+ | >>> for n in range(2, 50, 2): | ||
+ | ... if n % 3 == 0: | ||
+ | ... print "*", | ||
+ | ... continue | ||
+ | ... print n, | ||
+ | ... | ||
+ | 2 4 * 8 10 * 14 16 * 20 22 * 26 28 * 32 34 * 38 40 * 44 46 * | ||
+ | </python> | ||
+ | |||
+ | |||
+ | == Függvény == | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | == Hatókör (scope), névtér == | ||
+ | |||
+ | Minden új függvény fölépíti saját névterét, egy szótár formájában. Íme a globális és egy lokális névtér: | ||
+ | |||
+ | <python> | ||
+ | >>> x = 2 | ||
+ | >>> print globals() | ||
+ | {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 2, '__doc__': None, '__package__': None} | ||
+ | >>> def fn(): | ||
+ | ... y = 3 | ||
+ | ... print locals() | ||
+ | ... | ||
+ | >>> fn() | ||
+ | {'y': 3} | ||
+ | </python> | ||
+ | |||
+ | Ha egy név lokálisan nem lett létrehozva, a tartalmazó névterekben keresi egyre kijjebb haladva (itt az x nem lett lokálisan létrehozva, de elérhető): | ||
+ | |||
+ | <python> | ||
+ | >>> def fn(): | ||
+ | ... y = 3 | ||
+ | ... print "x, y:", x, y | ||
+ | ... print locals() | ||
+ | ... | ||
+ | >>> fn() | ||
+ | x, y: 2 3 | ||
+ | {'y': 3} | ||
+ | </python> | ||
+ | |||
+ | Kérdés: Mi történik az alábbi kód hatására? magyarázzuk meg, mi történik: | ||
+ | |||
+ | <python> | ||
+ | >>> def fn(): | ||
+ | ... y = 3 | ||
+ | ... print "x, y:", x, y | ||
+ | ... x = 5 | ||
+ | ... print locals() | ||
+ | ... | ||
+ | >>> fn() | ||
+ | </python> | ||
+ | |||
+ | És mi történik, ha a 3. és 4. sort fölcseréljük? | ||
+ | |||
+ | A névtér törlődik a függvény lefutása után, magasabb szinten az alacsonyabb szintű névterek nem érhetők el: | ||
+ | |||
+ | <python> | ||
+ | >>> def fn(): | ||
+ | ... z = 1 | ||
+ | ... | ||
+ | >>> print z | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | NameError: name 'z' is not defined | ||
+ | </python> | ||
+ | |||
+ | A '''függvény lezárása''' a Pythonnak azt a képességét jelenti, hogy a nem globális névtérben definiált függvény '''emlékszik''' a definiálás pillanatában érvényes bennfoglaló névterekre: | ||
+ | |||
+ | <python> | ||
+ | >>> def kulso(x): | ||
+ | ... def belso(): | ||
+ | ... print x | ||
+ | ... return belso | ||
+ | ... | ||
+ | >>> f1 = kulso(3) | ||
+ | >>> f2 = kulso(5) | ||
+ | >>> | ||
+ | >>> f1() | ||
+ | 3 | ||
+ | >>> f2() | ||
+ | 5 | ||
</python> | </python> |
A lap 2014. szeptember 30., 11:10-kori változata
Tartalomjegyzék |
Bevezetés a Python nyelvbe
Az előadáshoz elsőszámú olvasmány a Python tutorial.
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.
További jellemzők
- objektum orientált, procedurális, funkcionális
- sok beépített modul a fejlesztés megkönnyítésére
- dinamikus típus kezelés
- automatikus memóriakezelés
- többféle megvalósítás (CPython, Jython, IronPython, PyPy, Python for S60)
- open-source a főbb platformokra
- sokkal tömörebb sok más nyelvnél
Nevét a Monthy Python ihlette, nem az állat.
Filozófiája megkapható a 'this' modul betöltésével:
import this
Futtatása
Egyelőre csak interaktívan: egyszerűen a python parancs terminálból indítva.
$ python Python 2.7.5+ (default, Sep 19 2013, 13:48:49) [GCC 4.8.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
Sokkal jobb környezetet biztosít az ipython:
$ ipython Python 2.7.5+ (default, Feb 27 2014, 19:37:08) Type "copyright", "credits" or "license" for more information. IPython 0.13.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]:
Külön ablakot ad az IDLE (Interactive Development Environment):
idle
Kódolás stílusa
Stílus (code style) a PEP 8 alapján
- használj mindig 4 space-t minden egyes szinthez, de a folytatósort kezd még beljebb,
- a nagyobb kódrészeket tagold üres sorokkal (függvény, osztály, nagyobb kód blokk)
- használj space-t a vesző után és a legmagasabb szinten lévő operátorok körül
- használj docstring-et és ahol lehet a megjegyzés a saját sorára vonatkozzon, vagy azonos mértékben behúzva arra a blokkódra
- ahol lehet használj ASCII karakterkódolást
- 79 karakternél ne legyen hosszabb egy sor
- CamelCase elnevezési konvenciót kövesse az osztályok neve és lower_case_with_underscores a függvények és változók nevei
Érdemes megnézni a Google python code style ajánlását is.
Objektumok
Objektumok: a nyelv alapelemei, ezekkel dolgozunk. Minden objektumnak típusa van. Négy felbonthatatlan skaláris alapobjektum:
- egész
int
: 2354, -12 - lebegőpontos szám
int
: 1.0, -23.567, 2.3E4 - logikai
bool
:True
,False
- semmi
None
Műveletek, kifejezések
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ás -
a - b
kivonás -
a * b
szorzás -
a / b
osztás (Python 2.7-ben int/int = int, Python 3-tól float) -
a // b
egész osztás -
a % b
maradékképzés -
a ** b
hatványozás -
a == b
,a < b
,a > b
,a <= b
,a >= b
,a != b
,a <> b
Logikai műveletek bool-típusúak közt:
-
a and b
, „és” -
a or b
, „megengedő vagy” -
not a
, „nem”
Azonosítók
Az adatokat többszöri felhasználásra azonosítóval (névvel) láthatjuk el.
- a név betűvel vagy aláhúzással kezdődhet: [_a-zA-Z]
- a név további karakterei az előbbieken felül számok is lehetnek: [_a-zA-Z0-9]
- elméletileg bármilyen hosszú lehet a név
- név nem lehet foglalt szó
- nagybetű-kisbetű érzékeny, tehát a val1 név nem azonos a Val1 névvel
A foglalt szavak:
and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try
De ne használjuk a Python beépített neveinek, függvényeinek, kivételeinek neveit sem. Ezek megkaphatók a dir(__builtins__)
paranccsal:
>>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', ......
Objektumhivatkozások
Az értékadás (=) esetén valójában objektumhivatkozás történik, azaz az egyenlőség bal oldalán álló névhez egy hivatkozás kapcsolódik, mely az egyenlőség jobb oldalán álló objektumra mutat. Ez érthetővé teszi a következő kódot:
>>> a = 1 >>> b = a >>> a = 2 >>> a 2 >>> b 1
A Python dinamikusan típusos nyelv, azaz az objektum, amire egy objektumhivatkozás mutat, lecserélhető egy más típusú objektumra (nem kell a változók típusát deklarálni).
>>> a = 1 >>> type(a) <type 'int'> >>> a = "b" >>> type(a) <type 'str'>
Lehetséges a többszörös értékadás:
>>> a, b = 1, 2 >>> a, b = b, a >>> print a, b 2 1
Karakterláncok (str)
A karakterláncok megadása: "...", '...' vagy """...""" módon történhet:
>>> a="""itt 'ez' meg "az" van""" >>> a 'itt \'ez\' meg "az" van' >>> print a itt 'ez' meg "az" van >>> type(a) <type 'str'> >>> c = 'aa\nbb' >>> c 'aa\nbb' >>> print c aa bb
Védőkódok (eszkép karakterek, escape characters): \ (folytatás új sorban), \\ (\), \' ('), \" ("), \n (új sor), \t (tab). (Ha a karakterlánc elé r betűt írunk, a védőkódok nem érvényesek.)
Műveletek karakterláncokkal: indexelés és szeletelés:
lánc[sorszám] lánc[kezdet:vég] lánc[kezdet:vég:lépés]
továbbá az + (összefűzés) és a * (többszörözés) műveletek:
>>> a = "ho" >>> b = "rgasz" >>> 3*a + b 'hohohorgasz' >>> c = _ # _ az előző eredmény >>> c 'hohohorgasz' >>> c[:2]+c[6:] 'horgasz' >>> c[1:7:2] 'ooo' >>> c[1:6:2] 'ooo' >>> c[-1::-1] 'zsagrohohoh' >>> c[-3:4:-1] 'agro'
Az indexekre kétféleképp gondolhatunk: 1. a második index már nincs (ennek pl. az az értelme, hogy egy intervallum végét, és a következő elejét azonos érték jelzi, nem kell 1-et hozzáadni), 2. az indexeket az elemek közé képzeljük, vagyis az elemek határait indexeljük:
+---+---+---+---+---+---+---+ | h | o | r | g | a | s | z | +---+---+---+---+---+---+---+ 0 1 2 3 4 5 6 7 -5 -6 -5 -4 -3 -2 -1
A karakterláncok nem változtatható (immutable) objektumok, vagyis a műveletek, tagfüggvények alkalmazása után új karakterlánc keletkezik:
>>> a = "aaaa" >>> a[1] = b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment
Egyszerű programok
Szekvencia, bemenet, kimenet
>>> nev = raw_input('Mi a neved? ') Mi a neved? Laci >>> print 'Szia %s!' % nev Szia Laci!
Újabb szintaxis a kimenetre:
>>> nev = raw_input('Mi a neved?\n') Mi a neved? Laura >>> ora = int(raw_input('Kb. mikor találkozzunk?\n')) Kb. mikor találkozzunk? 3 >>> print 'Szia %s! Találkozzunk %d körül!' % (nev, ora) Szia Laura! Találkozzunk 3 körül! >>> print 'Szia {0}! Találkozzunk {1} körül!'.format(nev, ora) Szia Laura! Találkozzunk 3 körül!
Elágazás, ciklus
if
>>> x = int(raw_input("Adj meg egy egész számot: ")) Adj meg egy egész számot: 42 >>> if x < 0: ... print "ez negatív" ... elif x == 0: ... print "ez nulla" ... elif x == 1: ... print "ez egy" ... else: ... print "ez sok" ... ez sok
Az elif-ek száma tetszőleges, és ezzel elkerülhető a sok behúzás.
while, braek, else
Írjuk ki az 1000 alatti Fibonacci-számokat:
>>> n = 1000 >>> a, b = 0, 1 >>> while a < n: ... print a, # a vessző miatt egy sorba kerülnek ... a, b = b, a + b ... 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
A while-nak is lehet else-ága és használható a break.
A pythonban nincs hátul tesztelő ciklusutasítás, a következővel helyettesíthető:
while True: utasítások if kilépési_feltétel: break (utasítások)
for, break, else, continue
>>> long_words = [u"Antidisestablishmentarianism", u"Donaudampfschiffahrtselektrizitätenhauptbetriebswerkbauunterbeamtengesellschaft", u"bejelentkezésszabályozási", u"fosszilisdinoszauruszhányásvilágranglista-megdöntés", u"folyamatellenőrzésiügyosztályvezetőhelyettesképesítésvizsgálat-szervezéseitekkel"] >>> for i in long_words: ... print i, len(i) ... Antidisestablishmentarianism 28 Donaudampfschiffahrtselektrizitätenhauptbetriebswerkbauunterbeamtengesellschaft 79 bejelentkezésszabályozási 25 fosszilisdinoszauruszhányásvilágranglista-megdöntés 51 folyamatellenőrzésiügyosztályvezetőhelyettesképesítésvizsgálat-szervezéseitekkel 80
Döntsük el 10-ig minden egészről, hogy prím vagy összetett szám!
>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, '=', x, '*', n/x ... break ... else: ... # ha a ciklusban nem talált osztót (nem volt break) ... print n, 'prím' ... 2 prím 3 prím 4 = 2 * 2 5 prím 6 = 2 * 3 7 prím 8 = 2 * 4 9 = 3 * 3
Az else a for-ral is használható! Szerencsétlen a névhasználat (jobb lenne pl. finally), de a szerkezet praktikus lehet. Az else ágra a ciklus utolsó végrehajtása után kerül a vezérlés (így akkor is, ha a ciklus egyszer sem fut le). Elkerüli viszont az else ágat a vezérlés, ha a break utasítással hagyjuk el a ciklust.
Írjuk ki az 50 alatti páros számokat, de a 3-mal oszthatók helyett *-ot tegyünk!
>>> for n in range(2, 50, 2): ... if n % 3 == 0: ... print "*", ... continue ... print n, ... 2 4 * 8 10 * 14 16 * 20 22 * 26 28 * 32 34 * 38 40 * 44 46 *
Függvény
Hatókör (scope), névtér
Minden új függvény fölépíti saját névterét, egy szótár formájában. Íme a globális és egy lokális névtér:
>>> x = 2 >>> print globals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 2, '__doc__': None, '__package__': None} >>> def fn(): ... y = 3 ... print locals() ... >>> fn() {'y': 3}
Ha egy név lokálisan nem lett létrehozva, a tartalmazó névterekben keresi egyre kijjebb haladva (itt az x nem lett lokálisan létrehozva, de elérhető):
>>> def fn(): ... y = 3 ... print "x, y:", x, y ... print locals() ... >>> fn() x, y: 2 3 {'y': 3}
Kérdés: Mi történik az alábbi kód hatására? magyarázzuk meg, mi történik:
>>> def fn(): ... y = 3 ... print "x, y:", x, y ... x = 5 ... print locals() ... >>> fn()
És mi történik, ha a 3. és 4. sort fölcseréljük?
A névtér törlődik a függvény lefutása után, magasabb szinten az alacsonyabb szintű névterek nem érhetők el:
>>> def fn(): ... z = 1 ... >>> print z Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'z' is not defined
A függvény lezárása a Pythonnak azt a képességét jelenti, hogy a nem globális névtérben definiált függvény emlékszik a definiálás pillanatában érvényes bennfoglaló névterekre:
>>> def kulso(x): ... def belso(): ... print x ... return belso ... >>> f1 = kulso(3) >>> f2 = kulso(5) >>> >>> f1() 3 >>> f2() 5