2018. szeptember 3., hétfő

Python 10 osztály

1. Alapfogalmak

1.1 Mintaprogram - Krumpli

Feladat – Krumpli


Egy cserkésztáborban készül a vacsora, de a konyhaf nök nem tudja, mennyi krumplit vegyen. A fejadagot ismeri az 0,4 kg, de a szükséges mennyiséget számítógép segítségével szeretné kiszámolni az aktuális létszámtól függ en. Írjuk meg a programot a konyhaf nöknek! A program kérje be a létszámot, majd írja ki a szükséges mennyiséget a következ képpen:

Létszám? 20

A szükséges mennyiség: 20 * 0.4 kg = 8.0 kg

# -*- coding: ISO-8859-2 -*-letszamstr = raw_input("Létszám? ") letszam = int(letszamstr) mennyiseg = letszam * 0.4

print "A szükséges mennyiség: ",letszam," * 0,4 kg = ",mennyiseg," kg"


Az els sor a magyar ékezetes karakterek helyes megjelenítéséhez szükséges kódtábla elérését biztosítja.

A második sorban a konzolról beolvasunk egy sztringet a letszamstr változóba, miközben a konzolra kiírjuk a "Létszám? " szöveget.
A harmadik sorban a letszamstr szövegb l egész típust készítünk, és belerakjuk a letszam változóba.
A negyedik sorban a létszámot megszorozzuk a fejadaggal, és ezt a mennyiseg nev változóban tároljuk.
Az ötödik sorban kiíratjuk a konzolra a szükséges szöveget. A fixen kiírandó szövegeket " " jelek között, és hozzájuk vessz vel f zzük hozzá a változó mennyiségeket.


1.2 Ékezetes és speciális karakterek

A 2.3 verziótól kezdve a magyar nyelvet használóknak ajánlatos minden Python scriptjük elejére beírni a következ pszeudo-commentek egyikét (kötelez en az els vagy a második sorba) :

# -*- coding: ISO-8859-2 -*-vagy :
# -*- coding:Utf-8 -*-

Ezek a pszeudo-commentek azt jelzik a Pythonnak, hogy a scriptben : vagy a f nyugat-európai nyelvek ékezetes karakterkészletét használjuk egy byteon kódolva az ISO-8859 norma szerint; vagy a Unicodenak nevezett két byteos kódolást használjuk.

A Python mindkét rendszert tudja használni, de meg kell neki adnunk, hogy melyiket használjuk. Ha az operációs rendszerünk úgy van konfigurálva, hogy a billenty leütések Utf-8 kódokat generálnak, akkor konfiguráljuk úgy a szövegszerkeszt nket, hogy az is ezt a kódot használja és tegyük a fönt megadott második pszeudo-commentet minden scriptünk elejére. Ha az operációs rendszerünk a régi norma (ISO-8859) szerint m ködik, akkor inkább az elsö pszeudo-commentet kell használnunk.
Ha semmit sem adunk meg, akkor id nként figyelmeztet üzeneteket fogunk kapni az interpretert l és esetleg némi nehézségeket fogunk tapasztalni amikor az IDE környezetben szerkesztjük scriptjeinket (speciálisan Windows alatt).




3

Függetlenül attól, hogy egyik, vagy másik normát, vagy egyiket sem használjuk, a scriptünk korrekt módon fog végrehajtódni. Ahhoz, hogy a saját rendszerünkön tudjuk a kódot szerkeszteni, a megfelel opciót kell választani.


1.3 Adatok és változók

Egy számítógépprogram lényegét az adatokkal végzett m veletek jelentik. Ezek az adatok nagyon különböz ek lehetnek (lényegében minden, ami digitalizálható), de a számítógép memóriájában végleg bináris számok véges sorozatává egyszer södnek.

Ahhoz, hogy a program (bármilyen nyelven is legyen megírva) hozzá tudjon férni az adatokhoz, nagyszámú különböz típusú változót használ.
Egy programozási nyelvben egy változó majdnem mindegy milyen változónévként jelenik meg, a számítógép számára egy memóriacímet jelöl hivatkozásról van szó, vagyis egy meghatározott helyr l a RAM-ban.

Ezen a helyen egy jól meghatározott érték van tárolva. Ez az igazi adat, ami bináris számok sorozata formájában van tárolva, de ami az alkalmazott programozási nyelv szemében nem feltétlenül egy szám. Szinte bármilyen « objektum » lehet, ami elhelyezhet a számítógép memóriájában, mint például: egy egész, egy valós szám, egy vektor, egy karakterlánc, egy táblázat, egy függvény, stb.

A programozási nyelv különböz változótípusokat (egész, valós, karakterlánc, lista, stb.) használ a különböz lehetséges tartalmak egymástól történ megkülönböztetésére.


1.4 Változónevek és foglalt szavak

A változóneveket mi választjuk meg meglehet sen szabadon. Ennek ellenére törekednünk kell, hogy jól válasszuk meg ket. El nyben kell részesíteni az elég rövid neveket, amik világosan kifejezik, hogy mit tartalmaz az illet változó. Például: az olyan változónevek, mint magasság, magas, vagy mag jobbak a magasság kifejezésére, mint x.

Egy jó programozónak ügyelni kell arra, hogy az utasítássorait könny legyen olvasni.
Ezen kívül a Pythonban a változóneveknek néhány egyszer szabálynak kell eleget tenni :
A változónév az (a - z , A - Z) bet  k és a (0 - 9) számok sorozata, aminek mindig bet  vel
kell kezd  dni.
Csak az ékezetnélküli bet  k a megengedettek. A szóközök, a speciális karakterek, mint
pl.: $, #, @, stb. nem használhatók. Kivétel a _ (aláhúzás).
A kis- és nagybet  k különböz  nek számítanak.
Figyelem : Jozsef, jozsef, JOZSEF különböz változók. Ügyeljünk erre !

Váljon szokásunkká, hogy a változóneveket kisbet kkel írjuk (a kezd bet t is) . Egy egyszer konvencióról van szó, de ezt széles körben betartják. Nagybet ket csak magának a szónak a belsejében használjunk, hogy fokozzuk az olvashatóságot, mint például: tartalomJegyzék.
További szabály: nem használható változónévként az alább felsorolt 28 «foglalt szó » (ezeket a Python használja) :
and assert break class continue
def del elif else except
exec finally for from global
if import in is lambda
not or pass print raise
return try while yield






4

1.5 Hozzárendelés vagy értékadás

A változóhoz való « érték hozzárendelés » vagy « értékadás » kifejezések egyenérték ek. Egy olyan m veletet jelölnek, amely kapcsolatot teremt a változónév és a változó értéke (tartalma) között.

A Pythonban számos más nyelvhez hasonlóan a hozzárendelés m veletét az egyenl ségjel reprezentálja1 :
n = 7 # n-nek a 7-et adjuk értékül

msg = "Mi újság ?" # A "Mi újság ?" értéket adjuk msg-nek
pi = 3.14159 # pi nev változóhoz hozzárendeljük az értékét
A fenti három értékadó utasítás mindegyikének a hatása több m velet végrehajtása a számítógép memóriájában: :
változónév létrehozása és bejegyzése a memóriába ;

változónévhez jól meghatározott típus egy speciális érték létrehozása és tárolása a memóriában ;
kapcsolat létesítése a változónév és a megfelel érték memóriahelye között (mutatók bels rendszere segítségével)


1.6 Változó értékének a kiírása

A fenti gyakorlat következményeként három változónk van: n, msg, pi. Programban mindig a print utasítást használjuk az érték kiíratásához:

print msg

A print utasítás szigorúan csak a változó értékét írja ki, úgy ahogyan az kódolva van.


1.7 Operátorok és kifejezések

Az értékeket és a rájuk hivatkozó változókat operátorok segítségével kifejezésekké kombináljuk.

a, b = 7.3, 12

y = 3*a + b/5

Ebben a példában az a és b változókhoz el ször hozzárendeljük a 7.3 és 12 értékeket. A Python automatikusan a « valós » típust rendeli az a és az « egész » típust a b változóhoz. A példa második sorában az új y változóhoz rendeljük hozzá egy kifejezés eredményét, ami a

* , + és / operátorokat kombinálja az a, b, 3 és 5 operandusokkal. Az operátorok speciális szimbólumok, amiket olyan egyszer matematikai m veletek reprezentálására használunk, mint az összeadás vagy a szorzás. Az operandusok az értékek, amiket az operátorok segítségével kombinálunk.
A Python minden egyes kifejezést kiértékel, amit beírunk neki, legyen az akármilyen bonyolult és ennek a kiértékelésnek az eredménye mindig egy érték. Ehhez az értékhez automatikusan hozzárendel egy típust, ami függ attól, hogy mi van a kifejezésben. A fenti példában y valós típusú lesz, mert a kiértékelt kifejezés legalább egy valós változót tartalmaz. Nemcsak a négy matematikai alapm velet operátora tartozik a Python operátoraihoz. Hozzájuk kell venni a hatványozás operátorát **, néhény logikai operátort, a karakterláncokon m köd operátorokat, az azonosságot és tartalmazást tesztel operátorokat, stb. Minderr l a kés bbiekben lesz szó.



5

Rendelkezésünkre áll a modulo operátor, amit a % szimbólum jelöl. Ez az operátor egy számnak egy másik számmal való egészosztásából származó maradékát adja meg. A kés bbiekben nagyon hasznos lesz, amikor azt vizsgáljuk, hogy egy a szám osztható-e egy b számmal. Elég azt megnézni, hogy az a % b eredménye egyenl e nullával.


1.8 A m  veletek prioritása

Ha egy kifejezésben egynél több operátor van, akkor a m veletek végrehajtásának sorrendje a prioritási szabályoktól függ. A Pythonban a prioritási szabályok ugyanazok, mint amiket matematikából ismerünk:

zárójelek. Ezek a legmagasabb prioritásúak. Azt teszik lehet vé, hogy az általunk kívánt sorrendben történjen egy kifejezés kiértékelése. Így 2*(3-1) = 4 , és (1+1)**(5-2) = 8.

hatványozás. A hatványok kiszámolására a többi m  velet el tt kerül sor.
Így 2**1+1 = 3 (és nem 4),  és  3*1**10 = 3 (és nem 59049 !).

szorzás és osztás, azonos prioritással. Ezeket az összeadás és kivonás el tt értékeli ki. Így 2*3-1 = 5 (és nem 4), és 2/3-1 = -1 (Alapértelmezésben a Python egészosztást végez.)
Ha két operátor azonos prioritású, akkor a végrehajtásuk balról jobbra történik. Így az 59*100/60 kifejezésben el ször a szorzást, majd ezt követ en , az 5900/60 osztást végzi el, aminek az eredményet 98. Ha el ször az osztást végezné el, akkor az eredmény 59 lenne (emlékezzünk rá, hogy itt egy egészosztásról lenne szó).


1.9 Kompozíció

Eddig egy programozási nyelv különböz elemeit tanulmányoztuk : a változókat, a kifejezéseket és az utasításokat, de azt nem vizsgáltuk, hogy hogyan lehet ezeket egymással kombinálni.

Egy magasszint programozási nyelv egyik er ssége, hogy különböz elemek kombinálásával összetett utasításokat hozhatunk létre. Így például, ha tudjuk hogyan adunk össze két számot és hogyan íratunk ki egy értéket, akkor a két utasítást egyetlen utasítássá kombinálhatjuk :

print 17 + 3

Ez a nyilvánvalónak t tulajdonság fogja lehet vé tenni az összetett algoritmusok világos és tömör programozását.

h, m, s = 15, 27, 34

print "az éjfél óta eltelt másodpercek száma = ", h*3600 + m*60 + s

Figyelem : van egy megszorítás arra nézve, hogy miket lehet kombinálni :

Amit egy kifejezésben az egyenl ségjel baloldalán helyezünk el, annak mindig egy változónak kell lenni, nem pedig egy kifejezésnek. Ez abból a tényb l fakad, hogy az egyenl ségjelnek nem ugyanaz a jelentése, mint a matematikában. Így például az m + 1 = b utasítás szabálytalan.
A matematikában viszont elfogadhatatlan a = a + 1 -et írni, pedig ez az írásmód igen gyakori a programozásban. Az a = a + 1 utasítás az a változó értékének eggyel történ megnövelését jelenti.







6

Feladat – Henger


Kérjük be a konzolról egy henger sugarát és magasságát cm-ben, majd

- írjuk ki a henger térfogatát!

- Írjuk ki a henger súlyát, ha ez tömör vashenger, és ha fahenger! A kiírásokban a számokat kerekítsük 2 tizedesre!

# -*- coding: ISO-8859-2 -*-


from math import *
rstr = raw_input("Sugár (cm)? ")

mstr = raw_input("Magasság (cm)? ")
r = float(rstr)
m = float(mstr) terf = r * r * pi * m vas = terf * 7.8

fa = terf * 0.7

print "Térfogat: ",round(terf,2)," cm3"

print "Vashenger: ",round(vas,2)," g"

print "Fahenger: ",round(fa,2)," g"

A második sorban a math modulra hivatkozunk, hogy el tudjuk érni annak beépített függvényeit, jelen esetben a pi-t.

A float függvény a paraméterében megadott sztringet valós számmá alakítja át.
A round függvény az adott valós számot a megadott számú tizedesjegyre kerekíti.


1.10  Függvénymodul importálása

Már találkoztunk a nyelvbe beépített függvények fogalmával, mint amilyen például a float() függvény, ami a karakterláncot valós számmá alakítja, vagy az int(), amely egész számmá alakít. Magától értet , hogy nem lehet az összes elképzelhet függvényt a Python standardba belevenni. A nyelvbe beépített függvények száma viszonylag csekély : ezek azok, amik nagyon gyakran használhatók. A többiek moduloknak nevezett külön fájlokban vannak csoportosítva.

A modulok tehát fájlok, amik függvénycsoportokat fognak egybe. A kés bbiekben majd meglátjuk, hogy kényelmesebb egy nagyméret programot több kisebb méret részre felbontani, hogy egyszer sítsük a karbantartást. Egy jellegzetes Python-alkalmazás tehát egy programból és egy vagy több modulból áll, melyek mindegyike kiegészít függvények definícióit tartalmazza.

Nagyszámú modult adnak hivatalosan a Pythonnal. Más modulokat más szolgáltatóknál találhatunk. Gyakran egymással rokonságban lév függvénycsoportokat próbálnak meg ugyanabba a modulba összefogni, amit könyvtárnak nevezünk.

A math modul például számos olyan matematikai függvény definícióját tartalmazza, mint a sinus, cosinus, tangens, négyzetgyök, stb. Ezeknek a függvényeknek a használatához elég a scriptünk elejére beszúrni a következ sort :

from math import *

Ez a sor jelzi a Pythonnak, hogy az aktuális programba bele kell venni a math modul minden függvényét (ezt jelzi a * ). Ez a modul egy matematikai függvénykönyvtárat tartalmaz.
A scriptbe például az alábbiakat írjuk:



7


gyok = sqrt(szam) ez a gyok nev változóhoz rendeli a szam négyzetgyökét,

sinusx = sin(szog) ez a sinusx nev változóhoz rendeli a szog szinuszát radiánban, stb.

A függvény valamilyen név és a hozzá kapcsolt zárójelek formájában jelenik meg példa : sqrt()
A zárójelekben egy vagy több argumentumot adunk át a függvénynek példa : sqrt(121)
a függvénynek van egy visszatérési értéke (azt is mondjuk, hogy « visszaad » egy értéket)
példa : 11.0

Feladat – Bank


Ha beteszünk a bankba egy adott összeget, adott éves kamatszázalékra, adott hónapra, mennyi pénzt vehetünk majd fel az id lejártakor?

# -*- coding: ISO-8859-2 -*-from math import *
osszegstr = raw_input("Összeg(Ft)? ") honapstr = raw_input("Hónap? ") kamatstr = raw_input("Kamat%? ") osszeg = float(osszegstr)
honap = float(honapstr) kamat = float(kamatstr)

ujosszeg = osszeg * pow(1+kamat/100,honap/12)

print honap," hónap múlva ",round(ujosszeg,0)," Ft-ot vehet ki."


FELADATOK:

1. Kérd be a konzolról a felhasználó nevét, majd írd ki a következ  jókívánságot:

Kedves <<X>>! Sikeres Python programozást!

2. Kérd be a konzolról egy téglatest három élének hosszúságát, majd írd ki a hasáb felszínét és térfogatát!

3. Tárold konstansokban a krumpli, a hagyma és a padlizsán egységárát! Írj olyan programot, amely bekéri, hogy mib l mennyit óhajt a vásárló, majd készítsen egy számlát a következ formában:
Krumpli : 2.5 kg * 70 Ft/kg = 175 Ft
Hagyma : 3.0 kg * 98 Ft/kg = 294 Ft
Padlizsán : 10.0 kg * 200 Ft/kg = 2000 Ft
-----------------------------------------------------------------------------------

Összesen 2469 Ft

4. Kérje be a gömb sugarát, majd írja ki a gömb felszínét és térfogatát!

5. Ha a számla ÁFA összege a számla nettó értékének egy adott százaléka, akkor hány százalék ÁFÁ-t tartalmaz a számla bruttó összege? Készíts a problémára egy kisegít programot! Páldául 25%-os ÁFA esetén a számla 20% ÁFÁ-t tartalmaz, 12%-os ÁFA esetén a számla ÁFA tartalma 10,71%.



8

6. Feri pénzt kap. Hogy mennyit, azt kérje be a program. A kifizetéshez 5000, 1000, 500 és 100 Ft-os címletek állnak rendelkezésre – a maradékot Feri nem kapja meg. Feltételezzük, hogy minden címletb l van elég, és a lehet legkevesebb számú pénz kerül kiosztásra. Milyen címletb l hányat kapott Feri, és mennyit hagyott ott ajándékba.


2. Szelekciók

Ha igazán hasznos programokat szeretnénk írni, akkor olyan technikákra van szükség, amik lehet vé teszik a programvégrehajtás különböz irányokba történ átirányítását attól függ en, hogy milyen feltételekkel találkozunk. Ehhez olyan utasítások kellenek, amikkel tesztelni lehet egy bizonyos feltételt és következményként módosítani lehet a program viselkedését.


2.1 Egyágú szelekció - if

Az if utasítás a legegyszer  bb ezek közül a feltételes utasítások közül.

a = 150

if (a > 100):
print "a meghaladja a százat"

Azt a kifejezést, amit zárójelek közé tettünk, mostantól fogva feltételnek nevezzük. Az if ennek a feltételnek a tesztelését teszi lehet vé. Ha a feltétel igaz, akkor a « : » után beljebb igazított utasítást hajtja végre a Python. Ha a feltétel hamis, semmi sem történik. Jegyezzük meg, hogy az itt alkalmazott zárójelek opcionálisak a Pythonban. Ezeket az olvashatóság javítása érdekében alkalmazzák. Más nyelvekben kötelez k lehetnek.

Feladat – Fizetés


Kérjük be a konzolról egy alkalmazott fizetését! Ha ez a fizetés 100 000 forintnál nem nagyobb, akkor emeljük meg 25%-kal! Végül írjuk ki az alkalmazott fizetését!

# -*- coding: ISO-8859-2 -*-


fizstr = raw_input("Fizetés? ")

fiz = int(fizstr)

if (fiz < 100000) :

fiz = fiz * 1.25

print "Az új fizetés: ",fiz


2.2 Kétágú szelekció – if .. else

a = 20

if (a > 100):
print "a meghaladja a százat"
else:
print "a nem haladja meg a százat"




9

Az else (« különben ») utasítás egy alternatív végrehajtás programozását teszi lehet vé, így a programozónak két lehet ség között kell választani.

Feladat – Jó szám


Kérjünk be a konzolról egy valós számot! A szám akkor jó, ha 1000 és 2000 közötti páros egész (a határokat is beleértve). Írjuk ki, hogy a szám jó, vagy nem jó!


# -*- coding: ISO-8859-2 -*-


szamstr = raw_input("Szám? ")

szam = int(szamstr)

if (szam >= 1000) and (szam <= 2000) and (szam % 2 == 0):

print "A szám jó."

else:
print "A szám nem jó."


2.3 Relációs operátorok

Az if utasítás után kiértékelt feltétel a következ relációs operátorokat tartalmazhatja :

x == y # x egyenl y -nal
x != y # x nem egyenl y -nal
x > y # x nagyobb, mint y
x < y # x kisebb, mint y
x >= y # x nagyobb, vagy egyenl mint y
x <= y # x kisebb, vagy egyenl mint y

a = 7

if (a % 2 == 0):
print "a páros"
print "mert 2-vel való osztása esetén a maradék nulla"
else:
print "a páratlan"

Jól jegyezzük meg, hogy két érték egyenl ségét a dupla egyenl ségjel operátorral teszteljük, nem pedig az egyszeres egyenl ségjellel1. (Az egyszeres egyenl ségjel egy értékadó operátor.)


2.4 Logikai operátorok

A logikai kifejezésekre alkalmazhatók a not (nem), az and (és) és az or (vagy) m veletek. A m veletek eredményeit a következ igazságtáblák szemléltetik: (true = igaz; false = hamis)
x not x
true false
false true










10


x y x and y
true true true
true false false
false true false
false false false

x y x or y
true true true
true false true
false true true
false false false


2.5 Többágú szelekciók – else..elif..else

Az elif (az « else if » összevonása) utasítást használva még jobb megoldást tudunk adni :

a = 0
if a > 0 :
print "a pozitív"
elif a < 0 :
print "a negatív"

else:
print "a nulla"

Feladat – Kor


Olvassunk be egy nem negatív egész számot, valakinek az életkorát! Kortól függ en írjuk ki a megfelel szöveget:
0 – 13 évig: Gyermek
14 – 17 évig: Fiatalkorú
18 – 23 évig: Ifjú
24 – 59 évig: Feln  tt
60 évt l Id  s

# -*- coding: ISO-8859-2 -*-


korstr = raw_input("Életkor? ")

kor = int(korstr)

if (kor <= 13):

print "Gyermek"
elif (kor <= 17):
print "Fiatalkorú"
elif (kor <= 23):
print "Ifjú"
elif (kor <= 59):
print "Feln tt"
else:
print "Id s"





11


2.6 Összetett utasítások – Utasításblokkok

Az if utasítással használt konstrukció az els összetett utasításunk. Hamarosan másfélékkel is fogunk találkozni. A Pythonban minden összetett utasításnak mindig ugyanaz a szerkezete : egy fejsor, ami kett spontra végz dik, ez alatt következik egy vagy több utasítás, ami a fejsor alatt be van húzva.

Fejsor:

a blokk els utasítása
... ...
... ...
a blokk utolsó utasítása

Ha a fejsor alatt több behúzott utasítás van, akkor mindegyiknek pontosan ugyanannyira kell behúzva lenni (például 4 karakterrel kell beljebb lenni). Ezek a behúzott utasítások alkotják az utasításblokkot. Az utasításblokk : egy logikai együttest képez utasítások sorozata, ami csak a fejsorban megadott feltételek teljesülése esetén hajtódik végre. Az el bekezdés példájában az if utasítást tartalmazó sor alatti két behúzott sor egy logikai blokkot alkot: ez a két sor csak akkor hajtódik végre, ha az if -el tesztelt feltétel igaz, vagyis ha a 2-vel való osztás maradéka nulla.


2.7 Egymásba ágyazott utasítások

Komplex döntési struktúrák létrehozásához egymásba ágyazható több összetett utasítás.

if torzs == "gerincesek": # 1
if osztaly == "eml sök": # 2
if rend == "ragadozók": # 3
if csalad == "macskafélék": # 4
print "ez egy macska lehet" # 5
print "ez minden esetre egy eml  s" # 6
elif osztaly == 'madarak': # 7
print "ez egy kanári is lehet" # 8
print"az állatok osztályozása összetett" # 9

A programrészlet csak abban az esetben írja ki az « ez egy macska lehet » -et, ha az els négy feltétel igaz.

Az « ez minden esetre egy eml s » kiírásához szükséges és elégséges, hogy az els két feltétel igaz legyen. Az utóbbi mondatot (6. sor) kiírató utasítás ugyanazon a behúzási szinten van, mint az if rend == ''ragadozók'' (3. sor). A két sor tehát ugyanannak a blokknak a része, ami akkor hajtódik végre, ha az 1. és 2. sorban tesztelt feltételek igazak.
Az « ez talán egy kanári » szöveg kiírásához az szükséges, hogy a törzs nev változó a « gerincesek » értéket, és az osztály nev változó a « madarak » értéket tartalmazza.
A 9. sor mondatát minden esetben kiírja, mivel ugyanannak az utasításblokknak a része, mint az 1. sor.


2.8 A Python néhány szintaktikai szabálya

Az el ek alapján összefoglalunk néhány szintaktikai szabályt :




12

Az utasítások és a blokkok határait a sortörés definiálja

Számos programozási nyelvben minden sort speciális karakterrel kell befejezni (gyakran pontos vessz vel). A Pythonban a sorvégejel játsza ezt a szerepet. (A kés bbiekben majd meglátjuk, hogy hogyan hágható át ez a szabály, hogy egy összetett kifejezést több sorra terjesszünk ki. Egy utasítássort kommenttel is befejezhetünk. Egy Python komment mindig a
# karakterrel kezd dik. Ami a # karakter és a LF (linefeed) karakter között van, a fordító figyelmen kívül hagyja.
A nyelvek többségében az utasításblokkot speciális jelekkel kell határolni (néha a begin és end utasításokkal) A C++ -ban és Java -ban, például, az utasításblokkot kapcsos zárójelekkel kell határolni. Ez lehet vé teszi, hogy az utasításblokkokat egymás után írjunk anélkül, hogy a behúzásokkal és a sorugrásokkal foglalkoznánk. Azonban ez zavaros, nehezen olvasható programok írásához vezethet. Ezért minden programozónak, aki ezeket a nyelveket használja azt tanácsolom, hogy alkalmazzák a sorugrásokat és a behúzásokat is a blokkok jó vizuális határolására.

A Pythonban használnunk kell a sorugrásokat és a behúzásokat, viszont nem kell más blokkhatároló szimbólumokkal foglalkoznunk. Végeredményben a Python olvasható kódok írására és olyan jó szokások felvételére kényszerít bennünket, amiket meg fogunk rizni más programozási nyelvek használata során is.


Összetett utasítás = Fej , kett spont , behúzott utasítások blokkja

Az utasításblokkok mindig egy jóldefiniált utasítást tartalmazó fejsorhoz kapcsolódnak (if, elif, else, while, def, ...), ami kett spontra végz dik.

A blokkokat behúzás határolja: egyazon blokk minden sorának pontosan ugyanúgy kell behúzva lenni (vagyis ugyanolyan számú bet közzel kell jobbra eltolva lenniük2). A behúzásra akármennyi szóközt használhatunk, a programok többsége a 4 többszöröseit alkalmazza.
Jegyezzük meg, hogy a legküls blokknak (1. blokk) a bal margón kell lenni (semmibe sincs beágyazva).


A space-eket és a kommenteket rendszerint figyelmen kívül hagyja az interpreter

A sor elején lév - a behúzásra szolgáló - szóközökt l eltekintve az utasítások és kifejezések belsejében elhelyezett szóközöket majdnem mindig figyelmen kívül hagyjuk (kivéve, ha ezek egy karakterlánc részét képezik). Ugyanez vonatkozik a kommentekre : ezek mindig a # karakterrel kezd dnek és az aktuális sor végéig tartanak.

FELADATOK:

1. Kérd be egy telek oldalait méterben! Írd ki a telek területét négyszögölben! (1 négyszögöl = 3,6 m2). Ha a telek 100 négyszögölnél kisebb, akkor írja ki, hogy túl kicsi!

2. Van egy henger alakú hordónk, melybe nem tudjuk, hogy belefér-e a rendelkezésre álló bor. Kérd be a bor mennyiségét literben, majd a hordó összes szükséges adatát cm-ben. Adj tájékoztatást, hogy hány literes a hordó, és hogy belefér-e a hordóba a bor! Ha belefér, akkor add meg, hogy mennyi férne még bele! Írd ki százalékosan is a telítettséget! Az adatokat egészre kerekítve írd ki!





13

3. Kérj be egy évszámot! Ha a beütött szám negatív, akkor adj hibajelzést, ha nem, akkor állapítsd meg, hogy az évszám osztható-e 17-tel, vagy nem!

4. Kérd be Zsófi, Kati és Juli születési évét. Írd ki a neveket udvariassági sorrendben (el re az id sebbeket…)!

5. Kér be egy egyjegy , nem negatív számot! Írd ki a szám szöveges formáját (1=egy, 2=kett stb.)

6. Kérj be egy egész óra értéket. Ha a szám nem 0 és 24 óra között van, akkor adjon hibaüzenetet, egyébként köszönjön el a program a napszaknak megfelel en! 4-9: Jó reggelt!, 10-17: Jó napot!, 18-21: Jó estét!, 22-3: Jó éjszakát!

7. Egy dolgozatra annak pontszámától függ en a következ  osztályzatot adják:
elégtelen (1): 0 – 29
elégséges (2): 30 – 37
közepes (3): 38 – 43
(4): 44 – 49
jeles (5): 50 – 55
Kérje be a dolgozat pontszámát, majd írja ki az osztályzatot számmal és bet  vel!


3. Iterációk

Az egyik dolog, amit a számítógépek a legjobban csinálnak, az az azonos feladatok hiba nélküli ismétlése. Az ismétl feladatok programozására léteznek eljárások. Az egyik legalapvet bbel fogjuk kezdeni : a while utasítással létrehozott ciklussal.


3.1 A while utasítás

a = 0

while (a < 7): # (ne felejtsük el a kett  spontot !)
a = a + 1 # (ne felejtsük el a behúzást !)
... print a

A while jelentése : « amíg ». Ez az utasítás jelzi a Pythonnak, hogy az utána következ utasításblokkot mindaddig folyamatosan kell ismételnie, amíg a feltétel igaz.
Mint az el fejezetben tárgyalt if utasítás, a while utasítás is egy összetett utasítást kezd meg. A kett spont a sor végén a megismétlend utasításblokkot vezeti be, aminek kötelez en beljebb igazítva kell lenni. Ahogyan azt az el fejezetben megtanultuk, egyazon blokk valamennyi utasításának azonos mértékben kell behúzva lenni (vagyis ugyanannyi szóközzel kell jobbra eltolva lenniük).

Létrehozhatunk tehát olyan programhurkokat, ami bizonyos számú alkalommal megismétli a behúzott utasítások blokkját. Ez a következ képpen m ködik :

A while utasítás esetén a Python a zárójelben lev feltétel kiértékelésével kezdi. (A zárójel opcionális. Csak a magyarázat világossá tétele érdekében használatos)
Ha a feltétel hamis, akkor a következ blokkot figyelmen kívül hagyja és a programvégrehajtás befejez dik1.
Ha a feltétel igaz, akkor a Python a ciklustestet alkotó teljes utasításblokkot végrehajtja, vagyis :



14

az a = a + 1 utasítást, ami 1-gyel növeli az a változó tartalmát a print utasítást, ami kiíratja az a változó aktuális értékét

amikor ez a két utasítás végrehajtódott, akkor tanúi voltunk az els iterációnak, és a programhurok, vagyis a végrehajtás visszatér a while utasítást tartalmazó sorra. Az ott található feltételt újra kiértékeli és így tovább.

Ha példánkban, az a < 7 feltétel még igaz, a ciklustest újra végrehajtódik és folytatódik a ciklus.
Megjegyzések :

A feltételben kiértékelt változónak a kiértékelést megel en léteznie kell. (Egy értéknek kell már hozzárendelve lenni.)
Ha a feltétel eredetileg hamis, akkor a ciklustest soha sem fog végrehajtódni.

Ha a feltétel mindig igaz marad, akkor a ciklustest végrehajtása vég nélkül ismétl dik (de legalábbis addig, amíg a Python maga m ködik). Ügyelni kell rá, hogy a ciklustest legalább egy olyan utasítást tartalmazzon, ami a while-lal kiértékelt feltételben megváltoztatja egy beavatkozó változó értékét úgy, hogy ez a feltétel hamissá tudjon válni és a ciklus befejez djön.
Végtelen ciklus példája (kerülend  ) :
n = 3
while n < 5:
print "hello !"

Feladat – Bank


Van egy kis megtakarított pénzem. Arra vagyok kíváncsi, hogy hány hónap múlva éri el ez az összeg a bankban a 100 000 Ft-ot, ha havi 2%-os kamattal számolhatok?

# -*- coding: ISO-8859-2 -*-


penzstr = raw_input("Alapt  ke? ")

penz = float(penzstr)
honap = 0

while (penz < 100000):

penz = penz * 1.02
honap = honap + 1

print honap," hónap múlva felvehetsz ",penz," Ft-ot"

Feladat – Jegyek száma


Kérjünk be a konzolról egy számot! Írjuk ki a jegyeinek a számát!

# -*- coding: ISO-8859-2 -*-szamstr = raw_input("Szám? ") szam = int(szamstr)

seged = szam jegySzam = 0

while (seged != 0):

seged = seged / 10
jegySzam = jegySzam + 1

print szam," jegyeinek száma: ",jegySzam




15

Feladat – Oszthatóság


Két szám között határozzuk meg az els olyan számot, amelyik osztható egy megadott számmal!

# -*- coding: ISO-8859-2 -*-


kezdstr = raw_input("Egyik szám? ")

vegstr = raw_input("Másik szám? ")
osztostr = raw_input("Osztó? ")
kezd = int(kezdstr)
veg = int(vegstr)
oszto = int(osztostr)

if (kezd > veg):

seged = kezd
kezd =veg
veg = seged

while (kezd % oszto != 0) and (kezd <= veg):

kezd = kezd + 1

if (kezd > veg):

print "Nem található ilyen szám"
else:
print "Az els ilyen szám: ",kezd


3.2 Léptet ciklus - for

for i in range(5):

print i

Eredmény:

0
1
2
3
4

for i in range(3,5):

print i

Eredmény:

3
4

for i in range(3,15,4):

print i

Eredmény:



16

3

7
11

for i in range(20,-20,-6):

print i

Eredmény:

20
14
8
2
-4
-10
-16

Feladat – Fizetés


Most 2009-et írunk. Írjuk ki, hogy mostantól 2026-ig melyik évben mennyi lesz József fizetése, ha évenként 12%-kal növekszik! József jelenlegi fizetését a konzolról kérjük be!


# -*- coding: ISO-8859-2 -*-


fizstr = raw_input("Fizetés? ")

fiz = float(fizstr)

for i in range(2009,2027):

print i,"-ben a fizetés: ",round(fiz,0)
fiz = fiz * 1.12

Feladat – Szök év


Írjuk ki megadott két évszám között az összes szök  évet, majd a szök évek számát!

# -*- coding: ISO-8859-2 -*-


kezdstr = raw_input("Egyik évszám? ")
vegstr = raw_input("Másik évszám? ")

kezd = int(kezdstr)
veg = int(vegstr)
szokoevSzam = 0

if (kezd > veg):

seged = kezd
kezd =veg
veg = seged

for ev in range(kezd,veg+1):

if (ev % 400 == 0) or ((ev % 100 != 0) and (ev % 4 == 0)):
print ev
szokoevSzam = szokoevSzam + 1

print "A szök  évek száma: ",szokoevSzam




17

3.3 Adatok feldolgozása végjelig

Feladat – Kör kerülete


A felhasználó adott sugarú körök kerületére kíváncsi. Amikor beüt egy sugarat, mi kiírjuk a kör kerületét. Ha már nem kíváncsi több eredményre, akkor a kör sugaránál nullát (végjelet) kell ütnie!


# -*- coding: ISO-8859-2 -*-from math import *


r = 10

while (r != 0):

r = float(raw_input("A kör sugara: ")) k = 2 * r * pi
if (r != 0):

print "A kör kerülete: ",k


3.4 Megszámlálás

Feladat – Megszámol


Kérjünk be számokat a felhasználótól 0 végjelig. Írjuk ki a bevitt számok számát!

# -*- coding: ISO-8859-2 -*-


szam = 10

db = 0

while (szam != 0):

szam = float(raw_input("Szám: "))
if (szam != 0):
db = db + 1

print "Darabszám: ",db

Feladat – Prímszámok


Adott két szám között hány darab prímszám van? Írjuk is ki ket!

# -*- coding: ISO-8859-2 -*-


db = 0

kezdet = int(raw_input("Egyik szám? "))
veg = int(raw_input("Másik szám? "))

if (kezdet > veg):

seged = kezdet
kezdet = veg
veg = seged

for szam in range(kezdet,veg+1):

i=2



18

while (i <= szam/2) and (szam % i != 0):

i = i + 1
if (i > szam / 2):
print szam
db = db + 1

print "A prímek száma: ",db


3.5 Összegzés, átlagszámítás

Feladat – Átlag


Olvassuk be a számokat 0 végjelig, majd írjuk ki ezek összegét, darabszámát és átlagát!

# -*- coding: ISO-8859-2 -*-


db = 0

osszeg = 0.0
szam = 10.0

while (szam != 0):

szam = float(raw_input("Szám? "))
if (szam != 0):
osszeg = osszeg + szam
db = db + 1

if (db > 0):

print "A számok összege: ",osszeg
print "Darabszám: ",db
atlag = osszeg/db
print "Átlag: ",atlag

else:
print "Nincs beolvasott szám."


3.6 Minimum- és maximumkiválasztás

Feladat – Maximális számla


Kérjünk be a felhasználótól számlaösszegeket! A bevitel befejez dik, ha az összegnél nullát ütnek. Írjuk ki a legnagyobb összeg számla sorszámát és összegét!


# -*- coding: ISO-8859-2 -*-


maxOsszeg = -1

szam = 0
osszeg = 10
db = 0

while (osszeg != 0):

osszeg = int(raw_input("Összeg? "))



19

db = db + 1


if (osszeg != 0) and (osszeg > maxOsszeg):
maxOsszeg = osszeg
szam = db

if (maxOsszeg > 0):

print "A maximális számla száma: ",szam
print "A maximális számla összege: ",maxOsszeg else:
print "Nincs érvényes bevitel."


3.7 Menükészítés

Feladat – Menü


Készítsünk egy menüt! Három dologból lehet választani: egyik funkció, másik funkció és
kilépés. Jelenítsük meg a választási lehet ségeket: <E>gyik / <M>ásik / <V>ége ?

Az Egyik, illetve a Másik funkció választására ismételten jelenjen meg egy-egy szöveg, a Vége választására pedig legyen vége a programnak.

# -*- coding: ISO-8859-2 -*-


menu = "M"

while (menu != "V") and (menu != "v"):

menu = raw_input("<E>gyik / <M>ásik / <V>ége ? ")
if (menu == "E") or (menu == "e"):
print "Egyik funkció."
if (menu == "M") or (menu == "m"):
print "Másik funkció."

FELADATOK

1. Szüretkor sorban lemérik a puttonyokban lév sz súlyát. Készítsünk programot, amely segítségével ezek az értékek feldolgozhatók. Kíváncsiak vagyunk a nap végén, hogy összesen hány puttonnyal, és hány kg sz t szüreteltek. Természetesen a puttonyok számát el re nem tudjuk.

2. Egészítsük ki az el feladatot: A sz t 1000 kg teherbírású gépkocsikkal szállítják el a helyszínr l. Minden esetben, amikor a sz mennyisége meghaladta az 1000 kg-ot, akkor a program figyelmeztessen: Mehet a kocsi!

3. Munkásokat veszünk fel egy adott munkára. A szükséges létszámot a program elején megkérdezzük. Az emberek csoportosan jelentkeznek. Üssük be sorban a jelentkez csoportok létszámait! Ha megvan a szükséges létszám, akkor írjuk ki, hogy „A létszám betelt”, valamint azt, hogy hány f re van szükség az utolsó csoportból!

4. Kérjük be, hogy a héten mennyi kalóriát fogyasztottunk az egyes napokon! Ezután írjuk ki az összes kalóriafogyasztásunkat, valamint a napi átlag kalóriafogyasztást!

5. Kérj be egy egész számot, és állapítsa meg, hogy hány 0 jegy szerepel benne!



20

6. Hány darab négyzetszám van 1000-ig? Írd is ki a négyzetszámokat!

7. Kérdezd meg a felhasználótól, hogy mennyi pénze van, és milyen évi kamatozással tette azt be a bankba! Ezután a program tegye lehet vé, hogy az illet többször megkérdezhesse, hogy melyik évben mennyi pénze lesz.

8. Van egy bizonyos összegünk, amelyb l számlákat szeretnénk kifizetni, de maximum tízet. Kérd be a rendelkezésre álló összeget, majd sorban a számlaösszegeket! Ha a számlák száma eléri a tízet, vagy az adott számlára már nincs pénz, adjon a program egy figyelmeztetést! Végül írd ki, hogy hány számlát sikerült kifizetni, és mennyi a ténylegesen kifizetend összeg!

9. Kérj be egy határszámot, majd írd ki eddig a számig az összes prímszámot!

10. Kérdezzük meg a felhasználótól, hogy minek a területét szeretné kiszámítani: négyzetét, téglalapét vagy körét? Kérjük be a szükséges adatokat és írjuk ki az eredményt! Ezután újra kínáljuk fel a lehet ségeket! Tegyük lehet vé azt is, hogy a felhasználó kiszálljon a programból!

11. Kérjük be, hogy a héten mennyi kalóriát fogyasztottunk az egyes napokon! Ezután írjuk ki, hogy hányadik napon fogyasztottuk a legtöbb, illetve a legkevesebb kalóriát!

4. Függvények írása

A programozás annak a m vészete, hogy a számítógépet olyan feladatok elvégzésére tanítjuk meg, amiket el leg nem tudott végrehajtani. Az egyik legérdekesebb erre szolgáló módszer az, hogy felhasználói függvények formájában új utasításokat illesszünk az általunk használt programozási nyelvbe.


4.1 Függvény fogalma, szintaktikája

Az eddig írt programjaink mind nagyon rövidek voltak, mivel a célunk csak az volt, hogy elsajátítsuk a nyelv elemeit. Amikor majd valódi projekteket kezdünk fejleszteni, gyakran rendkívül bonyolult problémékkal fogunk találkozni és a programsorok száma sokasodni fog.

Egy probléma hatékony megközelítése gyakran a problémának több, egyszer bb alproblémára való felbontásából áll, amiket azután külön vizsgálunk. (Ezek az alproblémák esetleg tovább bonthatók még egyszer bb alproblémákra és így tovább.

Másrészt gyakran el fordul, hogy ugyanazt az utasítás sorozatot többször kell alkalmaznunk egy programban és nyilván nem kívánjuk azt rendszeresen megismételni.

A függvények és az objektumosztályok eltér alprogram-struktúrák, amiket a magasszint nyelvek alkotói azért találtak ki, hogy a fent említett nehézségeket megoldják. A Python függvénydefiníciójának leírásával kezdjük. Az objektumokat és osztályokat kés bb fogjuk tanulmányozni.
Már találkoztunk különböz el re programozott függvényekkel. Most lássuk, hogyan definiáluk mi magunk új függvényeket.
A függvénydefiníció szintaxisa a Pythonban következ :







21

def függvényNeve(paraméterlista):

...

utasításblokk
...
Függvénynévnek a nyelv foglalt szavai kivételével bármilyen nevet választhatunk azzal a feltétellel, hogy semmilyen speciális vagy ékezetes karaktert sem használhatunk (az aláhúzás karakter « _ » megengedett). A változónevekhez hasonlóan f ként a kisbet k használata javasolt, nevezetesen a szavak elején (a nagybet vel kezd szavakat fenn fogjuk tartani az osztályok számára, amiket a kés bbiekben fogunk tanulmányozni).

A def utasítás az if -hez és a while -hoz hasonlóan egy összetett utasítás. Az a sor, amelyik ezt az utasítást tartalmazza kötelez en kett sponttal végz dik, ami egy utasításblokkot vezet be, amit nem szabad elfelejtenünk behúzni.

A paraméterlista határozza meg, hogy argumentumként milyen információkat kell megadni, ha majd használni akarjuk a függvényt. (A zárójel üresen is maradhat, ha a függvénynek nincs szüksége argumentumokra).

Egy függvényt gyakorlatilag úgy használunk, mint akármilyen más utasítást. A programtörzsben a függvényhívás a függvény nevéb l és az azt követ zárójelekb l áll.
Ha szükséges, a zárójelben adjuk meg azokat az argumentumokat, amiket át akarunk adni a függvénynek. Elvileg a függvénydefinícióban megadott mindegyik paraméter számára meg kell adni egy argumentumot, bár adhatók alapértelmezett értékek ezeknek a paramétereknek.

Feladat – Függvényminta


Kérjünk be számokat a konzolról 0 végjelig! Minden egyes számról állapítsuk meg, hogy az hány jegy ! A program elején és végén, valamint az egyes eredmények kiírása után húzzunk egy-egy 20 hosszúságú vonalat!.


# -*- coding: ISO-8859-2 -*-


def jegyekSzama(n):

db = 0
while (n != 0):
db = db + 1
n = n / 10
return db

def vonal():

s = ""
for i in range(20):
s = s+"-" print s

vonal()

szam = 10

while (szam != 0):

szam = int(raw_input("Szám? "))
if (szam != 0):
jsz = jegyekSzama(szam)
print "A számjegyek száma: ",jsz




22

vonal()


vonal()


4.2 Formális és aktuális paraméter

A jegyekSzama függvény a futáskor kapott szam aktuális értékéb l számítja ki a jegyek számát.

A függvény fejében deklarált paramétert formális paraméternek nevezzük, hiszen ez egészen addig nincs használatban, míg a függvényt meg nem hívjuk valamilyen aktuális paraméterrel. Egy függvénynek akárhány (nulla, egy vagy több) formális paramétere lehet. A formális paraméterlista a formális paraméterek vessz vel elválasztott sorozata.
Az aktuális paraméter bármilyen kifejezés lehet. Példánkban a függvény hívásakor lényegében a függvény futása el tt bekövetkezik az n = szam paraméterátadás. Tehát a formális paraméter felveszi az aktuális paraméter értékét.


4.3 Visszatérés a függvényb  l

Ha a függvény tartalmaz return utasítást, akkor a vezérlés visszakerül a

programhoz, és a függvény futása befejez  dik. A függvényhívás a return utáni kifejezés
aktuális értékét fogja felvenni.
Ha nincs return, akkor az alprogram befejez  dése adja vissza a vezérlést a
programnak, ilyenkor a függvénynek nincs visszatérési értéke. (Egyes programnyelvekben
az ilyen alprogramokat nevezik eljárásnak)

Egy függvényt önmagából újra meghívhatunk, miel tt a vezérlés újra visszakerülne a programhoz. Ezt a jelenséget rekurziónak nevezzük. Ilyen esetben a függvényhívásnak egy az el l teljesen független példánya születik meg. A különböz hívások mind különálló, saját lokális változókkal dolgoznak. Rekurzió esetén ügyelni kell arra, hogy ne keveredjünk végtelen ciklusba. A rekurziónak kell, hogy legyen leállító feltétele!

Feladat – Függvényminta2


Kérjünk be számokat a konzolról 0 végjelig! Minden egyes számról állapítsuk meg, hogy az hány jegy ! A program elején húzzunk egy 50 hosszú, @ karakterekb l álló vonalat! Az egyes eredmények kiírása után húzzunk egy-egy 20 hosszúságú, - jelekb l álló vonalat!. A program végén egy 50 hosszú * karakterekb l álló vonalat!


# -*- coding: ISO-8859-2 -*-


def jegyekSzama(n):

db = 0
while (n != 0):
db = db + 1
n = n / 10
return db

def vonal(mibol,mennyit):

s = ""
for i in range(mennyit):
s = s+mibol
print s



23


vonal("@",50)

szam = 10

while (szam != 0):

szam = int(raw_input("Szám? "))
if (szam != 0):
jsz = jegyekSzama(szam)
print "A számjegyek száma: ",jsz
vonal("-",20)

vonal("*",50)

Feladat – Háromszög


Írjunk olyan programot, amely egy háromszög három oldalából kiszámítja annak kerületét és területét!


# -*- coding: ISO-8859-2 -*-from math import *


def kerulet(a,b,c):

return a+b+c

def terulet(a,b,c):

s = kerulet(a,b,c)/2
return sqrt(s*(s-a)*(s-b)*(s-c))

x = float(raw_input("a: "))

y = float(raw_input("b: "))

z = float(raw_input("c: "))
print "Kerület: ",round(kerulet(x,y,z),2)
print "Terület: ",round(terulet(x,y,z),2)

Feladat – Faktoriális


Írjunk olyan programot, amely kiírja egy adott szám faktoriálisát!

# -*- coding: ISO-8859-2 -*-


def faktorialis(n):

f = 1
for i in range(1,n+1):
f = f * i
return f

szam = int(raw_input("Szám: "))

print szam,"! = ",faktorialis(szam)

Feladat – Faktoriális2


Írjunk olyan programot, amely kiírja egy adott szám faktoriálisát! Alkalmazzunk rekurzív algoritmust!




24

# -*- coding: ISO-8859-2 -*-


def faktorialis(n):

if (n == 0):
return 1
else:
return n * faktorialis(n-1)

szam = int(raw_input("Szám: "))

print szam,"! = ",faktorialis(szam)

Feladat – Fibonacci


Írjunk olyan programot, amely kiírja a Fibonacci-sorozat els n elemét!

# -*- coding: ISO-8859-2 -*-


def fibonacci(n):

if (n == 1) or (n == 2):
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)

szam = int(raw_input("Sorszám: "))

for i in range(1,szam+1):
print fibonacci(i)

FELADATOK

1. Írj olyan függvényt, amelynek két paramétere van, és az els paraméterben megadott számszor leírja a második paraméterben megadott szöveget!

2. Írj olyan függvényt, amelynek két paramétere van, és kiírja a paraméterek közötti páros számokat!

3. Írj olyan függvényt, amely visszaadja egy szám kétszeresét!

4. Írj olyan függvényt, amely egy kör sugarából visszaadja annak területét!

5. Írj olyan függvényt, amely egy gömb sugarából visszaadja annak térfogatát!

6. Írj olyan függvényt, amely visszatér a két paraméterében megadott egész szám között egész számok összegével, a határokat is beleértve!

7. Írj olyan függvényt, amely eldönti, hogy egy adott szám prímszám-e?


5. Szövegek (Stringek) kezelése

A programozási nyelvek többségében az alfanumerikus adatok kezelésére létezik egy karakterlánc (vagy angolul string) nev adatszerkezet.



25

A Pythonban string típusú adat bármilyen karaktersorozat, amit vagy szimpla idéz jelek (aposztrof), vagy dupla idéz jelek határolnak
Példák :
mondat1 = 'a kemény tojást.'
mondat2 = '"Igen", válaszolta,'
mondat3 = "nagyon szeretem"
print mondat2, mondat3, mondat1
"Igen", válaszolta, nagyon szeretem a kemény tojást.

A 3 változó : mondat1, mondat2, mondat3 tehát string típusú változó. Jegyezzük meg, hogy az olyan stringeket, melyekben aposztrofok vannak,

idéz  jelekkel határoljuk, míg az idéz  jeleket tartalmazó stringeket aposztrofokkal határoljuk.

Azt is jegyezzük meg, hogy a print utasítás a kiírt elemek közé egy bet  közt szúr be.
A « \ » (backslash) néhány kiegészít finomságot tesz lehet  vé :

Lehet vé teszi, hogy egy parancsot, ami nem fér el egy sorban, azt több sorba írjunk (ez bármilyen típusú parancsra érvényes).
Egy karakterlánc belsejében a backslash speciális karakterek (sorugrás, aposztrofok, dupla idéz jelek, stb.) beszúrását teszi lehet vé. Példák : txt3 = "E\'meg kicsoda ? kérdezte."

print txt3
E'meg kicsoda ? kérdezte.

hello = "Ez egy hosszú sor\n ami több szövegsort\ tartalmaz (Azonos módon \n m ködik, mint a C/C++.\n\
Jegyezzük meg,hogy a white space-ek\n a sor elején lényegesek.\n"

print hello
Ez egy hosszú sor
ami több szövegsort tartalmaz (Azonos módon
m ködik, mint a C/C++.
Jegyezzük meg,hogy a white space-ek
a sor elején lényegesek..

Megjegyzések :

A \n egy sorugrást idéz el .

A \' lehet vé teszi, hogy aposztrofokkal határolt karakterláncba aposztrofot szúrjunk be.
A kis/nagybet lényeges a változónevekben (Szigorúan tiszteletben kell tartanunk a kezdeti kis/nagybet választást).

« Háromszoros idéz jelek » :

Hogy egy karakterláncba könnyebben szúrjunk be speciális vagy « egzotikus » karaktereket anélkül, hogy a backslasht alkalmaznánk, vagy magát a backslasht tudjuk beszúrni, a karakterláncot háromszoros aposztroffal vagy háromszoros idéz jellel határolhatjuk :
a1 = """
Használat: izee[OPTIONS]
{ -h
-H host
}"""





26

print a1

Használat: izee[OPTIONS]

{ -h
-H host
}

A karakterláncok az összetett adatoknak nevezett általánosabb adattípus egy speciális esetét képezik. A körülményekt l függ en a karakterláncot hol mint egyetlen objektumot, hol mint különálló karakterek együttesét akarjuk kezelni. Egy olyan programozási nyelvet, mint a Pythont tehát el kell látni olyan eljárásokkal, amik lehet vé teszik egy karakterlánc egyes karaktereihez való hozzáférést. Látni fogjuk, ez nem olyan bonyolult :

Egy karakterláncot a Python a szekvenciák kategória egy objektumának tekint. A szekvenciák elemek rendezett együttesei. Ez egyszer en azt jelenti, hogy egy string karakterei mindig egy bizonyos sorrendben vannak elrendezve. Következésként a string minden egyes karakterének meghatározható a szekvenciabeli helye egy index segítségével.
Ahhoz, hogy egy adott karakterhez hozzáférjünk, a karakterláncot tartalmazó változó neve után szögletes zárójelbe írjuk a karakter stringbeli pozíciójának megfelel numerikus indexet.

Figyelem : amint azt egyebütt ellen rizhetjük, az informatikában az adatokat majdnem mindig nullától kezdve számozzuk (nem pedig egyt l). Ez a helyzet egy string karakterei esetében : Példa :
ch = "Stéphanie"
print ch[0], ch[3]
S p


5.1 Elemi m  veletek karakterláncokon

A Pythonnak számos, karakterláncok kezelésére szolgáló függvénye van (kis/nagybet s átalakítás, rövidebb karakterláncokra való darabolás, szavak keresése, stb Elemi m veletek:

Több rövid karakterláncból összerakhatunk egy hosszabbat. Ezt a m veletet összekapcsolásnak nevezzük és a + operátort használjuk rá a Pythonban. (Ez az operátor számokra alkalmazva az összeadás m veletére, míg karakterláncokra alkalmazva az összekapcsolásra szolgál ).
Példa :

a = 'A kis halból'

b = ' nagy hal lesz'
c = a + b
print c
A kis halból nagy hal lesz

Meghatározhatjuk egy karakterlánc hosszát (vagyis a karakterek számát) a len()

függvény hívásával :

print len(c)

29

Egy számot reprezentáló karakterláncot számmá alakíthatunk.



27

Példa :

ch = '8647'

> print ch + 45
==> *** error *** nem adhatunk össze egy stringet és egy számot

n = int(ch) print n + 65
8712 # OK : 2 számot összeadhatunk

Ebben a példában az int() bels függvény a stringet számmá alakítja. A float() függvény segítségével valós számmá lehet alakítani egy karakterláncot.

Feladat – E bet  k


Írjunk olyan programot, amely egy stringben megszámolja az e bet ket!

# -*- coding: ISO-8859-2 -*-


def ebetukSzama(szoveg):

db = 0
for i in range(len(szoveg)):
if (szoveg[i] == 'e') or (szoveg[i] == 'E'):
db = db + 1
return db

x = raw_input("Szöveg? ")

print "Az e bet  k száma: ",ebetukSzama(x)

Feladat – Csillagozás


Írjon egy programot, ami egy új változóba másol át egy karakterláncot úgy, hogy csillagot szúr be a karakterek közé. Így például, « gaston »-ból « g*a*s*t*o*n » lesz.!


# -*- coding: ISO-8859-2 -*-


def csillagoz(szoveg):

uj = ""
for i in range(len(szoveg)-1):
uj = uj + szoveg[i] + "*"
uj = uj + szoveg[len(szoveg)-1]
return uj

x = raw_input("Szöveg? ") print csillagoz(x)

Feladat – Megfordít


Írjon egy programot, ami egy új változóba fordított sorrendben másolja át egy karakterlánc karaktereit. Így például « zorglub » -ból « bulgroz » lesz.!









28

# -*- coding: ISO-8859-2 -*-


def fordit(szoveg):

uj = ""
for i in range(len(szoveg)-1,-1,-1):
uj = uj + szoveg[i]
return uj

x = raw_input("Szöveg? ") print fordit(x)

A karakterláncok esetében is m ködik mindegyik relációs. Ez nagyon hasznos lesz a szavak névsorba rendezésénél :

Ezek az összehasonlítások azért lehetségesek, mert a stringeket alkotó alfabetikus karaktereket a számítógép bináris számok formájában tárolja memóriájában, amiknek az értéke a karaktereknek az abc-ben elfoglalt hellyével van összekapcsolva. Az ASCII kódrendszerben például A=65, B=66, C=67, stb.1
A Python számos el re definiált függvényt bocsát a rendelkezésünkre, hogy könnyebben tudjunk mindenféle karakterm veletet végezni :
Az ord(ch) függvény bármilyen karaktert elfogad argumentumként. Visszatérési értékként a karakternek megfelel ASCII kódot adja meg. Tehát ord('A') visszatérési értéke 65.

A chr(num) függvény ennek pontosan az ellenkez jét teszi. Az argumentumának 0 és 255 közé es számnak kell lenni, a 0-t és 255-öt is beleértve. Visszatérési értékként a megfelel ASCII karaktert kapjuk meg : tehát chr(65) az A karaktert adja vissza.


5.2 A karakterláncok, mint objektumok

Az objektumokon metódusok (vagyis ezekhez az objektumokhoz kapcsolt függvények) segítségével is végezhetünk m veleteket. A Pythonban a stringek objektumok. A megfelel metódusok használatával számos m veletet végezhetünk rajtuk. Íme néhány a leghasznosabbak közül :

split() : egy stringet alakít át substringek listájává. Mi adhatjuk meg argumentumként a szeparátor karaktert. Ha nem adunk meg semmit sem, akkor az alapértelmezett argumentumérték egy szóköz :

c2 ="Votez pour moi"

a = c2.split() print a
['Votez', 'pour', 'moi']

c4 ="Cet exemple, parmi d'autres, peut encore servir"

c4.split(",")
['Cet exemple', " parmi d'autres", ' peut encore servir']

join(lista) : egyetlen karakterlánccá egyesít egy stringlistát. (Ez a metódus az el inverze.)

Figyelem : a szeparátor karaktert (egy vagy több karaktert) az a string fogja megadni, amelyikre a metódust alkalmazzuk, az argumentuma az egyesítend stringek listája :




29

b2 = ["Salut","les","copains"]

print " ".join(b2)
Salut les copains
print "---".join(b2)
Salut---les---copains

find(sch) : megkeresi az sch substring pozícióját egy stringben :

ch1 = "Cette leçon vaut bien un sajt, sans doute ?"
ch2 = "sajt"
print ch1.find(ch2)
25

count(sch) : megszámolja a sch substring el fordulásainak számát a stringben :

ch1 = "Le héron au long bec emmanché d'un long cou"
ch2 = 'long'
print ch1.count(ch2)
2

lower() : kisbet  ssé alakít egy stringet :

ch ="ATTENTION : Danger !"
print ch.lower()
attention : danger !

upper() : nagybet  ssé alakítja a karakterláncot :

ch = "Merci beaucoup"
print ch.upper()
MERCI BEAUCOUP

capitalize() : a karakterlánc els bet  jét nagybet  vé alakítja :

b3 = "quel beau temps, aujourd'hui !"
print b3.capitalize()
"Quel beau temps, aujourd'hui !"

swapcase() : minden nagybet  t kisbet  vé alakít és visszont :

ch5 = "La CIGALE et la FOURMI"
print ch5.swapcase()
lA cigale ET LA fourmi

strip() : eltávolítja a string elején és végén lév bet  közöket :

ch = " Monty Python "
ch.strip()
'Monty Python'

replace(c1, c2) : A stringben valamennyi c1 karaktert c2 -vel helyettesíti :

ch8 = "Si ce n'est toi c'est donc ton frère"
print ch8.replace(" ","*")
Si*ce*n'est*toi*c'est*donc*ton*frère








30

index(c) : megadja a c karakter stringbeli els el  fordulásának indexét :

ch9 ="Portez ce vieux whisky au juge blond qui fume"
print ch9.index("w")
16

Ezeknek a metódusoknak a többségében kiegészít argumentumokkal pontosan meg lehet adni, hogy a karakterlánc melyik részét kell kezelni. Példa :

print ch9.index("e") # a string elejet  l keresi
4 # és megtalálja az els 'e'-t
print ch9.index("e",5) # csak az 5-os indext  l keres
8 # és megtalálja a masodik 'e'-t
print ch9.index("e",15) # a 15-dik karaktert  l keres
29 # és megtalálja a negyedik 'e'-t


5.3 Karakterláncok formázása

Ez a technika minden olyan esetben nagyon hasznos, amikor különböz változók értékeib l kell egy komplex karakterláncot konstruálni.

Tegyük fel például, hogy írtunk egy programot, ami egy vizes oldat színét és mérsékletét kezeli. A színt egy szin nev változóban tároljuk és a h mérsékletet egy homers nev változóban (float típusú változó). Azt akarjuk, hogy a programunk egy új karakterláncot hozzon létre ezekb l az adatokból. Például egy ilyen mondatot : « Az oldat színe pirossá változott és h mérséklete eléri a 12,7 °C-t ».

Ezt a karakterláncot a konkatenáció operátor (a + szimbólum) segítségével összeállíthatjuk részekb l, de a str() függvényt is használnunk kellene, hogy a float típusú változóban tárolt numerikus értéket stringgé alakítsuk.

A Python egy másik lehet séget is kínál. A karakterlánc a % operátor segítségével el állítható két elemb l : a baloldalon egy formázó stringet adunk meg (valamilyen mintát) ami konverziós markereket tartalmaz és jobboldalon (zárójelben) egy vagy több objektumot ami(ke)t a Pythonnak a karakterláncba a markerek helyére kell be szúrni.
Példa :
szin ="zöld"
homers = 1.347 + 15.9
print "A színe %s és a hömérséklete %s °C" % (szin,homers)
A színe zöld és a h  mérséklete 17.247 °C

Ebben a példában a formázó string két %s konverziós markert tartalmaz, amiket a Python a szin és a homers változók tartalmával helyettesít.
A %s marker bármilyen objektumot elfogad (stringet, egészet, float-ot, ...). Más markereket alkalmazva más formázással lehet kísérletezni. Próbáljuk meg például a második markert %s -t %d-vel helyettesíteni, vagy például %8.2g -vel. A %d marker egy számot vár és azt egésszé alakítja át; a %f és %g markerek valós számokat várnak és meg tudják határozni a kiírás szélességét és pontosságát.


6. A listák

Az el fejezetben tárgyalt stringek az összetett adatokra voltak az els példák. Az összetett adatokat arra használjuk, hogy struktúráltan csoportosítunk értékegyütteseket. A lista




31

definíciója a Pythonban : szögletes zárójelbe zárt, vessz  vel elválasztott elemek csoportja.

Példa :

nap = ['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek'] print nap
['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek']

Ebben a példában nap nev változó értéke egy lista.

Megállapíthatjuk : a választott példában a listát alkotó elemek különböz típusúak lehetnek. Az els három elem string, a negyedik egész, az ötödik valós típusú, stb. (A kés bbiekben látni fogjuk, hogy egy lista maga is lehet egy listának eleme !). Ebben a tekintetben a lista fogalma meglehet sen különbözik a tömb (array) vagy az « indexelt változó » fogalmától, amivel más programozási nyelvekben találkozunk.

Jegyezzük meg, hogy a listák is szekvenciák, úgy mint a karakterláncok, vagyis objektumok rendezett csoportjai. A listát alkotó különböz elemek mindig ugyanabban a sorrendben vannak elrendezve, mindegyikükhöz külön hozzá tudunk férni, ha ismerjük a listabeli indexüket. Ezeknek az indexeknek a számozása nullától indul, nem pedig egyt l, a karakterláncokhoz hasonlóan.
Példák :
nap = ['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek']
print nap[2]
szerda
print nap[4]
20.357

A stringekt l (amik egy nem módosítható adattípust jelentenek) eltér en egy listának meg lehet változtatni az elemeit :

print nap

['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek'] nap[3] = nap[3] +47
print nap
['hétf ', 'kedd', 'szerda', 1847, 20.357, 'csütörtök', 'péntek']

A lista meghatározott elemét a következ módon helyettesíthetjük más elemmel :

nap[3] = 'Július'
print nap
['hétf ', 'kedd', 'szerda', 'Július', 20.357, 'csütörtök', 'péntek']

A len() bels függvény, amivel már a stringeknél találkoztunk, a listákra is alkalmazható. A listában lev elemek számát adja vissza :
len(nap)
7

Egy másik bels függvény - a del() - segítségével (az indexe alapján) bármelyik

elemet törölhetjük a listából :
del(nap[4])
print nap
['hétf ', 'kedd', 'szerda', 'Július', 'csütörtök', 'péntek']





32

Ugyanígy lehet  ség van arra, hogy hozzáf zzünk egy elemet egy listához, de ahhoz,

hogy ezt megtegyük meg kell gondolni, hogy a lista egy objektum, aminek az egyik
metódusát fogjuk használni:
nap.append('szombat')
print nap
['hétf ', 'kedd', 'szerda', 'Július', 'csütörtök', 'péntek', 'szombat']

A fenti példa els sorában az append() metódust alkalmaztuk a 'szombat' argumentummal a nap objektumra. Az append() metódus egy olyan függvényfajta, ami valamilyen módon a « lista » típusú objektumokhoz van kapcsolva, vagy az objektumokba van integrálva. A függvénnyel használt argumentum természetesen az az elem, amit a lista végéhez akarunk f zni.

Jegyezzük meg, hogy egy metódust úgy alkalmazunk egy objektumra, hogy egy ponttal kapcsoljuk ket össze. (El l áll annak a változónak a neve, ami egy objektumra hivatkozik, utána a pont, majd a metódus neve, ez utóbbit mindig egy zárójelpár követi).

Elemezzük például az alábbi kis scriptet és magyarázzuk meg a m ködését :
nap = ['hétf ', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat', 'vasarnap']
a, b = 0, 0
while a<25:
a = a + 1
b = a % 7
print a, nap[b]

Az 5. sorban a « modulo » operátort használjuk, amivel már el leg találkoztunk és ami jó szolgálatokat tehet a programozásban. Számos nyelvben (a Pythonban is) a % jel reprezentálja.

Feladat – Szétválogatás


Írjon egy programot, ami pozitív egész számokat kér be 0 végjelig, majd szétválogatja ket egy-egy listába, aszerint, hogy párosak, vagy páratlanok!

# -*- coding: ISO-8859-2 -*-


szam = 10

paros = []
paratlan = []

while (szam != 0):

szam = int(raw_input("Szám? "))
if (szam != 0):
if (szam % 2 == 0):
paros.append(szam)

else:
paratlan.append(szam)

print "Párosak: ",paros

print "Páratlanok: ",paratlan








33

6.1 Lista módosítására szolgáló haladó « slicing » (szeletelési) technikák

Egy beépített utasítással (del) törölhetünk egy elemet egy listából, illetve egy beépített metódussal (append()) hozzáf zhetünk egy elemet a listához. Ha jól elsajátítottuk a

« szeletelés » (slicing) elvét, akkor a [ ] operátorral ugyanezt az eredményt kaphatjuk. Ennek az operátornak a használata egy kicsit nehezebb, mint az erre a feladatra szolgáló utasításoké vagy metódusoké, de több rugalmasságot enged meg :

Egy vagy több elem beszúrása egy lista tetsz leges helyére szavak = ['sonka', 'sajt', 'lekvár', 'csokoládé'] szavak[2:2] =["méz"]
szavak
['sonka', 'sajt', 'méz', 'lekvár', 'csokoládé']
szavak[5:5] =['kolbász', 'ketchup']
szavak
['sonka', 'sajt', 'méz', 'lekvár', 'csokoládé', 'kolbász', 'ketchup']

Ha a [ ] operátort az egyenl ségjel baloldalán használjuk, hogy eleme(ke)t szúrjunk be a listába vagy töröljünk a listából, akkor kötelez megadni a céllista egy « szeletét » (azaz két indexet a zárójelben); nem pedig egy elszigetelt elemet a listában.

Az egyenl ségjel jobboldalán megadott elemnek magának is egy listának kell lenni. Ha csak egy elemet szúrunk be, akkor azt szögletes zárójelek közé kell tenni, hogy el ször egy egyelem listává alakítsuk. Jegyezzük meg, hogy a szavak[1] elem nem lista (ez a « sajt » karakterlánc), míg a szavak[1:3] elem egy lista.

Elemek törlése / helyettesítése

szavak[2:5] = [] # [] üres listát jelöl szavak

['sonka','sajt','kolbász', 'ketchup']
szavak[1:3] = ['saláta']
szavak
['sonka', 'saláta', 'ketchup']
szavak[1:] = ['majonéz', 'csirke', 'paradicsom']
szavak
['sonka', 'majonéz', 'csirke', 'paradicsom']

A példa els sorában a [2:5] szeletet egy üres listával helyettesítjük, ami egy törlésnek felel meg.

A negyedik sorban egyetlen elemmel helyettesítünk egy szeletet. (Mégegyszer jegyezzük meg, hogy ennek az elemnek lista formájában kell megjelenni).

A 7-ik sorban egy kételem szeletet egy három elem listával helyettesítünk.


6.2 Számokból álló lista létrehozása a range() függvénnyel

Ha számsorokat kell kezelnünk, akkor azokat nagyon könnyen létrehozhatjuk a következ függvénnyel :
range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]





34

A range() függvény növekv érték egész számokból álló listát generál. Ha a range() -et egyetlen argumentummal hívjuk, akkor a lista az argumentummal megegyez számú értéket fog tartalmazni, de az értékek nullától fognak kezd dni (vagyis a range(n) a 0-tól n-1 -g terjed egész számokat hozza létre).

Jegyezzük meg, hogy a megadott argumentum soha sem szerepel a létrehozott listában.
A range()-et két vagy három, vessz vel elválasztott argumentummal is használhatjuk speciálisabb számsorok létrehozására :
range(5,13)

[5, 6, 7, 8, 9, 10, 11, 12] range(3,16,3)
[3, 6, 9, 12, 15]


6.3 Lista bejárása a for, range() és len() segítségével

A for utasítás ideális egy lista bejárásához :

mondat = ['La','raison','du','plus','fort','est','toujours','la','meilleure'] for szo in mondat:

print szo,
La raison du plus fort est toujours la meilleure

Egy szekvencia (lista vagy karakterlánc) indexeinek automatikus el állításához nagyon praktikus a range() és a len() függvények kombinálása. Példa :

mese = ['Maître','Corbeau','sur','un','arbre','perché'] for index in range(len(mese)):
print index, mese[index]

A script végrehajtásának eredménye :

0 Maître

1 Corbeau

2 sur

3 un

4 arbre

5 perché


6.4 A dinamikus típusadás egy következménye

A for utasítással használt változó típusa a bejárás folyamán folyamatosan újra van definiálva. Még akkor is, ha egy lista elemei különböz típusúak, a for segítségével úgy járhatjuk be ezt a listát, hogy nem kapunk hibaüzenetet, mert a ciklusváltozó típusa automatikusan alkalmazkodik az adat olvasása során annak típusához. Példa :

divers = [3, 17.25, [5, 'Jean'], 'Linux is not Windoze'] for item in divers:
print item, type(item)

3 <type 'int'>

17.25 <type 'float'>
[5, 'Jean'] <type 'list'>
Linux is not Windoze <type 'str'>




35

A fönti példában a beépített type() függvényt arra használjuk, hogy megmutassuk az item változó tényleg megváltoztatja a típusát minden iterációban (ezt a Python dinamikus típusadása teszi lehet vé)


6.5 M  veletek listákon

A + (konkatenáció) és * (szorzás) operátorokat alkalmazhatjuk a listákra :

gyumolcsok = ['narancs','citrom']
zoldsegek = ['póréhagyma','hagyma','paradicsom']
gyumolcsok + zoldsegek
['narancs','citrom','póréhagyma','hagyma','paradicsom']
gyumolcsok * 3
['narancs','citrom','narancs','citrom','narancs','citrom']

A * operátor különösen hasznos n azonos elemb  l álló lista létrehozásakor :

het_nulla = [0]*7
het_nulla
[0, 0, 0, 0, 0, 0, 0]

Például tételezzük fel, hogy egy olyan B listát akarunk létrehozni, ami ugyanannyi elemet tartalmaz, mint egy másik A lista. Ezt különböz módon érhetjük el, de az egyik legegyszer bb megoldás a : B = [0]*len(A)


6.6 Tartalmazás igazolása

Az in utasítás segítségével könnyen meghatározhatjuk, hogy egy elem része e egy listának :

v = 'paradicsom'
if v in zoldsegek:
print 'OK'
OK


6.7 Lista másolása

Tegyük fel, hogy van egy fable nev listánk, amit át szeretnénk másolni a phrase nev új változóba. Az olvasó els ötlete bizonyára egy egyszer értékadás :

phrase = fable

Ha így járunk el, nem hozunk létre valódi másolatot. Az utasítást követ  en még

mindig csak egy változó van a számítógép memóriájában. Amit létrehoztunk az csak egy új
hivatkozás a listára. Próbáljuk ki például :
fable = ['Je','plie','mais','ne','romps','point']
phrase = fable
fable[4] ='casse'
phrase
['Je', 'plie', 'mais', 'ne', 'casse', 'point']

Ha a phrase változó valóban a lista másolatát tartalmazná, akkor az a másolat független lenne az eredetit l. Akkor viszont nem tudná módosítani egy olyan utasítás, mint




36

amit a harmadik sorban a fable változóra alkalmaztunk. Kísérletezhetünk még akár a fable, akár a phrase tartalmának más módosításaival is. Mindegyik esetben meg állapíthatjuk, hogy az egyik lista módosítása tükröz dni fog a másik listában és viszont.

Valójában mind a két név ugyanazt az objektumot jelöli a memóriában. Erre a helyzetre az informatikusok azt mondják, hogy a phrase név a fable név aliasa.
A kés bbiekben látni fogjuk az aliasok hasznát. Most azt szeretnénk, ha volna egy olyan eljárásunk, amivel létre tudunk hozni egy valódi listamásolatot. Ez például a lista elemeinek egyenként történ , új listába való bemásolásával valósíthatjuk meg.

Feladat – Lista másolása


Írjon egy programot, ami egy adott listáról másolatot készít!

# -*- coding: ISO-8859-2 -*-


lista1 =

['január','február','március','április','május','június','július','augusztus','szeptember','október','nov

ember','december']
lista2 = []

for i in range(len(lista1)):

lista2.append(lista1[i])

print lista2


7. Véletlenszámok

A Python random modulja egész sor - különböz eloszlású - véletlenszámokat generáló függvényt kínál. A modul összes függvényét importálhatjuk a következ utasítással :
from random import *
Az alábbi függvény nulla és egy értékek közé es véletlen valós számokat hoz létre.
Argumentumként a lista méretét kell megadni :
def veletlen_lista(n):
s = [0]*n
for i in range(n):
s[i] = random()
return s

El ször egy nullákból álló n elem listát hoztunk létre, majd a nullákat véletlen számokkal helyettesítettük.


7.1 Egész számok véletlen sorsolása

Saját projektek fejlesztése során, gyakran el fordul, hogy egy olyan függvényre lesz szüksége, amivel bizonyos határok közé es véletlen egész számokat tud generálni. Például ha egy játékprogramot akarunk írni, amiben a kártyákat véletlenszer en kell húzni (egy 52 lapos készletb l), akkor biztosan hasznos lenne egy olyan függvény, ami képes lenne 1 és 52 között (az 1-et és 52-t is beleértve ) egy véletlen számot sorsolni.

Erre a random modul randrange() függvénye használható.
Ez a függvény 1, 2, 3 argumentummal használható.



37

Egyetlen argumentummal használva : nulla és az argumentum eggyel csökkentett értéke közé es egész számot ad visszatérési értékül. Például : randrange(6) egy 0 és 5 közé es számot ad visszatérési értéknek.

Két argumentummal használva a visszatérési értéke az els argumentum és az eggyel csökkentett második argumentum értéke közé es szám. Például : randrange(2, 8) egy 2 és 7 közé es számot ad visszatérési értéknek.

Ha egy harmadik argumentumot is megadunk, akkor az azt adja meg, hogy a véletlenszer en sorsolt egészeket egymástól a harmadik argumentummal definiált intervallum választja el. Például a randrange(3,13,3) a 3, 6, 9, 12 sorozat elemeit fogja visszatérési értékként adni. :
for i in range(15):
print random.randrange(3,13,3),

3 12 6 9 6 6 12 6 3 6 9 3 6 12 12

Feladat – Dobókocka


Írjon egy programot, ami 20 dobást szimulál egy dobókocka esetén! Írja ki a dobások eredményét, majd a dobások átlagát!

# -*- coding: ISO-8859-2 -*-from random import *


kocka=[0]*20

osszeg = 0.0

for i in range(20):

kocka[i]=randrange(1,7)
osszeg = osszeg + kocka[i]

print kocka

atlag = osszeg / 20
print "Átlag: ",atlag


8. Osztályok, objektumok, attributumok

Most azt vizsgáljuk meg, mi magunk hogyan definiálhatunk új objektumosztályokat. A téma viszonylag nehéz. Fokozatosan közelítjük meg. Nagyon egyszer objektumosztályok definícióival kezdjük, amiket a kés bbiekben tökéletesítünk.
A reális világ objektumaihoz hasonlóan az informatikai objektumok is nagyon egyszer ek, vagy igen komplikáltak lehetnek. Különböz részekb l állhatnak, amik maguk is objektumok. Az utóbbiakat más, egyszer bb objektumok alkothatják, stb.


8.1 Az osztályok haszna

Az osztályok az objektum orientált programozás (Object Oriented Programming vagy OOP) f eszközei. Ezzel a fajta programozással a komplex programokat egymással és a külvilággal kölcsönható objektumok együtteseként struktúrálhatjuk.

A programozás ilyen megközelítésének az az egyik el nye, hogy a különböz objektumokat (például különböz programozók) egymástól függetlenül, az áthatások kockázata nélkül alkothatják meg. Ez az egységbezárás (encapsulation) elvének a



38

következménye. Eszerint : az objektum feladatának ellátására használt változók és az objektum bels m ködése valamilyen formában « be vannak zárva » az objektumba. Más objektumok és a külvilág csak jól definiált eljárásokkal férhetnek hozzájuk.

Az osztályok alkalmazása egyebek között lehet vé teszi a globális változók maximális mérték elkerülését. A globális változók használata veszélyeket rejt, különösen a nagyméret programok esetében, mert a programtestben az ilyen változók mindig módosíthatók vagy átdefiniálhatók. (Ennek különösen megn a veszélye, ha több programozó dolgozik ugyanazon a programon).

Az osztályok alkalmazásából ered másik el ny az a lehet ség, hogy már meglév objektumokból lehet új objektumokat konstruálni. Így egész, már megírt programrészeket lehet ismételten felhasználni (anélkül, hogy hozzájuk nyúlnánk !), hogy új funkcionalitást kapjunk. Ezt a leszármaztatás és a polimorfizmus teszik lehet vé.
A leszármaztatás mechanizmusával egy « szül » osztályból « gyermek » osztályt konstruálhatunk. A gyermek örökli a felmen je minden tulajdonságát, funkcionalitását, amikhez azt tehetünk hozzá, amit akarunk.

A polimorfizmus teszi lehet vé, hogy különböz viselkedésmódokkal ruházzuk fel az egymásból leszármaztatott objektumokat, vagy a körülményekt l függ en önmagát az objektumot.

Az objektum orientált programozás opcionális a Pythonban. Sok projekt sikeresen végigvihet az alkalmazása nélkül olyan egyszer eszközökkel, mint a függvények. Viszont tudjunk róla, hogy az osztályok praktikus és hatékony eszközök. Megértésük segíteni fog a grafikus interface-ek (Tkinter, wxPython) megtanulásában és hatékonyan készít el olyan modern nyelvek alkalmazására, mint a C++ vagy a Java.


8.2 Egy elemi osztály (class) definíciója

A class utasítással hozunk létre új objektumosztályt. Az utasítás használatát egy elemi objektumtípus - egy új adattípus - definiálásán tanuljuk meg. Az eddig használt adattípusok mind be voltak építve a nyelvbe. Most egy új, összetett adattípust definiálunk : a Pont típust. A matematikai pont fogalmának felel meg. A síkban két számmal jellemzünk egy pontot (az x és y koordinátáival). Matematikai jelöléssel a zárójelbe zárt x és y koordinátáival reprezentáljuk. Például a (25,17) pontról beszélünk. A Pythonban a pont reprezentálására float típusú koordinátákat fogunk használni. Ezt a két értéket egyetlen entitássá vagy objektummá szeretnénk egyesíteni. Ezért egy Pont() osztályt definiálunk) :

class Pont:
"Egy matematikai pont definíciója"

Az osztályok definíciói bárhol lehetnek a programban, de általában a program elejére (vagy egy importálandó modulba) tesszük ket. A fenti példa valószín leg az elképzelhet legegyszer bb példa. Egyetlen sor elég volt az új Pont() objektumtípus definiálásához. Rögtön jegyezzük meg, hogy :

A class utasítás az összetett utasítások egy új példája. Ne felejtsük le a sor végér l a kötelez kett spontot és az azt követ utasításblokk behúzását. Ennek a blokknak legalább egy sort kell tartalmazni. Megállapodás szerint, ha a class utasítást követ els sor egy karakterlánc, akkor azt kommentnek tekinti a Python és automatikusan beágyazza az osztályok dokumentációs szerkezetébe, ami a Python integráns részét képezi. Váljon szokásunkká, hogy erre a helyre mindig az osztályt leíró karakterláncot teszünk !.






39

Emlékezzünk arra a konvencióra, hogy az osztályoknak mindig nagybet  vel kezd

nevet adunk. A szövegben egy másik konvenciót is betartunk : minden osztálynévhez

zárójeleket kapcsolunk, ahogyan a függvénynevekkel is tesszük. Definiáltunk egy Pont() osztályt, amit mostantól kezdve Pont típusú objektumok példányosítással történ létrehozására használhatunk. Hozzunk létre például egy új p91 objektumot :

p9 = Pont()

A p9 változó egy új Pont() objektum hivatkozását tartalmazza. Azt is mondhatjuk, hogy a p9 egy új példánya a Pont() osztálynak.
Figyelem : utasításban hívott osztályt mindig zárójeleknek kell követni a függvényekhez hasonlóan (még akkor is, ha semmilyen argumentumot sem adunk meg). A kés bbiekben majd meglátjuk, hogy az osztályok hívhatók argumentumokkal.

Jegyezzük meg : egy osztálydefiníciónál nincs szükség zárójelekre (szemben a függvény definíciókkal) kivéve, ha azt akarjuk, hogy a definiált osztály egy másik - már létez - osztály leszármazottja legyen.

Az új p9 objektumunkon mostmár elvégezhetünk néhány elemi m  veletet. Példa :
print p9.__doc__
Egy matematikai pont definíciója

A különböz Python objektumok dokumentációs stringjei az el redefiniált __doc__ attribútumhoz vannak rendelve.
print p9
<__main__.Pont instance at 0x403e1a8c>

A Python-üzenet azt jelenti, hogy a p9 a f program szintjén definiált Pont() osztály egy példánya. A memória egy jól definiált helyén helyezkedik el, aminek a címe hexadecimálisan van megadva.

Ez az osztály ett l kezdve saját változókkal és metódusokkal rendelkezhet. Az egyik kitüntetett metódus a konstruktor, ami az objektum kezdeti értékeinek beállítását oldja meg. A konstruktor neve kötelez en: __init__

Feladat – Raktárprogram


Adott egy zöldségraktár, melyben pillanatnyilag egyetlen árut, paradicsomot raktározunk.
A raktárba gyakran teszünk be, illetve veszünk ki onnan paradicsomot.

A paradicsom pillanatnyi egységára 300 Ft, de ez változhat

Készítsünk olyan programot, amely segítségével rögzíteni tudjuk a megfelel adatokat, és bármikor jelentést tudunk adni a paradicsom aktuális mennyiségér l, egységáráról, értékér l! Menüb l lehessen kiválasztani, hogy beteszünk-e, vagy kiveszünk paradicsomot, elletve, hogy emeljük, avagy csökkentjük a paradicsom egységárát! Minden m velet során adjunk jelentést!


# -*- coding: ISO-8859-2 -*-


class Aru:

def __init__(self,aruNev,aruEgysegar):

self.nev = aruNev
self.egysegar = aruEgysegar
self.menny = 0



40


def setEgysegar(self,aruEgysegar):

if (aruEgysegar >= 0):
self.egysegar = aruEgysegar

def getAr(self):

return self.menny * self.egysegar

def hozzatesz(self,aruMenny):

if (aruMenny > 0):
self.menny = self.menny + aruMenny

def elvesz(self,aruMenny):

if (aruMenny > 0) and (aruMenny <= self.menny):
self.menny = self.menny - aruMenny

def __doc__(self):

print self.nev," Egységár: ",self.egysegar," Mennyiség: ",self.menny," Ár: ",self.getAr()

aru = Aru("Paradicsom",300)

m = 'A'

while not((m == 'v') or (m == 'V')):
print "B: Paradicsom berakása a raktárba"
print "K: Paradicsom kivétele a raktárból"
print "E: Egységár módosítása"
print "V: Vége"
m = raw_input("Választás? ") if (m == 'B') or (m == 'b'):
x = int(raw_input("Mennyit tesz a raktárba? ")) aru.hozzatesz(x)
aru.__doc__()
elif (m == 'K') or (m == 'k'):
x = int(raw_input("Mennyit vesz ki a raktárból? ")) aru.elvesz(x)
aru.__doc__()
elif (m == 'E') or (m == 'e'):
x = int(raw_input("Mennyi az új egységár? ")) aru.setEgysegar(x)
aru.__doc__()

Feladat – Másodfokú egyenlet


Írjunk olyan programot, amely kiszámítja egy másodfokú egyenlet gyökeit annak együtthatóiból!


# -*- coding: ISO-8859-2 -*-from math import *


class MasodfokuEgyenlet:





41

def __init__(self,szam1,szam2,szam3):


self.a = szam1
self.b = szam2
self.c = szam3

def diszkriminans(self):

return self.b * self.b - 4 * self.a * self.c

def megoldas1(self):

return (-self.b + sqrt(self.diszkriminans())) / (2 * self.a)

def megoldas2(self):

return (-self.b - sqrt(self.diszkriminans())) / (2 * self.a)

def __doc__(self):

if (self.a == 0):
print "Az egyenlet nem másodfokú."
elif (self.diszkriminans() < 0):
print "Az egyenletnek nincs valós megoldása."
else:
print "Az egyenlet egyik megoldása: ",self.megoldas1()
print "Az egyenlet másik megoldása: ",self.megoldas2()

m = 'A'

while not((m == 'v') or (m == 'V')):
print "E: A másodfokú egyenlet együtthatóinak bevitele"
print "V: Vége"
m = raw_input("Választás? ") if (m == 'E') or (m == 'e'):
a = float(raw_input("a? ")) b = float(raw_input("b? ")) c = float(raw_input("c? ")) egyenlet = MasodfokuEgyenlet(a,b,c) egyenlet.__doc__()


8.3 Örökl  dés

A napjaink leghatékonyabb programozási technikájának tekintett objektum orientált programozásnak (Object Oriented Programming vagy OOP) az osztályok a f eszközei. Ennek a programozási típusnak az egyik f el nye az, hogy mindig felhasználhatunk egy már meglév osztályt egy új, néhány eltér vagy kiegészít funkcionalitással rendelkez osztály létrehozására. Az eljárást leszármaztatásnak nevezzük. Egy általánostól a speciális felé haladó osztály hierarchia kialakítását teszi lehet vé.


Feladat – Síkidomok örökl dése


Írjunk olyan programot, amely kiszámítja a négyzet, a téglalap és a kör kerületét, területét! Az egyes síkidomok osztályok legyenek, megfelel metódusokkal, alkalmazzuk az örökl dést!


# -*- coding: ISO-8859-2 -*-




42

from math import *


class Teglalap:

def __init__(self,szam1,szam2):

self.a = szam1
self.b = szam2

def kerulet(self):

return 2*(self.a + self.b)

def terulet(self):

return self.a * self.b

def __doc__(self):

print "Kerület: ",self.kerulet()
print "Terület: ",self.terulet()


class Negyzet(Teglalap):

def __init__(self,szam1):

Teglalap.__init__(self,szam1,szam1)

def __doc__(self):

Teglalap.__doc__(self)


class Kor(Negyzet):

def kerulet(self):

return 2 * self.a * pi

def terulet(self):

return self.a * self.a * pi

def __doc__(self):

Negyzet.__doc__(self)

m = 'A'

while not((m == 'v') or (m == 'V')):
print "T: Téglalap"
print "N: Négyzet"
print "K: Kör"

print "V: Vége"

m = raw_input("Választás? ") if (m == 't') or (m == 'T'):
a = float(raw_input("a? ")) b = float(raw_input("b? ")) teglalap = Teglalap(a,b)




43

teglalap.__doc__()


if (m == 'n') or (m == 'N'):

a = float(raw_input("a? ")) negyzet = Negyzet(a) negyzet.__doc__()

if (m == 'k') or (m == 'K'):

r = float(raw_input("r? ")) kor = Kor(r) kor.__doc__()

























































46

Nincsenek megjegyzések:

Megjegyzés küldése