1

Тема: Проблема

Доброго дня! Я не так давно почав вивчати мову програмування python, я вже дві-три години не розумію чому код так працює. Пояснюю - в мого коду три функції : Перша - чи високосний рік твого народження. Друга - Скільки ти живеш. Третя - Яка твоя вікова група. І проблема в тому - що коли ти вибираєш функції 1 або 2, тоді ще виводиться й третя. Ось код

import datetime
birth_day = int(input("День народження: "))
birth_month = int(input("Місяць народження: "))
birth_year = int(input("Рік народження: "))
day = int(datetime.date.today().day)
month = int(datetime.date.today().month)
year = int(datetime.date.today().year)
function = int(input("Яку функцію ви вибираєте? " ))

if function==1 :
 if (month >= birth_month):
   age = year - birth_year
 else:
   age = (year - birth_year) - 1

 if (function >= 0) and (function < 4) and (age >= 0) and (age < 130):
    if function == 1:
            if birth_year % 4 != 0:
                print("It is a common year (365 days)")
            else:
                print("It is a leap year (366 days)")

elif function == 2 :
 if (month >= birth_month):
   age = year - birth_year
 else:
   age = (year - birth_year) - 1
 a = age
 b = abs(month - birth_month)
 c = abs(day - birth_day)
 d = ((age * 8760) + ((month-1) * 720) + ((day-1) * 24))
 e = ((age * 525600) + ((month-1) * 43200) + ((day-1) * 1440))
 f = ((age * 31536000) + ((month-1) * 2592000) + ((day-1) * 86400))
 print(f"Your age: {a} years, {b} months, {c} days, or {d} hours, or {e} minutes, or {f} seconds")

elif function == 3 :
     if (month >= birth_month):
       age = year - birth_year
     else:
       age = (year - birth_year) - 1
if age < 1 :
                group = str("Your group is Baby")
                print(group)
elif age >= 1 and age < 3 :
                group = str("Your group is Toddler")
                print(group)
elif age >=3 and age < 5 :
            group = str("Your group is Preschool")
            print(group)
elif age >=5 and age < 12 :
                group = str("Your group is Gradeschooler")
                print(group)
elif age >=12 and age < 19 :
                group = str("Your group is Teenager ")
                print(group)
elif age >=19 and age < 65 :
                group = str("Your group is Adult")
                print(group)
else :
                group = str("Your group is Old")
                print(group)

2 Востаннє редагувалося koala (26.04.2020 18:54:35)

Re: Проблема

Ви дещо некоректно використовуєте термін "функція", тут краще підійшло б слово "варіант" (англ. option), але то є несуттєвим.
Суттєвим є те, що в Python підлеглі оператори розташовуються з відступом відносно керівної конструкції, а наступні - без такого відступу. Тобто

elif function == 3 : #керівна конструкція без відступу
     if (month >= birth_month): #підлеглий оператор - знову керівна конструкція
       age = year - birth_year #підлеглий оператор підлеглого оператора
     else: #...і т.д.
       age = (year - birth_year) - 1
if age < 1 :#а ось цей оператор розташований на тому ж рівні, що й elif вище - тобто є не підлеглим, а наступним

Бачите? Останній рядок з витягу буде виконано завжди після elif, незалежно від умови в ньому.
Дуже раджу уважніше стежити за відступами: одна конструкція - зсув на 4 пробіли (чи Tab, чи 2 пробіли, справа смаку, але завжди однакову кількість однакових символів). Так і код легше читати, і таких помилок не буде. У вас подекуди 1 пробіл, а подекуди 12, звісно, що ви не бачите, де воно стало нерівним.

Подякували: 0xDADA11C7, plusxx2

3

Re: Проблема

koala написав:

Ви дещо некоректно використовуєте термін "функція", тут краще підійшло б слово "варіант" (англ. option), але то є несуттєвим.
Суттєвим є те, що в Python підлеглі оператори розташовуються з відступом відносно керівної конструкції, а наступні - без такого відступу. Тобто

elif function == 3 : #керівна конструкція без відступу
     if (month >= birth_month): #підлеглий оператор - знову керівна конструкція
       age = year - birth_year #підлеглий оператор підлеглого оператора
     else: #...і т.д.
       age = (year - birth_year) - 1
if age < 1 :#а ось цей оператор розташований на тому ж рівні, що й elif вище - тобто є не підлеглим, а наступним

Бачите? Останній рядок з витягу буде виконано завжди після elif, незалежно від умови в ньому.
Дуже раджу уважніше стежити за відступами: одна конструкція - зсув на 4 пробіли (чи Tab, чи 2 пробіли, справа смаку, але завжди однакову кількість однакових символів). Так і код легше читати, і таких помилок не буде. У вас подекуди 1 пробіл, а подекуди 12, звісно, що ви не бачите, де воно стало нерівним.

Дякую що витратив на мене час, але я не дуже зрозумів в чому проблема. І якщо вже так, задам ще одне питання, яку літературу слід почитати?

4

Re: Проблема

У пробілах проблема. Всі рядки, починаючи з

if age < 1 :

слід посунути на кілька пробілів. А щоб це зробити правильно, краще переробити з початку. У більшості редакторів коду є функція автоматичного вирівнювання.
Будь-який підручник з Python підійде, тут питання не такого рівня, щоб це створювало проблему.