Lekcja Pythona #1.1 – Quiz

Naszą aplikację z poprzedniej lekcji możemy poprawić, jeżeli chodzi o styl aplikacji

Stałe

Stałe wartości, które się nie zmieniają w Pythonie zapisuje się zazwyczaj w zmiennych które są ZAPISANE_DUŻYMI_LITERAMI.

Inne języki programowania posiadają specjalne oznaczenie dla stałych wartości dodając słowo const do zmiennej. Python czegoś takiego nie posiada, więc trzeba uważać, aby stałych takich jak liczba PI przez przypadek nie zmienić.

Stałymi w naszym Quizie są odpowiedzi na nasze pytania, czyli

  • miejsce zamieszkania
  • rok urodzenia
  • oraz odpowiedzieć na nasze pytanie tak lub nie.

Te stałe możemy nazwać w taki sposób

BIRTH_YEAR = 1991
LIVING_LOCATION = "Szczecin"
LIKING_HALF_LIFE_GAMES = True

Stałe zazwyczaj umieszcza się na górze programu.

Więcej funkcji

Nasz program można podzielić na jeszcze parę osobnych funkcji.

Można stworzyć funkcję z kodu odpowiedzialnego za sprawdzanie czy odpowiedź w pytaniu tak lub nie jest tak lub nie.

def is_answer_true(answer):
    return answer in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'tak']

Dzięki czemu w następnych pytaniach, które korzystają z podsobnej formuły, będą sprawdzane z takimi samymi słowami.

Każde pytanie funkcją

Równie dobrze możemy przekształcić każde z pytań w osobną funkcję.

def age_question():
    answer = ask_question('How old am I?')
    if answer.isdigit():
        years = int(answer)
        now = datetime.datetime.now()
        if (now.year - years) == BIRTH_YEAR:
            return True
        else:
            return False
    return False


def location_question():
    answer = ask_question('Where I live?')
    if answer == LIVING_LOCATION:
        return True
    else:
        return False


def star_wars_question():
    answer = ask_question('Do Pawel like Half-Life video games?')
    if is_answer_true(answer) == LIKING_HALF_LIFE_GAMES:
        return True
    else:
        return False

Taka funkcja zadaje pytania i zwraca wartość prawdę lub fałsz w zależności czy pytanie zakończyło się pomyślnie dla gracza w quiz czy nie.

Jak zatem będziemy zbierali wyniki z każdego pytania?

Już pędzę z odpowiedzią w taki sposób:

def main():
    answers = []
    answers.append(age_question())
    answers.append(location_question())
    answers.append(half_life_question())
    all_questions = len(answers)
    good_answers = sum(answers)
    percentage = (good_answers/all_questions) * 100
    print("you got " + str(percentage) + "% of good answers!")

main()
  1. Tworzymy funckję main – zwyczajowo używa się tej nazwy dla funkcji które rozpoczynają programy
  2. Tworzymy pustą tablicę na odpowiedzi, które zamierzamy zebrać od użytkownika
  3. Dokładamy wynik funkcji zadającej pytanie do tablicy.
  4. Oznacza to że każda funkcja się wykona a jej wynik zostanie
  5. przechowany w tablicy, dzięki czemu możemy wykonać parę operacji na tej tablicy
  6. funkcja len(answers) podaje nam długość tablicy, dla nas to także informacja ile pytań zostało zadanych w naszym quizie
  7. funkcja sum(answers) przekształci wartości True na 1, a False na 0, a następnie zsumuje wszystkie liczby razem. W taki sposób da to nam liczbę poprawnych odpowiedzi.
  8. potem mamy liczenie procentów
  9. Ich wyświetlanie
  10. Linia przerwy dla czytelności
  11. Wywołanie funkcji.

Cały kod

import datetime


BIRTH_YEAR = 1991
LIVING_LOCATION = "Szczecin"
LIKING_HALF_LIFE_GAMES = True


def ask_question(question_phrase):
    output = input(question_phrase + "\nAnswer> ")
    return output


def is_answer_true(answer):
    return answer in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'tak']


def age_question():
    answer = ask_question('How old am I?')
    if answer.isdigit():
        years = int(answer)
        now = datetime.datetime.now()
        if (now.year - years) == BIRTH_YEAR:
            return True
        else:
            return False
    return False


def location_question():
    answer = ask_question('Where I live?')
    if answer == LIVING_LOCATION:
        return True
    else:
        return False


def half_life_question():
    answer = ask_question('Do Pawel like Half-Life video games?')
    if is_answer_true(answer) == LIKING_HALF_LIFE_GAMES:
        return True
    else:
        return False


def main():
    answers = []
    answers.append(age_question())
    answers.append(location_question())
    answers.append(half_life_question())
    all_questions = len(answers)
    good_answers = sum(answers)
    percentage = (good_answers/all_questions) * 100
    print("you got " + str(percentage) + "% of good answers!")


main()

Zadanie domowe

  • Z obliczania procentów poprawnych odpowiedzi stwórz osobną funkcję do której przekazujesz good_answers oraz all_questions