A Pythonban két ciklusszerkezet létezik.
A while ciklus a határozatlan (meg nem számlált) iterációhoz, a for ciklus pedig a határozott, (megszámlált) iterációhoz használatos.
A break, a continue és az else kulcsszavak segítenek testre szabni a ciklus viselkedését.
A range() és az enumerate() segít a ciklusszámlálásban és az indexelésben.
A while ciklus mindaddig folytatja a végrehajtást, amíg a loop expression vagy „teszt” True értéket nem ad egy boolean context esetén, és akkor áll le, amikor False lesz:
# Lists are considered "truthy" in a boolean context if they
# contain one or more values, and "falsy" if they are empty.
>>> placeholders = ["spam", "ham", "eggs", "green_spam", "green_ham", "green_eggs"]
>>> while placeholders:
... print(placeholders.pop(0))
...
'spam'
'ham'
'eggs'
'green_spam'
'green_ham'
'green_eggs'
A Python alapvető for loop-ja jobban leírható for each ciklusként: végigmegy bármely iterable object értékein, és akkor áll le, amikor a next() hívása már nem ad vissza több értéket:
>>> word_list = ["bird", "chicken", "barrel", "bongo"]
>>> for word in word_list:
... if word.startswith("b"):
... print(f"{word.title()} starts with a B.")
... else:
... print(f"{word.title()} doesn't start with a B.")
...
'Bird starts with a B.'
'Chicken doesn\'t start with a B.'
'Barrel starts with a B.'
'Bongo starts with a B.'
Amikor nincs megadva konkrét iterable, a speciális range() sorozatot használjuk ciklusszámlálóként.
A range()-nek meg kell adni egy int értéket, amelynél a sorozat stop-ol, emellett opcionálisan start és step paramétereket is fogadhat.
Ha nincs megadva start szám, a sorozat 0-tól kezdődik.
A range() objektumok lazák (az értékek csak kérésre generálódnak), támogatják az összes common sequence operations műveletet, és fix mennyiségű memóriát foglalnak, függetlenül a megadott sorozat hosszától.
# Here we use range to produce some numbers, rather than creating a list of them in memory.
# The values will start with 1 and stop *before* 7
>>> for number in range(1, 7):
... if number % 2 == 0:
... print(f"{number} is even.")
... else:
... print(f"{number} is odd.")
'1 is odd.'
'2 is even.'
'3 is odd.'
'4 is even.'
'5 is odd.'
'6 is even.'
# range() can also take a *step* parameter.
# Here we use range to produce only the "odd" numbers, starting with 3 and stopping *before* 15.
>>> for number in range(3, 15, 2):
... if number % 2 == 0:
... print(f"{number} is even.")
... else:
... print(f"{number} is odd.")
...
'3 is odd.'
'5 is odd.'
'7 is odd.'
'9 is odd.'
'11 is odd.'
'13 is odd.'
Ha az értékekre és az indexeikre is szükség van, a beépített enumerate(<iterable>) (index, value) párokat ad vissza:
>>> word_list = ["bird", "chicken", "barrel", "apple"]
# *index* and *word* are the loop variables.
# Loop variables can be any valid python name.
>>> for index, word in enumerate(word_list):
... if word.startswith("b"):
... print(f"{word.title()} (at index {index}) starts with a B.")
... else:
... print(f"{word.title()} (at index {index}) doesn't start with a B.")
...
'Bird (at index 0) starts with a B.'
'Chicken (at index 1) doesn\'t start with a B.'
'Barrel (at index 2) starts with a B.'
'Apple (at index 3) doesn\'t start with a B.'
# The same method can be used as a "lookup" for pairing items between two lists.
# Of course, if the lengths or indexes don't line up, this doesn't work.
>>> word_list = ["cat", "chicken", "barrel", "apple", "spinach"]
>>> category_list = ["mammal", "bird", "thing", "fruit", "vegetable"]
>>> for index, word in enumerate(word_list):
... print(f"{word.title()} is in category: {category_list[index]}.")
...
'Cat is in category: mammal.'
'Chicken is in category: bird.'
'Barrel is in category: thing.'
'Apple is in category: fruit.'
'Spinach is in category: vegetable.'
A continue kulcsszóval előre lehet ugrani a következő iterációra:
word_list = ["bird", "chicken", "barrel", "bongo", "sliver", "apple", "bear"]
# This will skip *bird*, at index 0
for index, word in enumerate(word_list):
if index == 0:
continue
if word.startswith("b"):
print(f"{word.title()} (at index {index}) starts with a b.")
'Barrel (at index 2) starts with a b.'
'Bongo (at index 3) starts with a b.'
'Bear (at index 6) starts with a b.'
A break (ahogy sok C-vel rokon nyelvben) kulcsszóval leállítható az iteráció, és „ki lehet törni” a legbelső loop-ból:
>>> word_list = ["bird", "chicken", "barrel", "bongo", "sliver", "apple"]
>>> for index, word in enumerate(word_list):
... if word.startswith("b"):
... print(f"{word.title()} (at index {index}) starts with a B.")
... elif word == "sliver":
... break
... else:
... print(f"{word.title()} doesn't start with a B.")
... print("loop broken.")
...
'Bird (at index 0) starts with a B.'
'Chicken doesn\'t start with a B.'
'Barrel (at index 2) starts with a B.'
'Bongo (at index 3) starts with a B.'
'loop broken.'
Tanársegéd vagy, aki a tanulók vizsgáit javítja. Az eredmények kézi nyilvántartása egyre fárasztóbb és egyre hibahajlamosabb. Úgy döntesz, hogy kicsit érdekesebbé teszed a dolgot, és írsz néhány függvényt, amelyek megszámolják és kiszámítják az osztály eredményeit.
Bár a vizsgakérdésekre adhatsz „részleges pontszámot", a vizsga végső pontszámai csak int-ek lehetnek.
Ezért mielőtt bármi mást tehetnél az osztály pontszámaival, végig kell menned a pontszámokon, és minden float pontszámot int-té kell alakítanod. Szerencsédre a Python beépített round() függvényével ezt könnyedén megteheted.
Készítsd el a round_scores(student_scores) függvényt, amely egy student_scores list-et kap.
A függvény fogyassza el a bemeneti list-et, és return-nel adjon vissza egy új listát, amelyben minden pontszám int-té alakult.
A pontszámok sorrendje a kapott list-ben nem számít.
>>> student_scores = [90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3]
>>> round_scores(student_scores)
...
[40, 39, 95, 80, 25, 31, 70, 55, 40, 90]
Ahogy javítottad a vizsgát, észrevetted, hogy néhány tanuló nem teljesített olyan jól, mint remélted. De elkalandozott a figyelmed, és elfelejtetted feljegyezni, hogy pontosan hány tanulóról van szó.
Készítsd el a count_failed_students(student_scores) függvényt, amely egy student_scores list-et kap.
A függvény számolja össze, hány tanulónak nincs átmenő pontszáma, és adja vissza ezt a számot egész számként.
Ahhoz, hogy egy tanuló átmenő osztályzatot szerezzen a vizsgán, 40-nél nagyobb pontszámra van szüksége.
>>> count_failed_students(student_scores=[90,40,55,70,30,25,80,95,38,40])
5
A tanár, akit segítesz, meg szeretné találni azt a tanulócsoportot, amelyik „a legjobban" teljesített ezen a vizsgán. Az, hogy mi számít „a legjobbnak", folyton változik, ezért meg kell keresned azokat a pontszámokat, amelyek nagyobb vagy egyenlő, mint az aktuális küszöb.
Készítsd el az above_threshold(student_scores, threshold) függvényt, amely paraméterként student_scores-t (az osztályzatok list-ét) és threshold-ot (a „csúcspontszám" küszöbét) veszi át.
A függvény adjon vissza egy list-et minden olyan pontszámmal, amely >= a threshold-nál.
>>> above_threshold(student_scores=[90,40,55,70,30,68,70,75,83,96], threshold=75)
[90,75,83,96]
A tanár, akit segítesz, szeret betűosztályzatokat is adni a számokban kifejezett pontszámok mellé. Mivel a tanulók ritkán érnek el 100 pontot egy vizsgán, a „betűosztályzatok" alsó küszöbeit a legmagasabb elért pontszám alapján számítják ki, és ezek egyenletesen nőnek a legmagasabb pontszám és a <= 40-es bukási küszöb között.
Készítsd el a letter_grades(highest) függvényt, amely argumentumként a vizsgán elért „legmagasabb" pontszámot kapja, és visszaad egy list-et minden „amerikai stílusú" osztályzatsáv alsó pontszámküszöbével: ["D", "C", "B", "A"].
"""Where the highest score is 100, and failing is <= 40.
"F" <= 40
41 <= "D" <= 55
56 <= "C" <= 70
71 <= "B" <= 85
86 <= "A" <= 100
"""
>>> letter_grades(highest=100)
[41, 56, 71, 86]
"""Where the highest score is 88, and failing is <= 40.
"F" <= 40
41 <= "D" <= 52
53 <= "C" <= 64
65 <= "B" <= 76
77 <= "A" <= 88
"""
>>> letter_grades(highest=88)
[41, 53, 65, 77]
Van egy listád a vizsgapontszámokról csökkenő sorrendben, és egy másik listád a tanulók neveivel, amelyek szintén a vizsgapontszámaik szerint csökkenő sorrendben vannak. Szeretnéd minden tanuló nevét a hozzá tartozó vizsgapontszámhoz párosítani, és kiírni az osztály összesített rangsorát.
Készítsd el a student_ranking(student_scores, student_names) függvényt student_scores és student_names paraméterekkel.
A student_names list minden tanulónevét párosítsd a student_scores list-ből származó pontszámával.
Feltételezheted, hogy minden list argumentum a legmagasabb pontszámtól a legalacsonyabbig van rendezve.
A függvény egy list-et adjon vissza stringekkel, a következő formátumban: <rank>. <student name>: <student score>.
>>> student_scores = [100, 99, 90, 84, 66, 53, 47]
>>> student_names = ['Joci', 'Sara','Kora','Jan','John','Bern', 'Fred']
>>> student_ranking(student_scores, student_names)
...
['1. Joci: 100', '2. Sara: 99', '3. Kora: 90', '4. Jan: 84', '5. John: 66', '6. Bern: 53', '7. Fred: 47']
Bár a 100-as „tökéletes" pontszám ritka egy vizsgán, érdekes tudni, hogy legalább egy tanuló elérte-e.
Készítsd el a perfect_score(student_info) függvényt student_info paraméterrel.
A student_info egy list-ekből álló list, amely minden tanuló nevét és pontszámát tartalmazza: [["Charles", 90], ["Tony", 80]].
A függvény return-nel az első [<name>, <score>] párt adja vissza annak a tanulónak, aki 100 pontot ért el a vizsgán.
Ha a student_info-ban nincs 100-as pontszám, akkor üres list-et kell visszaadni ([]).
>>> perfect_score(student_info=[["Charles", 90], ["Tony", 80], ["Alex", 100]])
["Alex", 100]
>>> perfect_score(student_info=[["Charles", 90], ["Tony", 80]])
[]
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.