Python ciklai
Susipažinsime su dar vienu programavimo sintaksės elementu - ciklais (angl. loops).
Žodynėlis
Tam, kad galėtume kalbėti apie ciklus, reikia išsiaiškinti keletą sąvokų, kurios bus vėliau naudojamos aiškinantis pagrindinius principus.
Ciklas - operacijų (ar komandų, ar kodo eilučių) seka, kuri kartojama, iki kol pasiekama nurodyta sąlyga. Čia sąlyga ta pati, kurią rašėme if sakiniuose.
Iteracija - vienas ciklo operacijų įvykdymas (pakartojimas).
Ciklo kintamasis - kintamasis, skirtas saugoti iteracijos reikšmei. Dažniausiai tai bus atskiri sąrašo elementai, iteracijos numeris (0-oji, 1-oji, 2-oji ir t.t. iteracija).
Ciklas darbui su sekomis (for)
Pirma susipažinsime su baigtinį (iš anksto žinomą) iteracijų skaičių vykdomą ciklą. Šiam ciklui suprasti ir naudoti svarbu žinoti praeitos pamokos medžiagą apie sąrašus.
Jeigu norėsim atlikti operacijas, modifikacijas, agregacijas su įvairiais sąrašo elementais - Python kalboje naudosime for ciklus. Panaudokime pažymių sąrašą ir sakykime, kad norime tiesiog jį atspausdinti konsoliniame lange:
grades=[3, 5, 3, 7, 7, 5, 9]
for grade in grades:
print(grade) # prints: 3, 5, 3, 7, ..., 9
Pirmoje eilutėje sukurtas sąrašas su pažymiais (sveikieji skaičiai). Toliau panaudojama ciklo sintaksė, kuriame nurodomas ciklo kintamasis (grade) ir sąrašas (grades), o gale dedamas dvitaškis (:). Po dvitaškio visos operacijos, kurias norima atlikti n kartų, rašomos atitraukus nuo krašto (tai galite padaryti su tab klavišu). Dar turėtų būti neaišku, toliau skaitant ir analizuojant, bus tik geriau.
O gal galima tą patį padaryti be ciklo?
grades=[3, 5, 3, 7, 7, 5, 9]
grade=grades[0]
print(grade) # prints: 3
grade=grades[1]
print(grade) # prints: 5
grade=grades[2]
print(grade) # prints: 3
grade=grades[3]
print(grade) # prints: 7
grade=grades[4]
print(grade) # prints: 7
grade=grades[5]
print(grade) # prints: 5
grade=grades[6]
print(grade) # prints: 9
Jeigu (grades) sąrašas turėtų 1000 pažymių? Pirmu atveju, kode niekas nesikeistų, antru atveju reiktų prirašyti virš tūkstančio eilučių.
Bendra for ciklo šabloną galima užrašyti šitaip:
for loop_variable in list_variable:
operation_1
operation_2
operation_3
...
operation_n
Čia loop_variable kintamojo vardas, kurį patys galite sugalvoti. Jeigu turime sąrašą pažymių, tai ciklo kintamąjį pavadinsime „pažymys“, jeigu turime sąrašą temperatūrų, ciklo kintamąjį pavadinsime „temperatūra“. Su šiuo kintamuoju, kiekvienoje iteracijoje pasieksime pavienius sąrašo reikšmes.
Funkcija range()
Norint atlikti iteracijas kartų, neturint sąrašo, reikia naudoti range(). Šią funkcija reikia įrašyti vietoje anksčiau rašytos sąrašo reikšmės. Tarkime norime daryti iteracijas 10 kartų:
for i in range(10):
print(i) # prints: 0, 1, 2, 3, 4, ..., 9
Auksčiau esantyis kodas atspausdins skaičius nuo 0 iki 10 (neįskaitant). Šiame kode panaudota viena iš programuotojų „tradicijų“ - kai ciklo kintamasis yra iteracijos numeris, tai šis kintamasis pavadinamas i.
Funkcijai range() galima pateikti ir daugiau argumentų. Galima nurodyti ciklo kintamojo pradinę reikšmę:
for i in range(5, 10):
print(i) # prints: 5, 6, 7, 8, 9
Šį kartą i kintamasis įgauna reikšmes nuo 5 (įskaitant) iki 10 (neįskaitant).
Liko dar vienas nepanaudotas funkcijos range() argumentas. Galima kiekvieną ciklo kintamojo reikšmę didinti kas kažkokį skaičių:
for i in range(5, 21, 5):
print(i) # prints: 5, 10, 15, 20
Įrašėme trečiąjį argumentą, kuriuo nurodėme, kad ciklo kintamojo reikšmės didėtų po 5 vienetus nuo 5 (įskaitant) iki 21 (neįskaitant).
Funkcija enumerate()
Su enumerate() funkcija galima kurti ciklą kartu sužinant ir tos iteracijos indeksą. Kol kas, šią funkciją teks naudoti, nežinant jos visų ypatumų. Tarkime, reikia sudėti visus sąrašo skaičius, kurių vieta sąraše yra nelyginė. Pirma tai atlikime, be enumerate() funkcijos.
numbers=[-10, 50, 200, 200, 100, 4, 0, 10, -44, 15, 468, 7, 2024, 1998]
odd_index_number_sum = 0
i = 0 # index
for number in numbers:
# division with remainder
# if remainder is equal to zero, that means number is even
if i % 2 == 0:
odd_index_number_sum += number
print("Calculated sum:") # prints: Calculated sum:
print(odd_index_number_sum) # prints: 5022
Šį kodą galima modifikuoti ir supaprastinti su enumerate() funkcija:
numbers=[-10, 50, 200, 200, 100, 4, 0, 10, -44, 15, 468, 7, 2024, 1998]
odd_index_number_sum = 0
for i, number in enumerate(numbers):
# division with remainder
# if remainder is equal to zero, that means number is even
if i % 2 == 0:
odd_index_number_sum += number
print("Calculated sum:") # prints: Calculated sum:
print(odd_index_number_sum) # prints: 5022
Kadangi kodas šiek tiek sudėtingesnis, pateikiama lentelė:
| Iteracija | Iteracijos indeksas | Ciklo kintamasis | Operacija | Suma |
|---|---|---|---|---|
| prieš ciklą | - | - | - | 0 |
| 0 | 0 | -10 | 0 % 2 == 0 (True), -10 + 0 | -10 |
| 1 | 1 | 50 | 1 % 2 != 0 (False) | -10 |
| 2 | 2 | 200 | 2 % 2 == 0 (True), 200 + -10 | 190 |
| 3 | 3 | 200 | 3 % 2 != 0 (False) | 190 |
| 4 | 4 | 100 | 4 % 2 == 0 (True), 100 + 190 | 290 |
| 5 | 5 | 4 | 5 % 2 != 0 (False) | 290 |
| 6 | 6 | 0 | 6 % 2 == 0 (True), 0 + 290 | 290 |
| 7 | 7 | 10 | 7 % 2 != 0 (False) | 290 |
| 8 | 8 | -44 | 8 % 2 == 0 (True), -44 + 290 | 246 |
| 9 | 9 | 15 | 9 % 2 != 0 (False) | 246 |
| 10 | 10 | 468 | 10 % 2 == 0 (True), 468 + 246 | 714 |
| 11 | 11 | 7 | 11 % 2 != 0 (False) | 714 |
| 12 | 12 | 2024 | 12 % 2 == 0 (True), 2024 + 714 | 2738 |
| 13 | 13 | 1998 | 13 % 2 != 0 (False) | 2738 |
Kodo pavyzdyje pateikiamas dalybos su liekana operatorius (angl. modulo) %. Šio operatoriaus rezultatas, liekanos reikšmė po dalybos. Žemiau pateikiama lentelė su įvairiais skaičiais ir operacijų su šiuo operatoriumi rezultatu:
| A | B | A % B | Paaiškinimas |
|---|---|---|---|
| 10 | 3 | 1 | 10 padalinta iš 3 yra 3 su liekana 1 |
| 20 | 4 | 0 | 20 padalinta iš 4 yra 5 be liekanos |
| 15 | 6 | 3 | 15 padalinta iš 6 yra 2 su liekana 3 |
| 7 | 5 | 2 | 7 padalinta iš 5 yra 1 su liekana 2 |
| 18 | 7 | 4 | 18 padalinta iš 7 yra 2 su liekana 4 |
| 100 | 10 | 0 | 100 padalinta iš 10 yra 10 be liekanos |
| 25 | 8 | 1 | 25 padalinta iš 8 yra 3 su liekana 1 |
| 33 | 10 | 3 | 33 padalinta iš 10 yra 3 su liekana 3 |
| 45 | 12 | 9 | 45 padalinta iš 12 yra 3 su liekana 9 |
Paprasti pavyzdžiai
Skaičių suma ir vidurkis
Kartą jau skaičiavome skaičių sumą su sum() funkcija. Toliau pažiūrėsime, kaip tą padaryti su ciklu:
grades=[3, 5, 3, 7, 7, 5, 9]
grades_sum = 0
for grade in grades:
grades_sum = grades_sum + grade
print("Sum of grades:") # prints: Sum of grades:
print(grades_sum) # prints: 39
Kiekvienoje iteracijoje mes prie sumos pridedame pavienį pažymį ir taip, iki kol pažymių sąrašas baigiasi. Besikeičiančias reikšmes galite pamatyti žemiau lentelėje:
| Iteracija | Pažymys | Suma | Operacija |
|---|---|---|---|
| prieš ciklą | - | 0 | - |
| 0 | 3 | 3 | =0 + 3 |
| 1 | 5 | 8 | =3 + 5 |
| 2 | 3 | 11 | =8 + 3 |
| 3 | 7 | 18 | =11 + 7 |
| 4 | 7 | 25 | =18 + 7 |
| 5 | 5 | 30 | =25 + 5 |
| 6 | 9 | 39 | =30 + 9 |
Pridėjus dar vieną eilutę būtų galima nesunkiai gauti pažymių vidurkį:
grades=[3, 5, 3, 7, 7, 5, 9]
grades_sum = 0
for grade in grades:
grades_sum = grades_sum + grade
print("Grades average:") # prints: Grades average:
print(grades_sum/len(grades)) # prints: 5.571428571428571
Didžiausios reikšmės radimas
Įsivaizduokite dėžę, kurioje yra kortelės su užrašytais skaičiais. Dėžė nepermatoma. Su viena ranka galima laikyti tik vieną kortelę kortelę, su kita ištraukti tik vieną kortelę iš dėžės. Kaip, ištraukus visas korteles iš dėžės, vienoje rankoje laikyti kortelę su didžiausiu skaičiu?
Norint turėti didžiausią skaičių rankoje, reiktų traukti po vieną kortelę. Pirmąja kortelę pasilikti rankoje, tada traukti kitą kortelę ir palyginti, jeigu ištraukta kortelė didesnė už kitoje rankoje esančia, tai pasilikti, jeigu mažesnė - padėti šalin. Taip reiktų daryti, iki kol baigsis kortelės.
Tokiu pat būdu programavime randama didžiausia reikšmė:
box=[0, -1, 100, 200, 5, 123, 0, 999, 12, 1410, 1998, 2024, 1, 2, 3]
biggest_number = box[0]
for number in box:
if biggest_number < number:
biggest_number = number
print("Biggest value in box:") # prints: Biggest value in box:
print(biggest_number) # 2024
Besikeičiančias reikšmes taip pat patogu pavaizduoti lentele:
| Iteracija | Ciklo kintamojo reikšmė | Operacija | Didžiausia Reikšmė |
|---|---|---|---|
| prieš ciklą | - | - | 0 |
| 0 | 0 | 0 < 0 (False) | 0 |
| 1 | -1 | 0 < -1 (False) | 0 |
| 2 | 100 | 0 < 100 (True) | 100 |
| 3 | 200 | 100 < 200 (True) | 200 |
| 4 | 5 | 200 < 5 (False) | 200 |
| 5 | 123 | 200 < 123 (False) | 200 |
| 6 | 0 | 200 < 0 (False) | 200 |
| 7 | 999 | 200 < 999 (True) | 999 |
| 8 | 12 | 999 < 12 (False) | 999 |
| 9 | 1410 | 999 < 1410 (True) | 1410 |
| 10 | 1998 | 1410 < 1998 (True) | 1998 |
| 11 | 2024 | 1998 < 2024 (True) | 2024 |
| 12 | 1 | 2024 < 1 (False) | 2024 |
| 13 | 2 | 2024 < 2 (False) | 2024 |
| 14 | 3 | 2024 < 3 (False) | 2024 |
Kadangi programuotojai nemėgsta pasikartojančiai rašyti dažnai naudojamų algortimų, tai Python kalboje sukurta funkcija max(), su kuria galima pasilengvinti darbą:
box=[0, -1, 100, 200, 5, 123, 0, 999, 12, 1410, 1998, 2024, 1, 2, 3]
biggest_number = max(box)
print("Biggest value in box:") # prints: Biggest value in box:
print(biggest_number) # 2024
Algoritmą pravartu žinoti, kadangi ne visais atvejais ateityje bus galima taip surasti didžiausią reikšmę!
Reikšmių kiekis sąraše
Įmonė savo darbuotojams užsako megztinius, kurių spalvas pasirenka patys. Mums reikia sužinoti, kiek konkrečiai yra vienos spalvos megztinių. Paieškokime, kiek buvo užsakyta žalių megztinių:
sweaters_colors = [
"red", "blue", "green", "yellow", "purple", "orange",
"red", "blue", "green", "yellow",
"purple", "orange", "red", "blue",
"green", "yellow", "purple", "orange",
"red", "blue"
]
color_to_count = "green"
count = 0
for sweater_color in sweaters_colors:
if sweater_color == color_to_count:
count = count + 1
print("There are") # prints: There are
print(count) # prints: 3
print("green sweaters in the order") # prints: green sweaters in the order
Žemiau visos iteracijos ir besikeičiančios reikšmės pavaizduotos lentele:
| Iteracija | Spalva | Operacija | Kiekis |
|---|---|---|---|
| prieš ciklą | - | - | 0 |
| 0 | red | red == green (False) | 0 |
| 1 | blue | blue == green (False) | 0 |
| 2 | green | green == green (True) | 1 |
| 3 | yellow | yellow == green (False) | 1 |
| 4 | purple | purple == green (False) | 1 |
| 5 | orange | orange == green (False) | 1 |
| 6 | red | red == green (False) | 1 |
| 7 | blue | blue == green (False) | 1 |
| 8 | green | green == green (True) | 2 |
| 9 | yellow | yellow == green (False) | 2 |
| 10 | purple | purple == green (False) | 2 |
| 11 | orange | orange == green (False) | 2 |
| 12 | red | red == green (False) | 2 |
| 13 | blue | blue == green (False) | 2 |
| 14 | green | green == green (True) | 3 |
| 15 | yellow | yellow == green (False) | 3 |
| 16 | purple | purple == green (False) | 3 |
| 17 | orange | orange == green (False) | 3 |
| 18 | red | red == green (False) | 3 |
| 19 | blue | blue == green (False) | 3 |
Kaip ir maksimalios reikšmės radime, taip ir čia, galima panaudoti jau sukurtą metodą:
sweaters_colors = [
"red", "blue", "green", "yellow", "purple", "orange",
"red", "blue", "green", "yellow",
"purple", "orange", "red", "blue",
"green", "yellow", "purple", "orange",
"red", "blue"
]
color_to_count = "green"
count = sweaters_colors.count(color_to_count)
print("There are") # prints: There are
print(count) # prints: 3
print("green sweaters in the order") # prints: green sweaters in the order
Ciklas esant sąlygai (while)
Jeigu turėsime ne sąrašą, o kažkokią sąlygą, pagal kurią norėsimė vykdyti ciklą, tada naudosime ciklą while. Pavyzdžiui:
- Rodoma žinutė „kraunasi“, kol neatsiųstąs, neužkrautas socialinio tinklo įrašas (arba vaizdo įrašas);
- Neišjungiamas aplinkos apšvietimas kieme, kol laikas yra tarp 20:00 ir 06:00;
- Mikrobangų kronsnelė veikia, kol laikmatis rodo didesnį laiką negu 00:00;
- Žadintuvas skamba, kol nepaspaustas mygtukas „STOP“;
- ir kt.
Sintaksė ir veikimas turi panašumų į if. Sintaksei parodyti panaudosime time.sleep() funkciją, į kurią įrašę laiką sekundėmis, galėsime sustabdyti programos veikimą tam tikram laikui arba kitaip - įvykdžius tą eilutę, programa užmigs nurodytam laikui. Tarkime, turime imituokime mikrobangų krosnelės veikimą:
import time
time_left = 10
while time_left>0:
print("Your lunch is heating. Time left:", time_left)
time.sleep(1) # Sleeps for 1 second
time_left-=1
print("Your lunch is ready to eat!")
Pirmiausia importuojama biblioteką import time. Tada sukuriamas kintamasis, kuriame saugoma reikšmė, kuri nurodo, kiek liko laiko šildyti maistą. Su raktažodžiu while pradedamas ciklas, o po jo nurodoma sąlyga, šiuo atveju tai galima skaityti: ciklą vykdysime, kol liko daugiau negu 0 sekundžių. Cikle atspausdinama žinutė, tada palaukiama sekundę time.sleep(1) ir laikas sumažinamas vienetu time_left-=1. Pasibaigus ciklui (time_left pasiekus 0). Atspausdinama paskutinė žinutė. Toliau kiekviena iteracija pateikta lentele:
| Iteracija | Laikas prieš sąlygos tikrinimą | Sąlygos tikrinimas | Sąlygos rezultatas | Išvesties žinutė |
|---|---|---|---|---|
| 1 | 10 | 10 > 0 | True | "Your lunch is heating. Time left: 10" |
| 2 | 9 | 9 > 0 | True | "Your lunch is heating. Time left: 9" |
| 3 | 8 | 8 > 0 | True | "Your lunch is heating. Time left: 8" |
| 4 | 7 | 7 > 0 | True | "Your lunch is heating. Time left: 7" |
| 5 | 6 | 6 > 0 | True | "Your lunch is heating. Time left: 6" |
| 6 | 5 | 5 > 0 | True | "Your lunch is heating. Time left: 5" |
| 7 | 4 | 4 > 0 | True | "Your lunch is heating. Time left: 4" |
| 8 | 3 | 3 > 0 | True | "Your lunch is heating. Time left: 3" |
| 9 | 2 | 2 > 0 | True | "Your lunch is heating. Time left: 2" |
| 10 | 1 | 1 > 0 | True | "Your lunch is heating. Time left: 1" |
| 11 | 0 | 0 > 0 | False | "Your lunch is ready to eat!" (po ciklo) |
Komanda break
Jeigu norėsime nutraukti ciklą, ankščiau laiko, galima pasinaudototi komanda break.
Tarkime turime temperatūras iš 10 skirtingų šaldytuvo sensorių/jutiklių(pagal ekalba, jutiklis - kokį nors fizinį poveikį jaučiantis ir apie tai elektriniu signalu pranešantis įtaisas). Maisto produktų pramonėje temperatūros palaikymas tam tikrame diapazone yra labai svarbus išlaikant produktus šviežius ir saugius vartoti. Žinoma, kad temperatūra turi būti tarp 0 ir 5 celsijaus laipsnių.
# Simulated temperature readings from 10 refrigerators in a food storage facility.
# In real life, these readings would be taken from a database or obtained from sensors in real-time.
# It is possible to recreate sensor readings using microcontrollers like micro:bit, Arduino, or STM.
refrigerator_readings = [2, 4, 5, -1, 3, 7, 6, 8, 4, 3]
safe_min_temperature = 0
safe_max_temperature = 5
# Check for readings outside the safe temperature range
for reading in refrigerator_readings:
# If the sensor temperature is outside the min and max values, the loop will break
if reading < safe_min_temperature or reading > safe_max_temperature:
print(f"ALARM: Refrigerator reading {reading}°C is outside the safe range of {safe_min_temperature}°C to {safe_max_temperature}°C.")
break
else:
# This block executes if all readings are within the safe range
print("All refrigerator readings are within the safe temperature range.")
# Output:
# ALARM: Refrigerator reading -1°C is outside the safe range of 0°C to 5°C.
Pavyzdiniame kode panaudota papildoma for ciklo sintaksė. Po tokio ciklo galima parašyti raktažodį else su po juo sekančiu dvitaškiu ir nurodyti komandas (reikia padaryti įtrauką nuo krašto), kurias norime įvykdyti, kai ciklui pasibaigus sėkmingai, t.y. įvykdžius visas sąrašo iteracijas. Tai šiuo atveju, jeigu visi jutiklių duomenys būtų geri (tarp 0 ir 5 celsijaus laipsnių), po ciklo būtų įvykdytos visos kodo eilutės po else. Tai galite pamatyti pakeitę pradinius duomenis į
refrigerator_readings = [2, 4, 3, 3, 3, 2, 1, 2, 4, 3]
Raktažodžius break ir else taip pat galima naudoti ir su while ciklu.
Ciklo for keitimas ciklu while ir atvirkščiai
Abi sintaksės, tiek for ciklo, tiek while ciklo, skirtos aprašyti pasikartojančių operacijų vykdymą, tai todėl kai kuriais atvejais jas galima pakeisti viena kita.
Skaičių spausdinimas
Žemiau dviejuose pavyzdžiuose pateikta, kaip galima atspausdint skaičius nuo 0 iki 4 naudojantis abiejų tipų ciklus.
for
# Print numbers from 0 to 4 using a for loop
for i in range(5):
print(i)
while
Čia sukuriamas iteratorius i, o šis kiekvieno ciklo metu yra padidinamas vienetu, o ciklo sąlygoje tikrinama, ar sukurtas kintamasis mažesnis nei 5.
# Print numbers from 0 to 4 using a while loop
i = 0
while i < 5:
print(i)
i += 1
Iteravimas per sąrašą
Žemiau dviejuose pavyzdžiuose pateikta, kaip galima atspausdint visą sąrašą naudojantis abiejų tipų ciklus.
for
# Iterate over a list using a for loop
fruits = ["watermelon", "strawberry", "dragonfruit", "durian"]
for fruit in fruits:
print(fruit)
while
Kaip ir praeitame pavyzdyje su while ciklu, taip ir čia - sukuriamas kintamasis, kuris tikrinamas. Tik šį kartą, tikrinama, ar šis mažesnis už sąrašo ilgį.
# Iterate over a list using a while loop
fruits = ["watermelon", "strawberry", "dragonfruit", "durian"]
i = 0
while i < len(fruits):
print(fruits[i])
i += 1
Užduotys
1. Dalūs iš 7
1.1 Nuo 1 iki 100
Išveskite terminale visus skaičius nuo 1 (įskaitant) iki 100 (įskaitant), kurie dalijasi (be liekanos) iš 7.
1.2 Nuo a iki b
Sukurkite du kintamuosius a ir b. Atspausdinkite visus skaičius nuo a(įskaitant) iki b(įskaitant), kurie dalijasi iš 7. Kintamuosius a ir b sukurkite įvedant juos į terminalą.
2. Bakterijų populiacija
Bakterijų populiacija auga eksponentiškai. Pažymėkime, kad pradinė populiacija yra . Populiacija auga pastoviu greičiu . Dydis išreiškiamas augimu procentais per valandą (pvz. 5% augimas per valandą). Suskaičiuokite, kaip keičiais populiacijos dydis per valandų.
Paraškykite programą, kuri atspausdintų populiacijos dydį kas valandą, kai:
- ;
- ;
- ;
Žinutės turi būti aiškios ir suprantamos:
Hour 0: Population = 100
Hour 1: Population = 105
Hour 2: Population = 110.25
Hour 3: Population = ...
3. Mažiausios reikšmės radimas
Sukurkite sarašą ir, naudodamiesi ciklu, suraskite mažiausią reikšmę.
Sukurtas kodas turi veikti taip pat, kaip ir min() funkcija (dokumentacija).
Pasitikrinimas #1
Duomenys:
data=[10, 250, 190, 100, 200, 4500, 5600]
Tikėtina išvestis:
The minimum value of the list is 10
Pasitikrinimas #2
Duomenys:
data=[100, 5, 3, 15, 18, 20, -1]
Tikėtina išvestis:
The minimum value of the list is -1
Pasitikrinimas #3
Duomenys:
data=[2, 2, 2, 1, 2, 2, 1]
Tikėtina išvestis:
The minimum value of the list is 1
Pasitikrinimas #4
Duomenys:
data=[]
Tikėtina išvestis:
There is no minimum value.
4. Mažiausios reikšmės vietos radimas
Pasinaudokite ankstesnės užduoties kodu, raskite mažiausios reikšmės vietą sąraše (indeksą). Papildykite arba perkurkitę ankstesnį kodą.
Pasitikrinimas #1
Duomenys:
data=[10, 250, 190, 100, 200, 4500, 5600]
Tikėtina išvestis:
The minimum value is at index 0 in the list
Pasitikrinimas #2
Duomenys:
data=[100, 5, 3, 15, 18, 20, -1]
Tikėtina išvestis:
The minimum value is at index 6 in the list
Pasitikrinimas #3
Duomenys:
data=[2, 2, 2, 1, 2, 2, 1]
Tikėtina išvestis:
The minimum value is at index 3 in the list
arba
The minimum value is at index 6 in the list
Pasitikrinimas #4
Duomenys:
data=[]
Tikėtina išvestis:
There is no minimum value.
5. Nelyginių ir lyginių skaičių suma
Sukurkite sąrašą su skaičiais. Suskaičiuokite nelyginių ir lyginių skaičių sumas atskirai. Atspausdinkite, kuri suma didesnė ir kokia ta suma.
Pasitikrinimas #1
Duomenys:
numbers=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Tikėtina išvestis:
The sum of even numbers (30) is greater than the sum of odd numbers (25).
Pasitikrinimas #2
Duomenys:
numbers=[1, 3, 5, 7, 9]
Tikėtina išvestis:
The sum of odd numbers (25) is greater than the sum of even numbers (“).
Pasitikrinimas #3
Duomenys:
numbers=[2, 4, 6, 8, 10]
Tikėtina išvestis:
The sum of even numbers (30) is greater than the sum of odd numbers (0).
Pasitikrinimas #4
Duomenys:
numbers=[]
Tikėtina išvestis:
The sums of even numbers and odd numbers are equal (0).
6. Ar seka yra aritmetinė progresija
Nustatykite, ar duota seka yra aritmetinė progresija. Jeigu seka yra aritmetinė progresija, nurodykite jos skirtumą.
Pasitikrinimas
| Atvejis | Seka | Išvestis |
|---|---|---|
| 1 | Sequence [2, 4, 6, 8, 10] is arithmetic progression (d=2) | |
| 2 | Sequence [10, 5, 0, -5, -10] is arithmetic progression (d=-5) | |
| 3 | Sequence [1, 2, 4, 7, 11] is not arithmetic progression | |
| 4 | Sequence [3, 3, 3, 3, 3] is arithmetic progression (d=0) | |
| 5* | Sequence [7] is arithmetic progression (d=0) |
*Seka su vienu nariu laikoma aritmetine progresija. Skirtumo reikšmę galima interpretuoti, kaip .
Apie aritmetinę progresiją
Pradėkime nuo žodžio „seka“. Tai aibė, kurioje elementai (skaičiai) yra užrašyti kažkokia tvarka. Pavyzdžiui: , , ir kt.
Aritmentinė progresija irgi yra skaičių seka, bet ji skiriasi nuo kitų sekų tuo, kad skirtumas tarp šalia esančių narių yra pastovus (vienodas). Tarkime turime 6 sekas, pasižiūrėkime skirtumus tarp narių ir pasižiūrėkime, kurios iš šių sekų yra aritmetinės progresijos, o kurios ne:
| Seka | Skirtumas 1 | Skirtumas 2 | Skirtumas 3 | Skirtumas 4 | Ar aritmetinės progresija |
|---|---|---|---|---|---|
| Taip | |||||
| Taip | |||||
| Ne | |||||
| Taip | |||||
| Ne | |||||
| Taip |
Nustant, ar seka yra aritmetinė progresija, reikia suskaičiuoti skirtumus tarp šalia esančių narių. Jeigu šie lygūs, tai seka yra aritmetinė progresija.
Šis pastovus aritmeninės progresijos skirtumas žymimas . Aritmetinės progresijos narys žymimas . Pavyzdžiui, pirmasis narys , antrasis , trečiasis , ..., n-tasis .
Apibrėžus žymėjimus, aritmetinės progresijos skirtumą galima aprašyti šitaip:
.
Matematiškai surasti n-tąjį narį galima pasinaudojus aritmetinės progresijos n-tojo nario formule:
;
Čia - aritmetinės progresijos nario numeris; - aritmetinės progresijos skirtumas; - pirmasis aritmetinės progresijos.
Žinant aritmetinės progresijos, kažkurį tai narį galima sužinoti sekantį (arba prieš jį esantį) tiesiog pridėjus skirtumą: . Pavyzdžiui, žinome, kad 55 aritmetinės progresijos narys yra lygus 100 (), o skirtumas lygus 23 (), tai
6. Aritmetinės progresijos n narių suma
Naudojantis ciklu, suskaičiuokite, kiek reikia sudėti aritmeninės progresijos narių, kad šių suma būtų didžiausia, bet mažesnė nei duotoji.
Galite šią užduotį pasitikrinti išsprendę matematiškai, susidarę nelygybę iš aritmetinės progresijos n narių sumos formulės.
Pasitikrinimas
| Atvejis | n-tojo nario formulė | Didžiausia reikšmė | Elementų kiekis sumoje |
|---|---|---|---|
| 1 | 55 | 10 | |
| 2 | 150 | 8 | |
| 8 | 5000 | 20 | |
| 9 | 1275 | 50 | |
| 11 | -100 | 50 | |
| 12 | -50 | 20 | |
| 13 | -500 | 10 | |
| 14 | 50 | "Not Reachable" | |
| 15 | 1 | "Not Reachable" |
7. Aritmetinės progresijos nario eilės numerio radimas
Suraskite didžiausią aritmetinės progresijos nario, kurio reikšmė mažesnė nei duotoji, eilės numerį. Šią užduotį padarykyte dviem būdais: su ciklu ir be.
Pasitikrinimas
| Atvejis | Pirmasis narys | Skirtumas | Riba | Nario numeris |
|---|---|---|---|---|
| 1 | 10 | -5 | -5 | 2 |
| 2 | 10 | 10 | 35 | 2 |
| 3 | 1 | 2 | 5 | 1 |
| 4 | -10000 | 1000 | 5000 | 14 |
| 5 | 500 | 250 | 10000 | 37 |
| 6 | 0 | -100 | -10000 | 99 |
| 7 | -100 | -50 | -10000 | 197 |
| 8 | -5000 | 100 | 0 | 49 |
| 9 | 12345 | 6789 | 987654321 | 145405 |
| 10 | 0 | 100000 | 100000000 | 999 |
| 11 | 5 | 0 | 10 | 0 |
| 12 | 5 | 0 | 5 | -1 |
| 13 | -50 | -5 | -75 | 4 |
8. Ilgiausias posekis ir aritmetinė progresija
Iš duotosios sekos suraskite ilgiausią iš eilės einančių narių posekį, kuris yra aritmetinė progresija. Šią seką turi sudaryti daugiau negu vienas narys. Nurodykite jos skirtumą. Neegzistuojant sekai išveskite žinutę, kad „seka nerasta“ (ar panašiai).
Paaiškinimas
Posekis - seka, gauta iš kitos sekos pašalinus kai kuriuos narius. Pavyzdžiui, turime baigtinę seką , iš jos galima sudaryti įvairius posekius , , , ir t.t.
Ieškokite tokių posekių, kuriose skaičiai eina iš eilės - vienas po kito. Nedarykite šuolių tarp skaičių ir sutelkite dėmesį tik į skaičius, kurie sąraše yra vienas šalia kito. Pavyzdžiui, iš sekos galima pamatyti padaryti daug posekių, iš iš eilės einančių skaičių: , , ir t.t. Bet ne visi posekiai yra aritmetinės progresijos.
Pagal apribojimus, iš sekos galima sudaryti tokias aritmetines progresijas:
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; ;
- ; .
Ilgiausias posekis iš šių yra , tai taip pat yra aritmetinė progresija, jos skirtumas lygus .
Pasitikrinimas
| Sunkumas | Pradinė seka | Didžiausias posekis | Skirtumas |
|---|---|---|---|
| Kraštutiniai atvejai | |||
| Tuščia seka | [] | [] | - |
| Vienodi elementai | [7, 7, 7, 7, 7] | [7, 7, 7, 7, 7] | 0 |
| Pradinė seka ne aritmetinė | [1, 3, 7, 8, 10, 15] | [7, 8] | 1 |
| Slankiojo kablelio skaičiai (float) | [1.1, 2.2, 3.3, 4.4, 5.5, 5.0, 4.5, 4.0] | [1.1, 2.2, 3.3, 4.4, 5.5] | 1.1 |
| Praprasti atvejai | |||
| Vienas elementas | [5] | [] | - |
| Du elementai | [3, 7] | [3, 7] | 4 |
| Vidutinis | |||
| Paprasta AP | [1, 2, 3, 4, 5] | [1, 2, 3, 4, 5] | 1 |
| Kelios AP | [1, 3, 5, 7, 9, 11, 2, 4, 6, 8] | [1, 3, 5, 7, 9, 11] | 2 |
| Sunkiausias | |||
| Ne iš eilės einantys skaičiai | [10, 7, 4, 1, -2, 0, 3, 6, 9] | [10, 7, 4, 1, -2] | -3 |
| Skirtingi skirtumai | [5, 10, 15, 20, 18, 16, 14, 12, 10] | [18, 16, 14, 12, 10] | -2 |
| Mišrus atvejis | [1.1, 2, 3.3, 4, 5.5, 6, 7.7, 8, 9.9, 10] | [2, 3.3, 4, 5.5, 6] | 1.1 |
*AP - aritmetinė progresija.