Działania na funkcjach i plikach

0

Witam. Przerabiam w książce funckje i pliki. Z podstawami nie mam problemu, ale jak funkcje są zagnieżdżone to trudno mi trochę to zrozumieć.

import sys
def open_file(file_name, mode):
    """Otwórz plk."""
    try:
        the_file = open(file_name, mode)
    except IOError as e:
        print("Nie można otworzyć pliku", file_name, "Program zostanie zakończony.\n", e)
        input("\n\nAby zakończyć program naciśnij enter.")
        sys.exit()
    else:
        return the_file
    
def next_line(the_file):
    """Zwróć kolejny wiersz pliku."""
    line = the_file.readline()
    line = line.replace("/", "\n")
    return line

def next_block(the_file):
    """Zwróć kolejny blok danych."""
    category = next_line(the_file)

    question = next_line(the_file)

    answers = []
    for i in range(4):
        answers.append(next_line(the_file))
        
    correct = next_line(the_file)
    if correct:
        correct = correct[0]

    explanation = next_line(the_file)

    return category, question, answers, correct, explanation

def welcome(title):
    """ Przywitaj gracza i pobierz jego nazwę."""
    print("\t\t Witaj w turnieju wiedzy!\n")
    print("\t\t", title, "\n")

def main():
    trivia_file = open_file("turniej_wiedzy.txt", "r")
    title = next_line(trivia_file)
    welcome(title)
    score = 0
    category, question, answers, correct, explanation = next_block(trivia_file)
    while category:
        print(category)
        print(question)
        for i in range(4):
            print("\t", i +1, "-", answers[i])
        answer = input("Jaka jest twoja odpowiedź?:")
        if answer == correct:
            print("\nOdpowiedź prawidłowa!", end = " ")
            score += 1
        else:
            print("\nOdpowiedź nieprawidłowa!", end = " ")
        print(explanation)
        print("Wynik:", score, "\n\n")
        category, question, answers, correct, explanation = next_block(trivia_file)
    trivia_file.close()
    print("To było ostatnie pytanie!")
    print("Twój końcowy wynik wynosi", score)

main()

input("\n\nAby zakończyć program naciśnij enter.")

Gubię się w funkcji def next_block. Mógłby mi ktoś wytłumaczyć krok po kroku na język polski ciało tej funkcji?

3
saqr napisał(a):

Witam. Przerabiam w książce funckje i pliki. Z podstawami nie mam problemu, ale jak funkcje są zagnieżdżone to trudno mi trochę to zrozumieć.
Gubię się w funkcji def next_block. Mógłby mi ktoś wytłumaczyć krok po kroku na język polski ciało tej funkcji?

Ale funkcja next_block nie ma funkcji nagnieżdzonych <zamyślnony />

Czyta ona po kolej z pliku kategorię, pytanie, cztery możliwe odpowiedzi, odpowiedź poprawną i wyjaśnienie, a potem to wszystko zwraca BTW trochę jestem zdzowiony bo to IMHO najprostsza funkcja w tym programie

0

Ale zobacz. Cały plik jest łańcuchem znaków. To skąd funkcja wie, które wiersze odpowiadają zdefiniowanej zmiennej?

Odcinek nie do odrzucenia
Plany na resztę życia
Za działalność mafijną skazano Cię na "kopę lat z hakiem" w więzieniu. /To oznacza, że za kratkami spędzisz:
co najmniej 15 lat
co najmniej 25 lat
co najmniej 50 lat
co najmniej 60 lat
4
Kopa to sześćdziesiąt sztuk.
Ojciec Chrzestny chce Cię bliżej poznać
Powiedzmy, że masz audiencję u Ojca Chrzestnego soulu. Jak wypadałoby się /do niego zwrócić?
Mr. Richard
Mr. Domino
Mr. Brown
Mr. Checker
3
James Brown jest nazywany "ojcem chrzestnym" soulu.
Będzie Cię to kosztować
Jaki biznes najprawdopodobniej ubezpieczasz, jeśli płacisz mafii haracz /w rupiach?
swoją plantację tulipanów w Holandii
swoją fabrykę curry w Indiach
swoją gorzelnię wódki w Rosji
swoją hurtownię scyzoryków w Szwajcarii
2
Rupia to oficjalna jednostka monetarna w Indiach.
Niech wszytko pozostanie w rodzinie
W jaki sposób jesteś spokrewniony z mafią, jeśli syn siostry ojca Twojej matki /był członkiem "Rodziny"?
przez Twojego kuzyna pierwszego stopnia raz przesuniętego
przez Twojego kuzyna pierwszego stopnia dwa razy przesuniętego
przez Twojego kuzyna drugiego stopnia raz przesuniętego
przez Twojego kuzyna drugiego stopnia dwa razy przesuniętego
1
Siostra ojca Twojej matki jest jej ciotką, a jej syn /jest kuzynem pierwszego stopnia Twojej matki. Ponieważ Ciebie i Twoją matkę /dzieli dokładnie jedno pokolenie, jej kuzyn pierwszego stopnia jest Twoim /kuzynem pierwszego stopnia raz przesuniętym.
W służbie mafii
Jakiej wody powinieneś użyć, gdybyś miał wyprać mafijne pieniądze, /ale nie chciałbyś sprać z nich zieleni?
gorącej
ciepłej
letniej
zimnej  
4
Zgodnie z etykietą na mojej butelce z płynem do prania, /do kolorów, które mogłyby ulec spraniu, najlepsza jest zimna woda.

To jest plik tekstowy jego zawartość w całości.

2
saqr napisał(a):

To skąd funkcja wie, które wiersze odpowiadają zdefiniowanej zmiennej?

Można by sprawdzić w dokumentacji, ale na moje oko metoda readline() czyta tylko do najbliższego znaku końca linii

Update - Python File readline() Method:

The readline() method returns one line from the file.

0

readline(rozmiar) Odczytuje z bieżącego wiersza pliku wskazaną przez argument
rozmiar liczbę znaków i zwraca je w postaci łańcucha. Jeśli rozmiar
nie jest określony, metoda zwraca wszystkie znaki od pozycji
bieżącej do końca wiersza.

Taka definicja w książce była. Czyli zwraca jeden wiersz z pliku tekstowego. To skąd ten program wie co jest pytaniem co wyjaśnieniem itp?

2
saqr napisał(a):

To skąd ten program wie co jest pytaniem co wyjaśnieniem itp?

Nie wie oczywiście, jak pomieszasz kolejność to wyświetli wszystko źle. Ale zauważ że next_block czyta zawsze 8 linii. Więc pytania są w liniach (licząc od 1), 1, 9, 17, itd

0

To jak ja mam zrozumieć kod tego programu. Głowa mi paruje od tego. Nie mogę tego pojąć.

2

Może użyj debugera i śledź zmiany krok po kroku? Albo dodaj w losowych miejscach print ("dupa") żeby wiedzieć w któej jesteś cześci?
A tak w zasadzie to w czym masz problem jeszcze?

0

To co ty mi napisałeś to sam wiedziałem. Mnie interesuje w jaki sposób funkcja to robi. Ale spoko. Dzięki za chęci.

1

Mnie interesuje w jaki sposób funkcja to robi

która?

  • next_block? wywołując 8 razy readline
  • readline? Sprawdź kod źródłowy biblioteki standardowej pythona. Chociaż bewnie nie chcesz tego wiedzieć bo ta metoda Pewnie pod spodem wywołuje jakiś kod w C
0

Podstawy metod działania na plikach znam z książki. Tylko ten program to dla mnie czarna magia. Idę spać. Mam dość na dzisiaj.

2

Tu nie ma żadnej czarnej magii. Jeden blok czyli wszystkie informacje dotyczące jednego pytania to 8 linii tekstu:
1: kategoria
2: pytanie
3-6: odpowiedzi
7: nr poprawnej odpowiedzi
8: wyjaśnienie

next_block odczytuje zawsze 8 linii i umieszcza je do odpowiednich zmiennych.

0

Chyba za głupi jestem na programowanie.

1

Nie tam, jeśli chcesz się nauczyć to nauka programowania to kwestia czasu i ćwiczeń. Jeśli coś jeszcze nie jest dla Ciebie jasne to pisz.

0

Uczysz się od niedawna i przypuszczam, że nie masz jeszcze podstawowych, mentalnych reprezentacji, tego co się dzieje under the hood.

Przeklikaj interaktywnie razem z Python Tutor.

VS Code's debugger też pozwala na interaktywną inspekcję zmiennych, lepsze niż pdb.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.