Labas, Pasauli!

Ciklas cikle

VP
Vilius P.
2024-09-17

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:

.py
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:

.py
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ų:

.py
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.

.py
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:

cmd
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ą:

.py
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:

cmd
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]:

.py
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:

.py
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:

cmd
[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ą:

.py
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:

cmd
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:

.py
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:

cmd
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.

.py
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:0003:2506:5010:1513:4017:0520:30
Mon5°C10°C15°C20°C25°C30°C35°C
Tue8°C12°C18°C22°C27°C32°C37°C
Wed6°C11°C16°C21°C26°C31°C36°C
Thu7°C13°C17°C23°C28°C33°C38°C
Fri9°C14°C19°C24°C29°C34°C39°C
Sat10°C15°C20°C25°C30°C35°C40°C
Sun11°C16°C21°C26°C31°C36°C41°C
i= , j= 
.py
# 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")
cmd

Plokštinimas

Kartais sąrašus sąraše reikia sujungti į vieną. Paversti tokią struktūrą

text
[
  [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:

cmd
[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šą:

.py
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:

cmd
[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į:

.py
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:

cmd
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ė:

.py
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šą:

.py
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):

cmd
[[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:

.py
for row in multiplication_table:
    print(row)
cmd
[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:

.py
# 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
cmd
   |    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ą:

cmd
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į:

.py
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.

.py
# 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:

.py
# 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:

.py
# 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:

.py
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:

cmd
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

.py
# 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:

.py
# 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:

.py
# 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:

.py
# 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:

.py
# 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

cmd
-------------------------
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 while ciklą, 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 continue raktaž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:

  1. Pirmiausia su print() funkcija atspausdinti pradinį tekstą (pavadinimą, taisykles, žaidimo lentą);
  2. Sukurti kodą, kuris nuskaito tik vieno žaidėjo įvestį; Žaidimo lentos dar nereiktų atnaujinti;
  3. Dar netikrinant įvesties teisingumo, atnaujinti žaidimo lentelą pagal tik vieno žaidėjo įvestį;
  4. Šiame žingsnyje jūsų programa turėtų atspausdint reikalingą tekstą ir turėtų būti galimybė įvesti kooordinates ir taip atnaujinti žaidimo lentą;
  5. Toliau galima patikrinti įvestį ir padaryti taip, kad įvedus neteisingą, būtų prašoma iš naujo;
  6. Galima padaryti tikrininama, kad pasibaigus laisvai vietoje lentoje, žaidimas pabaigiamas;
  7. Pridedamas antras žaidėjas, kuriam galioja visos įvesties sąlygos, kaip ir pirmajam;
  8. 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

text
pixel_data.txt
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:

.py
brightness_increase.py
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.

Sukurta
su meile

Kontaktai

2024 — Vilius P.