Ciklas cikle
Programavime programavimo sintaksės mechanizmus (if, for, while ir kt.) galima jungti tarpusavyje, dėti vienas į kitą. Šiandien pasižiūrėsim, kaip veikia ciklas cikle, ką su juo galima padaryti, bet prieš tai apžvelgsime sąrašus saraše arba sarašą sudaryta iš sarašų.
Sąrašas iš sarašų
Pradėkime nuo vizualaus pavyzdžio:
lists_in_list = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
Kartais tokie sąrašai gali pateikti ir vienoje eilutėje:
lists_in_list = [[5, 9, 5, 2, 6, 7], [7, 7, 7, 8, 6, 5, 5, 10], [5, 6, 7, 7, 7, 6, 5, 4], [5, 5, 7]]
Aukščiau yra pateikiamas kintamasis, kurio reikšmė yra sąrašas sudarytas iš kitų sarašų. Tokią struktūrą galima perrašyti naudojantis keletą kintamųjų:
list_1 = [5, 9, 5, 2, 6, 7]
list_2 = [7, 7, 7, 8, 6, 5, 5, 10]
list_3 = [5, 6, 7, 7, 7, 6, 5, 4]
list_4 = [5, 5, 7]
lists_in_list = [list_1, list_2, list_3, list_4]
Gal toks pavyzdys, kur mažiau vizualinės taršos, bus aiškesnis.
Kam reikia tokių sąrašų?
- Talpinti studentų pažymius;
- Talpinti savaitės valandinius temperatūros rodmenis;
- Sarašas iš žodžių yra savotiškas sąrašai saraše;
- Visi duomenys, kuriuos galima pateikti lentelėje, gali būti pateikiami, kaip sąrašai sarašai.
Reikšmių pasiekimas tokiame sąraše toks pat, kaip ir įprastam.
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
student_1_marks = students_marks[1]
print(f"Type of student_1_marks: {type(student_1_marks)}" )
print(f"Value of student_1_marks: {student_1_marks}" )
print(f"Length of student_1_marks: {len(student_1_marks)}" )
Tokio kodo išvestis:
Type of student_1_marks: <class 'list'>
Value of student_1_marks: [7, 7, 7, 8, 6, 5, 5, 10]
Length of student_1_marks: 8
Jeigu norime pasiekti vieną elementą, reikia nurodyti dar vieną indeksą:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
student_1_marks = students_marks[1]
student_1_last_mark = student_1_marks[-1]
print(f"Type of student_1_marks: {type(student_1_last_mark)}" )
print(f"Value of student_1_marks: {student_1_last_mark}" )
Kodo išvestis:
Type of student_1_marks: <class 'int'>
Value of student_1_marks: 10
Aukščiau esantį galima sutrumpinti ir naudoti tokią sintaksę list[i][j]:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
# student_1_marks = students_marks[1]
# student_1_last_mark = student_1_marks[-1]
student_1_last_mark = students_marks[1][-1]
print(f"Type of student_1_marks: {type(student_1_last_mark)}" )
print(f"Value of student_1_marks: {student_1_last_mark}" )
Tokį sintaksę galima pavaizduoti šitaip:
Iteravimas per sąrašus saraše
Vieno elemento paėmimas dažnu atveju mums nenaudingas. Mes turime galėti manipuliuoti visais skaičiais esančiais sąrašuose. Tą padarysime su ciklu cikle. Pirmiausia pasižiūrėkime, kokia bus išvestis, kai iteruosime per sąrašus sąraše:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
for marks in students_marks:
print(marks)
Išvestis:
[5, 9, 5, 2, 6, 7]
[7, 7, 7, 8, 6, 5, 5, 10]
[5, 6, 7, 7, 7, 6, 5, 4]
[5, 5, 7]
Gaunami visi pavieniai sąrašai. Jeigu norime iteruoti per tuos pavienius sąrašus, mes galime įdėti dar vieną ciklą:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
for marks in students_marks: # Outer loop for rows
for mark in marks: # Inner loop for columns
print(mark)
Išvestis:
5
9
5
2
6
7
7
7
7
8
6
5
5
10
5
6
7
7
7
6
5
4
5
5
7
Dabar jau galima pasiekti pavienius pažymius, todėl sutvarkyme išvest ir atspaudinkime formatuotus duomenis:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
for i, marks in enumerate(students_marks): # Outer loop for rows
print(f"student {i} marks: ", end="")
for mark in marks: # Inner loop for columns
print(mark, end=" ")
print("")
Išvestis:
student 0 marks: 5 9 5 2 6 7
student 1 marks: 7 7 7 8 6 5 5 10
student 2 marks: 5 6 7 7 7 6 5 4
student 3 marks: 5 5 7
Iteravimas naudojant indeksus
Kartais su tokiais sąrašais reikia dirbti naudojantis iteravimą su indeksais. Konkretesnės problemos bus pateiktos vėliau, o dabar, kaip taip daroma.
spreadsheet = [
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
]
for i in range(len(spreadsheet)): # Outer loop for rows
for j in range(len(spreadsheet[i])): # Inner loop for columns
print(spreadsheet[i][j], end=" ")
print()
Pirmajame ciklo sakinyje (šiuo atveju), keičiami indeksai, kurie bus naudojami eilutei nurodyti. Su sekančiu ciklo sakiniu keičiamas indeksas, kuris nurodo i eilutės elemento numerį (0, 1, 2, ,3, 4...).
Pereikime prie konkretesnio pavyzdžio. Tarkime turime visos savaitės temperatūros duomenis, kurie pateikti kas tris valandas. Tokiai lentelei apdoroti programavime reikia naudoti sąrašą saraše. Pasižiūrėkite, kaip kinta ciklų indeksai ir kokios reikšmės atspausdinamos.
| 00:00 | 03:25 | 06:50 | 10:15 | 13:40 | 17:05 | 20:30 | |
|---|---|---|---|---|---|---|---|
| Mon | 5°C | 10°C | 15°C | 20°C | 25°C | 30°C | 35°C |
| Tue | 8°C | 12°C | 18°C | 22°C | 27°C | 32°C | 37°C |
| Wed | 6°C | 11°C | 16°C | 21°C | 26°C | 31°C | 36°C |
| Thu | 7°C | 13°C | 17°C | 23°C | 28°C | 33°C | 38°C |
| Fri | 9°C | 14°C | 19°C | 24°C | 29°C | 34°C | 39°C |
| Sat | 10°C | 15°C | 20°C | 25°C | 30°C | 35°C | 40°C |
| Sun | 11°C | 16°C | 21°C | 26°C | 31°C | 36°C | 41°C |
# for space saving purposes, the example list is not completely defined
temperatures = [[5, 10, 15, 20, 25, 30, 35], ..., [11, 16, 21, 26, 31, 36, 41]]
for i in range(len(temperatures)):
for j in range(len(temperatures[i])):
print(f"day {i+1}, hour {j+1}: {temperatures[i][j]}°C")
Plokštinimas
Kartais sąrašus sąraše reikia sujungti į vieną. Paversti tokią struktūrą
[
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
į tokia:
[5, 9, 5, 2, 6, 7, 7, 7, 7, 8, 6, 5, 5, 10, 5, 6, 7, 7, 7, 6, 5, 4, 5, 5, 7]
Tai padarom iteruojant per visus elementus ir tuos elementus dedant į naują sąrašą:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
flatten_marks = []
for marks in students_marks:
for mark in marks:
flatten_marks.append(mark)
print(flatten_marks)
Pradinis sąrašas patampa tokiu:
[5, 9, 5, 2, 6, 7, 7, 7, 7, 8, 6, 5, 5, 10, 5, 6, 7, 7, 7, 6, 5, 4, 5, 5, 7]
Ką su tokios formos sąrašu galima padaryti? Galima apskaičiuoti įvairius kitas reikšmes, pavyzdžiui, vidurkį:
students_marks = [
[5, 9, 5, 2, 6, 7],
[7, 7, 7, 8, 6, 5, 5, 10],
[5, 6, 7, 7, 7, 6, 5, 4],
[5, 5, 7]
]
flattened_marks = []
for marks in students_marks:
for mark in marks:
flattened_marks.append(mark)
average = sum(flattened_marks)/len(flattened_marks)
print(f"Overall average of students marks: {average}")
Kodo išvestis:
Overall average of students marks: 6.12
Pavyzdys #1
Panaudosime sąrašus saraše, kad sukurtume daugybos lentelę. Šiai lentelei bus galima pateikti dydį.
Tai pirmiausiai sukurkime kintamuosius: eilučių ir stulpelių kiekis, pradinė lentelė:
rows = 4
cols = 6
multiplication_table = []
Toliau sukurkime ciklus, kuriuos iteruosime tiek kartu, kiek nurodėme kodo pradžioje. Šiuose cikluose skaičiuosime eilutės ir stulpelio sandaugą ir ją įsisaugosime į mūsų sąrašą:
for i in range(1, rows + 1):
row = []
for j in range(1, cols + 1):
row.append(i * j)
multiplication_table.append(row)
Galime patikrint rezultatą su print(multiplication_table):
[[1, 2, 3, 4, 5, 6], [2, 4, 6, 8, 10, 12], [3, 6, 9, 12, 15, 18], [4, 8, 12, 16, 20, 24]]
Kad būtų aiškiau, atsispaudinkime tik eilutes:
for row in multiplication_table:
print(row)
[1, 2, 3, 4, 5, 6]
[2, 4, 6, 8, 10, 12]
[3, 6, 9, 12, 15, 18]
[4, 8, 12, 16, 20, 24]
O su f-strings galima padaryti dar aiškiau:
# Print the table header
header = []
for j in range(1, cols + 1):
header.append(f"{j:>4}") # Right-align the header values
print(f"{'':>2} | {' | '.join(header)}") # Join header with ' | '
print("-" * (len(' | '.join(header)) + 6)) # Adjust the length of the separator
# Print each row of the multiplication table
for i, row in enumerate(multiplication_table, start=1):
formatted_row = []
for value in row:
formatted_row.append(f"{value:>4}") # Right-align each value in the row
print(f"{i:>2} | {' | '.join(formatted_row)}") # Join row values
| 1 | 2 | 3 | 4 | 5 | 6
---------------------------------------------
1 | 1 | 2 | 3 | 4 | 5 | 6
2 | 2 | 4 | 6 | 8 | 10 | 12
3 | 3 | 6 | 9 | 12 | 15 | 18
4 | 4 | 8 | 12 | 16 | 20 | 24
Pavyzdys #2
Pasižiūrėkime, kaip galima keisti pašviesinti paveiksliuką (paprastumo dėlei, tai bus tik pilkų atspalvių paveiksliukas).
Šis pavyzdyje bus naudojami programavimo principai, kurių dar neturėtumėte mokėti. Jeigu norėsite sekti šį pavyzdį, susikurkite tekstinį failą pixel_data.txt tame pačiame aplankale, kuriame bus jūsų kodas. Taip pat bus panaudota biblioteką matplotlib. Įsirašyti galite suvedę į terminalą:
pip3 install matplotlib
Į failą pixel_data.txt, įkelkite duomenis, kuriuos rasite puslapio apačioje. Turint duomenis pirmiausia reikės nuskaiyti. Tai išmoksite kitoje pamokoje, bet dabar bandykite sekti pavyzdį:
import matplotlib.pyplot as plt
# Load pixel data from text file
filename = 'pixel_data.txt'
with open(filename, 'r') as file:
data = file.readlines()
Be duomenų nuskaitymo, taip pat įsikėlėme biblioteką. Jeigu pabandytumėte paleisti print(data), turėtumėte pamatyti labai daug skaičiukų. Šiuos skaičius mes dabar paversime į sąrašą iš sarašų.
Šie skaičiukai yra paveiksliuko kiekvieno pikselio reikšmė, kuri kinta nuo 0 iki 255. 0 reiškia baltą spalvą, o 255 - juodą. Visos spalvos tarp jų yra pilkos spalvos atspalviai. Viena skaičių eilutė yra viena paveiksliuko linija.
# Convert text data to a 2D list of integers using indices
pixel_array = []
for line in data:
row = line.split()
row_list = []
for i in range(len(row)):
row_list.append(int(row[i]))
pixel_array.append(row_list)
Dabar jau turime sąrašus sąraše. Toliau - šios pamokos pagrindiniai principai:
# Apply brightness adjustment using indices
factor = 1.5 # Adjust the brightness factor as needed
bright_pixel_array = []
for i in range(len(pixel_array)):
bright_row = []
for j in range(len(pixel_array[i])):
bright_value = pixel_array[i][j] * factor
if bright_value > 255: # bright_value = min(bright_value, 255)
bright_value = 255
bright_row.append(bright_value)
bright_pixel_array.append(bright_row)
Čia sukuriamas naujas sąrašo kintamasis, į kurį dėsime naujas spalvų reikšmes. Toliau iteruojama per spalvų eilutes, toliau per individualias reikšmes. Šios reikšmės
sudauginamos su ryškumo daugikliu factor. Jeigu tas rezultas yra didesnis negu 255, priskiriama reikšmė 255. Taip daroma, kadangi spalvos reikšmė negali viršyti 255, visos viršijančios reikšmės nuleidžiamos žemyn. Tokį patį efektą būtų galima gauti su min() funkcija. Toliau tos apskaičiuotos reikšmės sudedamos į sąrašą. O kai baigėsi vienos eilutės elementai, tas sudarytas sąrašas įdedamas dar į kitą sąrašą, kuriame saugomos naujo paveiksliuko reikšmės.
Toliau kodo nebūtina aiškintis, eilutės žemiau reikalingos, kad būtų galima pamatyti vizualų rezultatą ir pokytį tarp pradinio ir rezultato paveiksliuko. Tam panaudojama mūsų anksčiau įsirašyta matplotlib biblioteka:
# Display images
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
# Define a colormap
cmap = plt.get_cmap('gray')
# Original image
ax[0].imshow(pixel_array, cmap=cmap, vmin=0, vmax=255)
ax[0].set_title('Original Image')
ax[0].axis('off')
# Brightened image
ax[1].imshow(bright_pixel_array, cmap=cmap, vmin=0, vmax=255)
ax[1].set_title('Brightened Image')
ax[1].axis('off')
plt.show()
Užduotys
1. Visos savaitės temperatūros vidurkis
Užduotis
Suskaičiuokite visos savaitės temperatūris vidurkį. Temperatūros pateiktos sąrašais sąraše:
temperatures = [
[5, 10, 15, 20, 25, 30, 35],
[8, 12, 18, 22, 27, 32, 37],
[6, 11, 16, 21, 26, 31, 36],
[7, 13, 17, 23, 28, 33, 38],
[9, 14, 19, 24, 29, 34, 39],
[10, 15, 20, 25, 30, 35, 40],
[11, 16, 21, 26, 31, 36, 41]
]
Aukščiau pateiktų temperatūrų vidurkis:
Average Temperature: 24.57
Paaiškinimas
Vienoje eilutėje saugoma dienos temperatūros 00:00, 03:25, 06:50, 10:15, 13:40, 17:05, 20:30 valandomis. Stulpelis reprezentuoja dieną, nuo pirmadienio iki sekmadienio. Pavyzdžiui:
- Pirmadienį 03:25 valandą temperatūra buvo 5°C - 0 eilutė, 1 stulpelis;
- Trečiadienį 17:05 valandą temperatūra buvo 5°C - 2 eilutė, 5 stulpelis;
- Penktadienį 20:30 valandą temperatūra buvo 5°C - 4 eilutė, 6 stulpelis;
- Sekmadienį 00:00 valandą temperatūra buvo 5°C - 6 eilutė, 0 stulpelis;
- Ketvirtadienį 03:25 valandą temperatūra buvo 5°C - 3 eilutė, 1 stulpelis;
Kiti duomenys pasitikrinimui
# Average 10.00
temperatures_1 = [
[10, 15, 20],
[5, 10, 15],
[0, 5, 10]
]
# Average 15.50
temperatures_2 = [
[1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24],
[25, 26, 27, 28, 29, 30]
]
# Average 37.00
temperatures_3 = [
[-10, -5, 0, 5, 10],
[10, 15, 20, 25, 30],
[30, 35, 40, 45, 50],
[50, 55, 60, 65, 70],
[70, 75, 80, 85, 90]
]
2. Kurią dieną temperatūra didžiausia
Suskaičiuokite, kurią dieną vidutiniškai buvo didžiausia temperatūra.
Duomenys ir tikėtini rezultatai:
# Highest Average Temperature: Day 5 with an average of 40.36.
temperatures_1 = [
[21.1, 26.2, 31.3, 36.4, 41.5, 46.6, 51.7], # Day 1
[23.4, 28.5, 33.6, 38.7, 43.8, 48.9, 54.0], # Day 2
[20.5, 25.6, 30.7, 35.8, 40.9, 45.0, 50.1], # Day 3
[19.9, 24.0, 29.1, 34.2, 39.3, 44.4, 49.5], # Day 4
[25.0, 30.1, 35.2, 40.3, 45.4, 50.5, 55.6], # Day 5
[24.0, 29.1, 34.2, 39.3, 44.4, 49.5, 54.6], # Day 6
[22.8, 27.9, 33.0, 38.1, 43.2, 48.3, 53.4] # Day 7
]
# Highest Average Temperature: Day 6 with an average of 18.99.
temperatures_2 = [
[10.5, 11.1, 12.3, 13.5, 14.7, 15.9, 16.8], # Day 1
[8.0, 9.2, 10.4, 11.6, 12.8, 14.0, 15.3], # Day 2
[7.0, 8.3, 9.5, 10.8, 12.1, 13.4, 14.6], # Day 3
[5.0, 6.2, 7.4, 8.6, 9.8, 11.0, 12.2], # Day 4
[3.5, 4.8, 6.0, 7.3, 8.5, 9.8, 11.0], # Day 5
[15.5, 16.2, 17.1, 18.4, 19.5, 20.7, 21.9], # Day 6
[10.0, 10.5, 11.1, 12.6, 13.0, 13.5, 14.0] # Day 7
]
# Highest Average Temperature: Day 5 with an average of 7.34.
temperatures_3 = [
[0.5, 1.1, 1.8, 2.5, 3.3, 4.2, 5.0], # Day 1
[2.1, 2.8, 3.6, 4.4, 5.3, 6.2, 7.1], # Day 2
[3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0], # Day 3
[4.0, 4.5, 5.1, 5.6, 6.2, 6.7, 7.3], # Day 4
[5.1, 5.9, 6.6, 7.4, 8.1, 8.8, 9.5], # Day 5
[6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0], # Day 6
[7.2, 7.6, 8.0, 8.5, 9.0, 9.5, 10.0] # Day 7
]
3. Mažiausia temperatūra savaitėje
Raskite, kurią dieną ir valandą temperatūra buvo mažiausia savaitėje.
Duomenys ir tikėtini rezultatai:
# Lowest Average Temperature: 20.78 at 00:00 on Day 5 with 5.20.
temperatures_1 = [
[10.5, 15.2, 20.3, 25.1, 30.0, 35.6, 40.2], # Day 1
[12.4, 18.1, 24.6, 30.2, 36.3, 42.8, 48.5], # Day 2
[8.7, 14.3, 22.5, 28.8, 34.9, 40.1, 46.2], # Day 3
[15.3, 20.0, 25.5, 30.2, 35.7, 40.8, 45.9], # Day 4
[5.2, 10.4, 15.8, 20.0, 25.9, 30.6, 35.3], # Day 5
[20.0, 25.5, 30.2, 35.1, 40.7, 45.3, 50.0], # Day 6
[18.2, 22.5, 26.7, 30.9, 34.1, 38.4, 42.6] # Day 7
]
# Lowest Average Temperature: 0.80 at 00:00 on Day 3 with -1.0.
temperatures_2 = [
[1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], # Day 1
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], # Day 2
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0], # Day 3
[0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2], # Day 4
[1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3], # Day 5
[0.8, 1.8, 2.8, 3.8, 4.8, 5.8, 6.8], # Day 6
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0] # Day 7
]
# Result: Lowest temperature at 06:50 on Day 3 with -8.0.
temperatures_3 = [
[-5.0, -3.2, 0.1, 2.5, -1.5, 4.0, -2.0], # Day 1
[0.0, -1.0, 3.5, 5.0, -4.0, 2.2, 1.0], # Day 2
[-7.0, -6.5, -8.0, 0.0, 1.0, -2.5, -4.0], # Day 3
[-3.5, -2.0, 0.5, 1.5, -1.0, 3.0, 0.0], # Day 4
[-8.0, -5.0, -2.0, 0.0, -1.0, 2.0, -3.5], # Day 5
[-4.0, -3.5, -2.5, 0.5, 1.0, -1.0, -2.0], # Day 6
[-6.0, -4.0, -1.0, 2.0, 0.0, -3.0, -2.5] # Day 7
]
4. Mažiausia temperatūra
Suskaičiuokite, kurioje valandoje vidutiniškai buvo mažiausia temperatūra per diena. Duomenys ir tikėtini rezultatai:
# Result: Lowest temperature at 00:00 on Day 5 with 5.20.
temperatures_1 = [
[10.5, 15.2, 20.3, 25.1, 30.0, 35.6, 40.2], # Day 1
[12.4, 18.1, 24.6, 30.2, 36.3, 42.8, 48.5], # Day 2
[8.7, 14.3, 22.5, 28.8, 34.9, 40.1, 46.2], # Day 3
[15.3, 20.0, 25.5, 30.2, 35.7, 40.8, 45.9], # Day 4
[5.2, 10.4, 15.8, 20.0, 25.9, 30.6, 35.3], # Day 5
[20.0, 25.5, 30.2, 35.1, 40.7, 45.3, 50.0], # Day 6
[18.2, 22.5, 26.7, 30.9, 34.1, 38.4, 42.6] # Day 7
]
# Result: Lowest temperature at 00:00 on Day 3 with -1.0.
temperatures_2 = [
[1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], # Day 1
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], # Day 2
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0], # Day 3
[0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2], # Day 4
[1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3], # Day 5
[0.8, 1.8, 2.8, 3.8, 4.8, 5.8, 6.8], # Day 6
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0] # Day 7
]
# Lowest Temperature: 0.80 at 00:00 on Day 3 with -1.0.
temperatures_3 = [
[1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7], # Day 1
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], # Day 2
[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0], # Day 3
[0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2], # Day 4
[1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3], # Day 5
[0.8, 1.8, 2.8, 3.8, 4.8, 5.8, 6.8], # Day 6
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0] # Day 7
]
5. Arčiausiai vidurkio
Raskite, kurią dieną ir valandą temperatūra buvo arčiausiai visos savaitės vidurkio. Duomenys ir tikėtini rezultatai:
# Overall Average Temperature: -3.50
# Day with the Lowest Difference: Day 2 at 03:25 with a temperature of -1.0.
temperatures_1 = [
[-5.0, -3.2, 0.1, 2.5, -1.5, 4.0, -2.0],
[0.0, -1.0, 3.5, 5.0, -4.0, 2.2, 1.0],
[-7.0, -6.5, -8.0, 0.0, 1.0, -2.5, -4.0],
[-3.5, -2.0, 0.5, 1.5, -1.0, 3.0, 0.0],
[-8.0, -5.0, -2.0, 0.0, -1.0, 2.0, -3.5],
[-4.0, -3.5, -2.5, 0.5, 1.0, -1.0, -2.0],
[-6.0, -4.0, -1.0, 2.0, 0.0, -3.0, -2.5]
]
# Overall Average Temperature: -6.10
# Day with the Lowest Difference: Day 3 at 06:50 with a temperature of -8.0.
temperatures_2 = [
[-10.0, -8.0, -5.0, -3.0, -1.0, 0.0, 2.0],
[-5.5, -4.0, -2.5, 0.5, 1.0, 2.5, 3.0],
[-12.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0],
[-7.5, -6.5, -5.5, -4.0, -3.0, -1.0, 1.0],
[-15.0, -13.0, -11.0, -9.0, -7.0, -5.0, -3.0],
[-8.0, -6.0, -4.0, -2.0, 0.0, 1.0, 2.0],
[-9.0, -7.0, -5.0, -3.0, -2.0, 0.0, 1.0]
]
# Overall Average Temperature: 7.50
# Day with the Lowest Difference: Day 5 at 10:15 with a temperature of 9.0.
temperatures_3 = [
[10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0],
[9.5, 8.5, 7.5, 6.5, 5.5, 4.5, 3.5],
[11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0],
[8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0],
[12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0],
[7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0],
[13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0]
]
6. Tic-tac-toe (žaidėjas prieš žaidėją)
Užduotis
Sukurkite tic-tac-toe žaidimą, kuris žaidžiamas naudojant terminalą.
Išbandyti galite čia:
Žaidimo eigos pavyzdys
-------------------------
Tic-Tac-Toe @ Vilijus
-------------------------
Rules:
1. First player is defined as P1 and he places "X" on the board;
2. Second player is defined as P2 and he places "O" on the board;
3. Enter coordinates in the format "X,Y"; for example, "1,2" - this represents the first row and the second column.
==================================================
Game Board:
-------------
| | | |
-------------
| | | |
-------------
| | | |
-------------
Enter P1 (X) move: 1,1
Enter P2 (0) move: 2,2
Game Board:
-------------
| X | | |
-------------
| | 0 | |
-------------
| | | |
-------------
Enter P1 (X) move: 1,2
Enter P2 (0) move: 1,1
Cell is occupied!
Enter P2 (0) move: 1,1
Cell is occupied!
Enter P2 (0) move: 1,4
Coordinates are outside the board!
Enter P2 (0) move: 1,-4
Coordinates are outside the board!
Enter P2 (0) move: 1,1,1,1,3
Invalid coordinates entered!
Enter P2 (0) move: 3,3
Game Board:
-------------
| X | X | |
-------------
| | 0 | |
-------------
| | | 0 |
-------------
Enter P1 (X) move: 3,3
Cell is occupied!
Enter P1 (X) move: 1,3
Enter P2 (0) move: 2,1
Game Board:
-------------
| X | X | X |
-------------
| 0 | 0 | |
-------------
| | | 0 |
-------------
Player 1 won the game
Congratulations!!!
Reikalavimai
- Turi būti pateiktos taisyklės;
- Įvestis į terminalą turi būti patikrinama (nebūtina tikrinti, ar įvesti skaičiai);
- Žaidėjas veda koordinates į terminalą, kol įveda teisingas koordinates;
- Žaidimas baigiasi, kai „X“ ar „O“ simbolius galima sujungti linija arba lentoje nebėra vietos;
- Žaidimo lenta atvaizduojama prieš žaidimą ir po kiekvieno raundo;
- Pasibaigus žaidimui, turi būti pateiktas pranešimas, žaidimo pabaigimo priežastis (kažkuris iš žaidėjo laimėjo arba nebėra galimų ėjimų)
Patarimai
- Žaidimo lentos duomenims saugoti naudokite sąrašą saraše;
- Begaliniam koordinačių įvedimui naudokite
whileciklą, kurioje sąlygoje kintamasis, kuris nurodo, ar įvestis tinkama; - Duplikuokite kodą koordinačių įvedimui ir patikrinimui; jeigu mokate funkcijas, galite jas panaudoti duplikavimo sumažinimui;
- Po kiekvieno įvesties patikrinimo, esant jam netinkamam, galite naudoti
continueraktažodį, kad praleistumėte toliau esantį kodą ir iš naujo paprašytumėte įvesti koordinates; - Kodas turėtų gautis ne trumpas, apie 100 eilučių.
Rašant ilgesnį kodą, sprendžiant didesnio masto problemas, problemą reikią skaidyti į mažesnes. Tarkime šią užduotį galima atlikti palaipsniui:
- Pirmiausia su
print()funkcija atspausdinti pradinį tekstą (pavadinimą, taisykles, žaidimo lentą); - Sukurti kodą, kuris nuskaito tik vieno žaidėjo įvestį; Žaidimo lentos dar nereiktų atnaujinti;
- Dar netikrinant įvesties teisingumo, atnaujinti žaidimo lentelą pagal tik vieno žaidėjo įvestį;
- Šiame žingsnyje jūsų programa turėtų atspausdint reikalingą tekstą ir turėtų būti galimybė įvesti kooordinates ir taip atnaujinti žaidimo lentą;
- Toliau galima patikrinti įvestį ir padaryti taip, kad įvedus neteisingą, būtų prašoma iš naujo;
- Galima padaryti tikrininama, kad pasibaigus laisvai vietoje lentoje, žaidimas pabaigiamas;
- Pridedamas antras žaidėjas, kuriam galioja visos įvesties sąlygos, kaip ir pirmajam;
- Sukuriamas patikrinimas, ar žaidimas yra laimėtas;
Šių žingsnių eiliškumas gali kisti, užduotys gali būti skaidomos arba stambinamos, keičiamos. Viskas priklauso nuo jūsų poreikių ir norų.
7. Tic-tac-toe (žaidėjas prieš kompiuterį)
Modifikuokite ankstesnios užduoties kodą ir padarykite taip, kad antrojo žaidėjo koordinates įvestų kompiuteris.
Pavyzdžio #2 duomenys ir kodas
Vaizdo duomenys
230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 0 0 0 0 0 0 230 230 230 230 230 230 230 0 0 0 230 230 230 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 0 0 165 165 165 165 165 165 0 0 230 230 230 230 0 165 165 165 0 0 0 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 230 0 165 165 140 140 140 140 140 140 165 165 0 230 230 0 165 140 140 140 165 165 165 0 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 165 0 0 165 140 140 140 140 140 140 140 165 0 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 72 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 140 72 72 72 72 72 72 72 72 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 72 72 140 140 140 140 140 140 140 140 72 72 72 72 72 72 72 72 72 72 72 0 0 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 72 140 140 140 140 140 140 72 72 72 72 72 140 140 140 140 140 140 140 140 140 140 140 140 0 230 230 230 230 230
230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 72 72 72 140 140 140 140 140 140 140 140 140 72 72 72 72 72 72 72 140 140 0 230 230 230 230
230 230 230 230 230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 140 140 140 140 140 140 140 140 72 72 140 0 230 230 230
230 230 230 230 230 230 230 0 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 72 72 72 140 140 140 140 140 140 140 140 140 140 140 140 140 140 0 230 230
230 230 230 230 230 230 0 165 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 140 140 140 140 140 140 140 140 140 140 140 140 140 140 0 230 230
230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 72 72 72 140 140 140 140 140 140 140 140 140 140 140 140 140 140 0 230 230
230 230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 72 140 140 72 72 72 72 72 72 255 255 255 255 255 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 0 230
230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 72 72 255 255 255 255 255 0 0 255 0 255 255 72 255 255 255 255 255 255 255 0 0 255 0 255 255 255 0 230
230 230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 255 255 0 0 0 0 0 0 255 72 255 255 255 255 255 255 0 0 0 0 0 0 255 0 230 230
230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 0 255 0 0 0 0 72 255 255 255 255 255 255 255 0 255 0 0 0 0 0 230 230 230
230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 72 0 230 230 230 230
230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 140 140 72 140 140 140 140 140 140 140 140 0 230 230 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 140 140 140 140 72 72 72 72 72 72 72 0 230 230 230 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 72 72 72 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 76 76 76 76 76 76 76 76 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 76 0 230 230 230 230
230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 76 108 108 108 108 108 108 108 108 76 76 76 140 140 140 140 140 140 140 140 140 140 76 76 76 108 108 0 230 230 230
230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 76 108 108 76 76 76 76 76 108 108 108 108 76 76 76 76 76 76 76 76 76 76 108 108 108 108 108 0 230 230 230
230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 76 108 108 108 108 108 108 108 76 76 76 108 108 108 108 108 108 108 108 108 108 108 108 76 76 76 0 230 230 230 230
230 230 230 0 165 140 140 140 140 140 140 140 140 140 140 140 140 76 76 76 108 108 108 108 108 108 76 76 76 76 76 76 76 76 76 76 76 76 76 108 108 0 230 230 230 230 230
230 230 230 230 0 165 165 140 140 140 140 140 140 140 140 140 140 140 140 140 76 76 76 76 76 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 108 0 230 230 230 230 230
230 230 230 230 230 0 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 76 76 76 76 76 76 76 76 76 76 76 76 76 0 0 0 230 230 230 230 230 230
230 230 230 230 230 230 230 0 165 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 0 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 0 0 165 165 165 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 165 0 0 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 0 0 0 0 165 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140 165 165 0 0 230 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 0 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 0 0 230 230 230 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230
230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230
Pilnas kodas:
import matplotlib.pyplot as plt
# Load pixel data from text file
filename = 'pixel_data.txt'
with open(filename, 'r') as file:
data = file.readlines()
# Convert text data to a 2D list of integers using indices
pixel_array = []
for line in data:
row = line.split()
row_list = []
for i in range(len(row)):
row_list.append(int(row[i]))
pixel_array.append(row_list)
# Apply brightness adjustment using indices
factor = 1.5 # Adjust the factor as needed
bright_pixel_array = []
for i in range(len(pixel_array)):
bright_row = []
for j in range(len(pixel_array[i])):
bright_value = int(pixel_array[i][j] * factor)
if bright_value > 255:
bright_value = 255
bright_row.append(bright_value)
bright_pixel_array.append(bright_row)
# Display images
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
# Define a colormap
cmap = plt.get_cmap('gray')
# Original image
ax[0].imshow(pixel_array, cmap=cmap, vmin=0, vmax=255)
ax[0].set_title('Original Image')
ax[0].axis('off')
# Brightened image
ax[1].imshow(bright_pixel_array, cmap=cmap, vmin=0, vmax=255)
ax[1].set_title('Brightened Image')
ax[1].axis('off')
plt.show()
Toliau
Išmokus ciklus cikle, juos panaudosime sekančioje pamokoje, skaitant duomenis iš failo. Šiuose failuose duomenys bus tokie duomenys, kuriuos turėsim saugoti sąraše iš sąrašų ir juos apdoroti.