A while ciklust elöltesztelő ciklusnak is nevezik.
n = 1000
a = 1
while a ** 3 < n:
print(a ** 3, end=' ') # egy sorba kerülnek
a = a + 1
print("vege")
Tudunk írni olyan ciklust, mely addig olvas be számokat míg valamilyen kritérium nem teljesül:
Feladat: Írjunk olyan kódot, mely addig olvas be számokat míg egyszer 0-t nem kap, ekkor megáll és kiírja a kapott számok összegét.
n = 0
a = float(input()) # beolvasó, kovertáló kód először
while a != 0:
n = n + a
a = float(input()) # ugyan az a kód másodszor!
print(n)
A fenti példában a kód egy részét meg kellett ismételni: egyszer szerepelt a ciklus előtt, egyszer a ciklusban. Ez nem tűnik hatékony és bölcs megoldásnak.
Feladat: Írjuk át az előző programot kódismétlés nélkül!
n = 0
while True: # a ciklus eleje
a = float(input()) # beolvas, számmá konvertál
if a == 0: # kiugrás feltétele
break # kiugrás
n += a # ha nem ugrott ki a ciklusból (ua. mint n = n + a)
print(n)
A más nyelvekben használt (néha hátultesztelőnek nevezett) utasítások, mint a
do ... while ...
vagy
do... until ...
a Pythonból hiányzik, pontosabban szükségtelennek ítéltetett, mert a
while True:
<előkészítő parancsok>
if <kiugrás feltétele>:
break
<további parancsok>
szerkezetű kód megadja a fenti kódok adta lehetőségeket, ezért új parancs bevezetése semmi haszonnal nem járna.
Általalánosan megfogalmazott gyakran használt rövid algoritmusok
Bár a név ezt sugallja, de nem feltétlen csak összegzésre használható. Ha van egy számokból (vagy bármi másból) álló sorozatunk és valamilyen szempontból összegezni akarjuk őket egy változóba, akkor beszélünk az összegzés tételéről.
Feladat: Olvassunk be 0-tól különböző számokat a standard inputról, és adjuk össze őket. A sorozat végét 0 jelölje.
sum = 0 # akkumulátor
while True: # ciklus eleje
a = float(input()) # beolvasás
if a == 0: # a kiugrás feltétele
break
sum += a # összegzés
print(sum)
Kérdés: Mit kell kapnunk, ha az összegzendő számok sorozata üres?
Nem csak szummázni lehet:
Feladat: Szorozzuk össze az standard inputról beolvasott számokat. Gondoljunk arra, hogy mit kell kapnunk eredményül, ha a számok sorozata üres? A sorozat végét most jelölje egy üres karakterlánc, azaz a beviteli mezőbe adott üres ENTER
. Vigyázzunk, üres karakterlánc nem konvertálható számmá!
prod = 1 # akkumulátor
while True: # ciklus
a = input() # beolvasás
if a == "": # a kiugrás feltétele
break
prod *= float(a) # konvertálás és szorzás
print(prod)
Adott valahány objektumunk (pl. számok) és ezek közül szeretnénk megszámolni az adott tulajdonsággal rendelkezőket (pl. a páratlanokat).
Feladat: Számoljuk meg, hogy egy 0-t nem tartalmazó egészekből álló számsorozatban hány páratlan szám van! A sorozat végét 0 jelölje.
db = 0 # számláló
while True: # ciklus
a = int(input()) # beolvasás
if a == 0: # leállási feltétel
break
if a % 2 == 1: # tulajdonság vizsgálata
db += 1 # számláló növelése
print(db)
Feladat: Olvassunk be karakterláncokat egészen addig amíg egy üres szót nem kapunk az input mezőben. Számoljuk meg, hogy a beolvasott karakterláncok közül hány darabban található 'ő' betű!
db = 0
while True:
szo = input()
if szo == "":
break
if "ő" in szo or "Ő" in szo:
db += 1
print(db)
Adott objektumok egy sorozata, elemeinek szélsőértékét keressük valamilyen adott rendezés szerint.
Feladat: Pozitív valós számok sorozatából válasszuk ki a legnagyobbat! Ha a sorozat üres (azaz az első beolvasott szám nem pozitív), írjunk ki 0-t!
legnagyobb = 0
while True:
a = float(input()) # beolvasás
if a <= 0: # leállási feltétel
break
if legnagyobb < a: # tulajdonság vizsgálata
legnagyobb = a # a legnagyobb frissítése (növelése)
print("A legnagyobb =", legnagyobb)
Ha tetszőleges valós számok között keressük a legnagyobbat, akkor az üres halmaz maximuma mínusz végtelen kell hogy legyen (vagy hibaüzenetet kell kapnunk – ennek módjait később tanuljuk).
legnagyobb = float('-inf') # üres halmaz legnagyobb eleme -∞
while True:
a = input() # beolvasás
if a == "": # leállási feltétel
break
f = float(a) # csak itt konvertálunk
if legnagyobb < f: # tulajdonság vizsgálata
legnagyobb = f # a legnagyobb frissítése (növelése)
print("A legnagyobb =", legnagyobb)
Azt vizsgáljuk, hogy adott elemek között szerepel-e egy bizonyos tulajdonságú. Például a prímtesztelésnél a lehetséges osztók voltak a lehetséges elemek és azt vizsgáltuk, hogy valamelyik osztja-e az adott számot.
Feladat: Írjunk programot, mely egy 1-nél nagyobb egész számról eldönti, hogy prímszám, vagy összetett!
n = int(input()) # a szám beolvasása
oszto = 2 # az osztó induló értéke
talalt = False # találtunk osztót?
while oszto**2 <= n: # ciklus a leállási feltétellel
if n % oszto == 0: # az oszto osztó?
talalt = True # találtunk egy osztót
break # kiugrunk
oszto += 1 # következő lehetséges osztót
if not talalt: # kiírás
print("a(z) {0} prímszám".format(n))
else:
print("a(z) {0} összetett szám".format(n))
Ezeket a tételeket általában kombinálni kell, hogy a bonyolultabb feladatokat meg tudjuk oldani. Természetesen nem csak ezek használatával lehet megoldani feladatokat, de kiindulásnak jó velük megismerkedni.
Feladat: Számoljuk meg, hogy hány prím van 2-től 1000-ig! Ehhez az eldöntés tételét ágyazzuk be a számlálás tételébe.
szam = 2 # kezdőérték a számlálás tételéhez
primek_db = 0 # a számlálás tételének számlálója
while szam <= 1000: # itt kezdődik a számlálás tétele
oszto = 2 # a beágyazott eldöntés tétele kezdete
osszetett = False # a találatot jelző logikai változó
while oszto**2 <= szam: # az eldöntés tételének ciklusa
if szam % oszto == 0: # van osztója?
osszetett = True
break
oszto += 1 # az eldöntés tételében léptetünk
if not osszetett: # ez már a számlálás tétele
primek_db += 1 # a számláló növelése
szam += 1 # és lépünk a következő elemre
print(primek_db)
A listákra gondolhatunk úgy, mint tárolókra, melyek több objektumot képesek tárolni úgy, hogy a sorrendjük is meg van adva. Egy listának sose adjuk a list
nevet, mert az a típus és a listává konvertáló függvény neve.
lista = [1, 2, 5]
lista
A listák elemeit szögletes zárójelbe tesszük és vesszővel választjuk el egymástól. Egy listának akárhány eleme lehet (akár 0 is), ezek az elemek akármilyen típusúak lehetnek (akár másik listák is):
lista = [1, 5.3, "kutya", [1, 2, 5], 12, "macska"]
lista
Lista egy adott elemét elérhetjük az indexe segítségével:
lista = ["a", "b", "c"]
print(lista[0], lista[1], lista[2])
Az indexelés 0-val kezdődik, azaz az első elem a 0 indexű.
Az utolsó elemet az n - 1
indexszel is elérjük, ahol n
a lista hossza.
Az 1-től n-ig indexelés és a Python 0-tól indexelésének kapcsolatát mutatja a következő ábra:
____ ____ ____ ____ ____
| | | | | |
| e1 | e2 | e3 |....| en |
|____|____|____|____|____|
Λ Λ Λ Λ Λ Λ
0 1 2 ... n-1 n
-n 1-n 2-n -1
print(lista[-1], lista[-2], lista[-3])
Egy lista részlistáját is lekérhetjük, az indextartományt alulról zárt, fölülről nyílt intervallumnak tekintjük:
lista = [0, 1, 2, 3, 4, 5]
print(lista[1:3]) # 1-től, a 3-asig, de a 3-as már nem lesz benne
print(lista[2:]) # a 2-es indextől a lista végéig
print(lista[:3]) # a lista elejétől a 3-asig, a 3-as nem lesz benne
print(lista[0:4:2]) # 1-től a 4-es indexűig 2-esével
print(lista[-1::-1]) # az utolsótól az elejéig visszafelé 1-esével
Listákat ugyanúgy lehet összefűzni mint stringeket:
print([1, 2, 5] + [8, 5, 3])
Az eddigi listaműveletek működnek stringekkel is:
s = "trió"
print(s[1:4])
print(s[-2::-1] + s[-1])
print(s[::2])
print(s[1::2])
Annyi különbség viszont van, hogy míg a listák változtatható (mutable) adattípusok, a stringek nem változtathatók (immutable). Tehát listának megváltoztathatjuk az elemeit:
lista = [1, 2, 5]
lista[1] = 200
print(lista)
Ugyanezt stringekkel nem tehetjük meg:
s = "trió"
s[0] = "b"
A listák kényelmes kezeléséhez tanuljuk meg néhány alapvető függényt / metódust.
A range
objektum lista létrehozására használható. Ún. lusta bejárható (lazy iterable) objektum (de nem iterátor, amit később fogunk tanulni). A bejárható arra utal, hogy ciklus futtatható az elemein, a lusta arra, hogy az elemek csak ciklusonként, egyesével lesznek kiszámolva. A list
függvény listává konvertálja a range
objektumot:
list(range(4))
range(4) == [0, 1, 2, 3]
list(range(4, 10))
list(range(3, 15, 3))
A range függvénynek három argumentum adható meg:
range(start, end, step)
amelyek jelentése a részlisták lekérésénél használtakhoz hasonlóan működik. Ha csak egy paraméter van megadva, akkor az az end, ha kettő akkor azok a start és az end.
A range objektum ugyanúgy indexelhető, mint egy lista:
range(0, 5, 2)[2]
range(1, 10, 2)[1::2]
list(range(1, 10, 2)[1::2]) # [1, 3, 5, 7, 9] -> [3, 7]
Az append
metódussal új elemet fűzhetünk egy létező lista végére:
lista = [1, 2, 5]
lista.append(4)
print(lista)
l = []
while True:
a = input(a)
if a == "":
break
l.append(a)
print(l)
Az insert
metódussal adott indexű helyre illeszthetünk be új elemet:
lista = [1, 2, 3, 4]
lista.insert(2, "X")
print(lista)
A pop
metódussal adott indexű elemet törölhetünk a listából. A függvény a törölt elemet adja vissza értékül. Üres argumentummal meghívva az utolsó elemet törli.
print(lista.pop(2))
print(lista)
print(lista.pop())
print(lista)
A remove
metódussal adott elem első előfordulását törölhetjük a listából:
lista = [1, 2, 3, 2, 2, 5]
lista.remove(2)
print(lista)
while 2 in lista:
lista.remove(2)
print(lista)
Megadott indexű elemek törlésére a del
parancs is használható:
lista = list(range(8))
del lista[::2]
print(lista)
del lista[1::2]
print(lista)
del lista[:] # töröl mindent, ua. mint lista.clear()
print(lista)
A len
függvénnyel lekérhetjük egy lista hosszát:
lista = [1, 2, 5]
print(len(lista))
A count
metódussal lekérhetjük, hogy egy adott elemből hány darab van a listában:
lista = [1, 2, 3, 4, 1, 2, 1, 4, 5, 1, 3, 2, 4]
print(lista.count(1), lista.count(4), lista.count(15))
A sort
metódussal rendezhetjük a lista elemeit, ekkor az eredeti lista megváltozik. A sorted
függvény új rendezett litát hoz létre:
lista = [1, 2, 3, 4, 1, 2, 1, 4, 5, 1, 3, 2, 4]
lista.sort()
print(lista)
lista = [1, 2, 3, 4, 1, 2, 1, 4, 5, 1, 3, 2, 4]
sorted(lista)
print(lista)
Pythonban a for
ciklus és a listák erősen összefüggnek.
A for ciklus listán (és egyéb bejárható objektumokon) fut végig.
for <ciklusváltozó> in <bejárható objektum>:
<állítások>
else:
<állítások>
lista = ["kutya", "macska", "egér", "tücsök"]
for elem in lista:
print(elem, end=" -> ")
print("...")
for elem in range(0,10,2):
if elem % 2 == 1:
break
print(elem, end=" ")
else:
print("mind páros")
lista = [0, 2, 4, 5, 6, 8]
for elem in lista:
if elem % 2 == 1:
break
print(elem, end=" ")
else:
print("mind páros")
Ha az indexekkel szeretnénk végigmenni a listán, akkor használhatjuk a range
metódust:
# elemeken
lista = [2, 3, 5, 7, 11]
for e in lista:
print(e, end=" ")
# indexeken
lista = [2, 3, 5, 7, 11]
for i in range(len(lista)):
print(lista[i], end=" ")
A range(len(lista))
épp a lista
indexeit adja vissza és a for
ciklus ezeken megy végig:
lista = [2, 3, 5, 7, 11]
for i in range(len(lista)):
print("index: ", i, " elem: ", lista[i])
lista = [1, 2, 5]
n = 0
for e in lista:
n += e
print(n)
lista = [1, 2, 5, 6, 4, 6, 7, 8]
db = 0
for e in lista:
if e % 3 == 0:
db += 1
print(db)
lista = [1, 2, 5, 6, 15, 4, 6, 7, 8]
legnagyobb = lista[0] # arra az esetre jó, ha a lista nem üres
for e in lista[1:]:
if legnagyobb < e:
legnagyobb = e
print(legnagyobb)
lista = [0, 2, 4, 5, 6, 8]
for elem in lista:
if elem % 2 == 1:
print("nem mind páros")
break
else:
print("mind páros")
Számoljuk meg, hogy azokban a karakterláncokban, melyekben van 'ő' betű, összesen hány darab 'e' betű van!
szavak = ["betörő", "majomparádé",
"elment az őrszem", "elembertelenedett"]
db = 0
for szo in szavak:
if "ő" in szo:
for i in range(len(szo)):
if szo[i] == "e":
db += 1
print(db)
A count
metódussal egyszerűbben is meg lehet oldani (ez jóformán egy beépített számlálás tétele egyszerűbb esetekre):
szavak = ["betörő", "majomparádé",
"elment az őrszem", "elembertelenedett"]
db = 0
for szo in szavak:
if "ő" in szo:
db += szo.count("e")
print(db)