Python Vadovėlis/Ciklai For
Ciklas for
Ir štai naujas spausdinimo būdas:
nuo_vieno_iki_dešimt = range(1, 11)
for skaičius in nuo_vieno_iki_dešimt:
print(skaičius)
ir kodo išvestis būtų tokia:
1 2 3 4 5 6 7 8 9 10
Išvestis atrodo labai pažįstama, tačiau programos kodas atrodo kitaip. Pirmoje eilutėje naudojama funkcija range
. Funkcija range
naudoja du argumentus, tokius kaip šie range(pradžia, pabaiga)
, kurie nurodo intervalo galus. pradžia
yra pirmasis intervalo skaičius. pabaiga
yra vienu didesnis nei paskutinis intervalo skaičius. Atkreipk dėmesį, kad šį kodą galima parašyti ir trumpiau:
for skaičius in range(1, 11):
print(skaičius)
range
funkcija grąžina iteraciją (proceso kartojimas skirtas rezultatų sekos generavimui). Tai galima paversti sąrašu naudojant funkciją list
.
Štai keli pavyzdžiai, parodantys, kas nutinka su komanda range
:
>>> range(1, 10) range(1, 10) >>> list(range(1, 10)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(-32, -20)) [-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21] >>> list(range(5,21)) [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] >>> list(range(5)) [0, 1, 2, 3, 4] >>> list(range(21, 5)) []
Eilutė for skaičius in nuo_vieno_iki_dešimt:
naudoja for
valdymo struktūrą. for
struktūra atrodo taip: for elementas in sąrašas:
. sąrašas
pereinamas nuo pirmojo sąrašo elemento iki paskutinio. Kai for
eina per kiekvieną sąrašo elementą, jis kiekvieną reikšmę priskiria elementas
kintamajam. Tai leidžia naudoti elementas
kiekvieną kartą, kai ciklas for
pereinamas iš eilės. Štai dar vienas pavyzdys, kad būtų lengviau suprasti:
demoSąrašas = ["gyvybė", 42, "visata", 6, "ir", 9, "oras"]
for elementas in demoSąrašas:
print("Dabartinis elementas yra:", elementas)
Rezultatas yra:
Dabartinis elementas yra: gyvybė Dabartinis elementas yra: 42 Dabartinis elementas yra: visata Dabartinis elementas yra: 6 Dabartinis elementas yra: ir Dabartinis elementas yra: 9 Dabartinis elementas yra: oras
Atkreipk dėmesį, kaip ciklas for
praeina ir nustato elemento reikšmę kiekvienam sąrašo elementui. Taigi, kam tinkamas for
? Pirmasis naudojimas yra peržiūrėti visus sąrašo elementus ir ką nors padaryti su kiekvienu iš jų. Štai greitas būdas sudėti visus elementus:
sąrašas = [2, 4, 6, 8]
suma = 0
for skaičius in sąrašas:
suma = suma + skaičius
print("Suma yra:", suma)
o išvestis yra tiesiog:
Suma yra: 20
Arba gali parašyti programą, kad sužinotum, ar sąraše yra dublikatų. Pavyzdžiui kaip ši programa:
sąrašas = [4, 5, 7, 8, 9, 1, 0, 7, 10]
sąrašas.sort()
praeitas = None
for elementas in sąrašas:
if praeitas == elementas:
print("Dublikatas", praeitas, "rastas.")
praeitas = elementas
ir turime rezultatą:
Dublikatas 7 rastas.
Gerai, tai kaip gi tai veikia? Čia yra speciali derinimo versija, kuri turėtų tau padėti suprasti (tau to nereikia įvesti):
l = [4, 5, 7, 8, 9, 1, 0, 7, 10]
print("l = [4, 5, 7, 8, 9, 1, 0, 7, 10]", "\t\tl:", l)
l.sort()
print("l.sort()", "\t\tl:", l)
praeitas = l[0]
print("praeitas = l[0]", "\t\tpraeitas:", praeitas)
del l[0]
print("del l[0]", "\t\tl:", l)
for elementas in l:
if praeitas == elementas:
print("Dublikatas", praeitas, "rastas.")
print("if praeitas == elementas:", "\t\tpraeitas:", praeitas, "\telementas:", elementas)
praeitas = elementas
print("praeitas = elementas", "\t\tpraeitas:", praeitas, "\telementas:", elementas)
ir kodo išvestis būtų:
l = [4, 5, 7, 8, 9, 1, 0, 7, 10] l: [4, 5, 7, 8, 9, 1, 0, 7, 10] l.sort() l: [0, 1, 4, 5, 7, 7, 8, 9, 10] praeitas = l[0] praeitas: 0 del l[0] l: [1, 4, 5, 7, 7, 8, 9, 10] if praeitas == elementas: praeitas: 0 elementas: 1 praeitas = elementas praeitas: 1 elementas: 1 if praeitas == elementas: praeitas: 1 elementas: 4 praeitas = elementas praeitas: 4 elementas: 4 if praeitas == elementas: praeitas: 4 elementas: 5 praeitas = elementas praeitas: 5 elementas: 5 if praeitas == elementas: praeitas: 5 elementas: 7 praeitas = elementas praeitas: 7 elementas: 7 Dublikatas 7 rastas. if praeitas == elementas: praeitas: 7 elementas: 7 praeitas = elementas praeitas: 7 elementas: 7 if praeitas == elementas: praeitas: 7 elementas: 8 praeitas = elementas praeitas: 8 elementas: 8 if praeitas == elementas: praeitas: 8 elementas: 9 praeitas = elementas praeitas: 9 elementas: 9 if praeitas == elementas: praeitas: 9 elementas: 10 praeitas = elementas praeitas: 10 elementas: 10
Priežastis, kodėl į kodą įdėjau tiek daug print
komandų, buvo ta, kad galėtum matyti, kas vyksta kiekvienoje eilutėje (beje, jei kažkada negalėsi suprasti, kodėl programa neveikia, pabandyk įdėti spausdintų komandų tose vietose, kur nori sužinoti, kas vyksta). Pirmiausia programa prasideda nuobodžiu senu sąrašu. Toliau programa surūšiuoja sąrašą. Tai darome tam, kad visi dublikatai būtų dedami vienas šalia kito. Tada programa apibrėžia kintamąjį praeitas
. Tada pirmasis sąrašo elementas ištrinamas, kad pirmasis elementas nebūtų klaidingai laikomas dublikatu. Toliau aprašomas for
ciklas. Kiekvienas sąrašo elementas tikrinamas, ar jis sutampa su ankstesniu. Jeigu sutampa – dublikatas rastas. Tada kintamasis praeitas
yra pakeičiamas taip, kad kitame for
cikle kintamasis praeitas
būtų ankstesnis dabartinis elementas. Be abejo, nustatytome, kad 7 yra dublikatas. (Atkreipk dėmesį, kaip \t
naudojamas spausdinant tabuliavimo žymę (tab'as).)
Kitas būdas naudoti for
ciklą yra norint ką nors padaryti tam tikrą skaičių kartų. Štai trumpas kodas, kaip atspausdinti pirmuosius 9 „Fibonacci“ serijos sakičius:
a = 1
b = 1
for c in range(1, 10):
print(a, end=" ")
n = a + b
a = b
b = n
su stebėtinu rezultatu:
1 1 2 3 5 8 13 21 34
Viskas, ką galima padaryti naudojant for
ciklą, taip pat gali būti padaryta naudojant while
ciklą, bet for
ciklas suteikia lengvą būdą pereiti per visus sąrašo elementus arba ką nors padaryti tam tikrą skaičių kartų.
Sąrašų rūšiavimas
Ciklas for
taip pat dažnai naudojamas sąrašų rūšiavimo užduotyse. Paprastų sąrašų, kurie yra sudaryti iš skaičių ar eilučių, rūšiavimui gali naudoti funkciją sort
, kuri buvo paminėta prieš tai skaitytame skyriuje. Tačiau gali susidurti su situacijomis, kai ši funkcija yra nepakankama. Egzistuoja daug rūšiavimo algoritmų, tačiau čia išmoksi vieną paprasčiausių iš jų - burbuliuko algoritmą (angl. bubble sort).
Algoritmo idėja yra tokia, kad iš kairės į dešinę lyginame gretimų elementų poras ir sukeičiame elementus vietomis, jei pirmasis yra didesnis už antrąjį. Kiekvienos iteracijos metu, didžiausias nesurūšiuotas elementas juda link sąrašo galo. Toks judėjimas primena burbuliukų vandenyje judėjimą į paviršių, iš ko ir kilo algoritmo pavadinimas. Iteracijos kartojamos tol, kol visi elementai yra savo vietose.
Pavyzdžiui, surūšiuokime jau prieš tai naudotą sąrašą [42, 7, 0, 123].
Pirma iteracija:
- Lyginami pirmi du elementai. Antrasis yra didesnis už pirmąjį, todėl elementai pakeičiami vietomis.
- Lyginami antras ir trečias elementai. Trečiasis yra didesnis už antrąjį, todėl elementai pakeičiami vietomis.
- Lyginami paskutiniai du elementai. Jie yra išdėstyti tinkamai, todėl nėra pakeičiami vietomis.
Antra iteracija:
- Lyginami pirmi du elementai. Antrasis yra didesnis už pirmąjį, todėl elementai pakeičiami vietomis.
- Lyginami antras ir trečias elementai. Jie yra išdėstyti tinkamai, todėl nėra pakeičiami vietomis.
- Lyginami paskutiniai du elementai. Jie yra išdėstyti tinkamai, todėl nėra pakeičiami vietomis.
Trečia iteracija:
- Elementai išdėstyti tinkamai.
- Elementai išdėstyti tinkamai.
- Elementai išdėstyti tinkamai.
Trečios iteracijos metu algoritmas neatlieka jokių pakeitimų, tad nustatoma, kad sąrašas yra surūšiuotas, algoritmas baigtas.
Algoritmo kodą galima užrašyti taip:
def burbuliukoRūšiavimas(sąrašas):
sąrašoIlgis = len(sąrašas)
# Maksimalus iteracijų skaičius - sąrašo ilgis - 1 elementas
for i in range(sąrašoIlgis - 1):
arBuvoPakeitimų = 0
# Kiekvienoje iteracijoje lyginami visi elementai
for j in range(sąrašoIlgis - 1):
if sąrašas[j] > sąrašas[j + 1]:
# Sukuriame laikiną elementą, kuris saugo pirmąjį lyginamą elementą
laikinasElementas = sąrašas[j]
# Pirmąjam elementui priskiriame antro elemento reikšmę
sąrašas[j] = sąrašas[j + 1]
# Antrajam elementui priskiriame laikino elemento reikšmę, kuri yra lygi buvusiam pirmąjam elementui
sąrašas[j + 1] = laikinasElementas
# Pasižymime, kad iteracijos metu buvo padaryti pakeitimai, taigi reikės papildomų iteracijų
arBuvoPakeitimų = 1
# Jei visos iteracijos metu nebuvo nei vieno pakeitimo, algoritmas baigiamas
if arBuvoPakeitimų == 0:
break
return sąrašas
rezultatas = burbuliukoRūšiavimas([42, 7, 0, 123])
print (rezultatas)
Programos išvestis:
[0, 7, 42, 123]
Pratimai
Sukurk naują sarašą, kuris turėtų tik skaičiaus 3 daliklius (skaičius turi dalintis iš 3) iš 'x' sąrašo ir tik skaičiaus 5 daliklius iš 'y' sąrašo.
x = [1,2,3,4,5,6,7,8,9,10]
y = [11,12,13,14,15,16,17,18,19,20]
Sprendimas | |
---|---|
x = [1,2,3,4,5,6,7,8,9,10]
y = [11,12,13,14,15,16,17,18,19,20]
c = []
for i in x:
if i % 3 == 0:
c.append(i)
for i in y:
if i % 5 == 0:
c.append(i)
print(c)
|
Parašyk programą, kuri atspausdintų eglutę, pagal vartotojo įvesta eglutės aukštį.
Pvz. Įvestis = 3
Išvestis:
*
**
***
Sprendimas | |
---|---|
def spausdintiEglutę(aukstis):
for i in range(1, aukstis + 1):
print('*'*i)
spausdintiEglutę(3)
|