Функция Python повторяется после выполнения оператора if

Я начинающий пользователь Python, и я застрял в программе-калькуляторе времени, которую пытаюсь создать в рамках онлайн-сертификации. Программа рассчитает в формате AM/PM время, которое будет добавлено к начальному времени и правильному дню недели. У меня были проблемы с этой частью, так как по неизвестным мне причинам функции перезапускаются после того, как нашли новый день недели, присваивая целое число «2» из переменной дня недели, а затем ломая.

Вот фрагмент кода:

day_names = [
    "monday",
    "tuesday",
    "wednesday",
    "thursday",
    "friday",
    "saturday",
    "sunday",
]

def weekday_calculator( weekday, day_count, new_hour, new_minute,):  # this function calculates the right weekday for the new time

> print(f"starting weekday:{weekday}")
> weekday = weekday.lower()
> starting_day_index = day_names.index(weekday)
> print(f"This is the starting day of the week's index: {starting_day_index}")
> print(f"This is the day count {day_count}")

> weekday_calculate = starting_day_index + day_count

> if weekday_calculate <= 6:
    >> new_weekday = day_names[weekday_calculate]  # to be fixed
    >> print(f"This is the new weekday {new_weekday}")
    >> result_printer(new_hour, new_minute, new_am_pm, day_count, new_weekday)

> elif weekday_calculate > 6:
    >> print("let's adjust the weekday")
    >> adjust_weekday(define_weekday)

weekday_calculator(weekday = "tuesday", daycount = 1) #this is only the data relevant to this snippet

Это ожидаемый результат:

Let's calculate the weekday
starting weekday:tuesday
This is the starting day of the week's index: 1
This is the day count 1
This is the new weekday Wednesday
(proceeds to the next function)

Это то, что происходит

Let's calculate the weekday
starting weekday:tuesday
This is the starting day of the week's index: 1
This is the day count 1
This is the new weekday wednesday
tuesday
starting weekday:2
Traceback (most recent call last) line 52, in weekday_calculator
    weekday = weekday.lower()
AttributeError: 'int' object has no attribute 'lower' # of course that is because you cannot change an integer to lower

Кто-нибудь знает, как решить эту проблему? Я понятия не имею, откуда берется значение «2» для дня недели, а также почему функция повторяется, а не сразу переходит к следующему один раз в конце оператора if. Я пытался изменить структуру функции и имена переменных, чтобы программа не путалась между днем ​​недели и новым днем ​​недели, но безрезультатно.

Как вы правильно просили, я отредактировал сообщение и добавил остальную часть кода:

day_names = [
    "monday",
    "tuesday",
    "wednesday",
    "thursday",
    "friday",
    "saturday",
    "sunday",
]
timeday_am = ["PM", "AM"] * 100
timeday_pm = ["AM", "PM"] * 100

weekday = 0


def result_printer(new_hour, new_minute, new_am_pm, day_count, weekday):
    new_time = [new_hour, new_minute]
    for number in new_time:
        if number < 10:
            return f"0{number}"

    if day_count != 0:
        if day_count == 1:
            day = "(next day)"

        else:
            day = f"({day_count} days later)"

    print(f"{new_time[0]}:{new_time[1]} {new_am_pm}, {weekday} {day}")


def adjust_weekday(
    define_weekday,
):  # this is to adjust the weekday index if it is more than 6
    adjusted_weekday = day_names[define_weekday % len(day_names)]
    print((adjusted_weekday))


def weekday_calculator(
    weekday, day_count, new_hour, new_minute, new_am_pm
):  # this function calculates the right weekday for the new time

    print(f"starting weekday:{weekday}")
    weekday = weekday.lower()
    starting_day_index = day_names.index(weekday)
    print(f"This is the starting day of the week's index: {starting_day_index}")
    print(f"This is the day count {day_count}")

    weekday_calculate = starting_day_index + day_count

    if weekday_calculate <= 6:
        new_weekday = day_names[weekday_calculate]  # to be fixed
        print(f"This is the new weekday {new_weekday}")
        result_printer(new_hour, new_minute, new_am_pm, day_count, new_weekday)

    elif weekday_calculate > 6:
        print("let's adjust the weekday")
        adjust_weekday(define_weekday)


def day_calculator(
    new_hour, new_minute, new_am_pm, am_pm, weekday, day_count
):  # this function calculates the right AM PM of the new hour, and the number of days between times (if applicable)

    day_count = day_count

    if new_am_pm == "AM":
        new_am_pm = timeday_am[am_pm]
        print(f"This is the new time of the day list {new_am_pm}")

        day_new = timeday_am[:am_pm]
        print(f"this is the new day {day_new}")

        day_count = day_new.count(
            "AM"
        )  # this is to count how many days have passed from the starting day
        print(f"this is the day count {day_count}")

    elif new_am_pm == "PM":
        new_am_pm_day = timeday_pm[am_pm]
        print(f"This is the new time of the day {new_am_pm}")

        day_new = timeday_pm[:am_pm]
        print(f"this is how it is calculated {day_new}")

        day_count = day_new.count("AM")
        print(f"this is the day count {day_count}")

    if weekday is not None:
        print(weekday)
        print("Let's calculate the weekday")
        weekday_calculator(weekday, day_count, new_hour, new_minute, new_am_pm)

    result_printer(new_hour, new_minute, new_am_pm, day_count, weekday)


def time_calculator(init_time: str, add_time: str, weekday: str):

    day_count = 0

    new_am_pm = init_time.split(" ")[1]

    init_hour = int(init_time.split(":")[0])
    init_minute = init_time.split(":")[1]
    init_minute = int(
        init_minute.split(" ")[0]
    )  # this is to avoid to include AM/PM in the string #this results in problem when python cannot convert string to integer because of formatting ex 00:

    add_hour = int(add_time.split(":")[0])
    add_minute = int(add_time.split(":")[1])

    print(
        f"1. This is the hour to be added: {init_hour} and this is the  minute: {init_minute}"
    )  # @ control string

    new_minute = init_minute + add_minute
    new_hour = init_hour + add_hour

    if new_minute >= 60:
        new_minute -= 60
        new_hour = new_hour + 1

    # calculate am or pm
    am_pm = (
        new_hour // 12
    )  # this starts the process to calculate the right time of the day and day of the week, floor division rounds the number down
    print(f"This is {am_pm} am pm coefficent")  # @control string
    print(type(am_pm))

    # adapt new hour to hour format 0-12

    if new_hour > 12:
        new_hour = new_hour - (am_pm * 12)

    print(
        f"This is the new hour: {new_hour} and this is the new minute: {new_minute}"
    )  # @ control string

    if am_pm < 1:
        new_am_pm = new_am_pm
    else:
        day_calculator(new_hour, new_minute, new_am_pm, am_pm, weekday, day_count)

    if weekday is not None:
        weekday_calculator(new_hour, new_minute, new_am_pm, weekday, day_count)

    result_printer(new_hour, new_minute, new_am_pm, day_count, weekday)


time_calculator("3:10 PM", "23:20", "tuesday")

Пожалуйста, опубликуйте действительный код Python.

chepner 21.11.2022 14:07

Что делают result_printer и adjust_weekday? Код Пожалуйста!

user99999 21.11.2022 14:08

кажется, проблема в result_printer, потому что часть, которую вы разместили, должна работать как положено

Jeanot Zubler 21.11.2022 14:09
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Анализ продукта магазина на Tokopedia
Анализ продукта магазина на Tokopedia
Tokopedia - это место, где продавцы могут продавать свои товары. Товар должен быть размещен на витрине, чтобы покупателям было легче найти товар...
0
3
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Когда я запустил ваш код, удалив вызовы result_printer и Adjust_weekday, поскольку у меня их нет в отправленном вами коде, мой вывод

starting weekday:tuesday
This is the starting day of the week's index: 1
This is the day count 1
This is the new weekday wednesday

Я считаю, что проблема возникает из-за других функций result_printer и Adjust_weekday, которые возвращают индекс вместо значения str.

Может быть, отправьте этот код двух функций, чтобы помочь нам найти проблему

Обновлено: так вот ваша проблема: в time_calculator() вы вызываете weekday_calculator(new_hour, new_minute, new_am_pm, weekday, day_count) но weekday_calculator определен с параметром weekday, day_count, new_hour, new_minute, new_am_pm, вы не можете использовать параметры, поэтому в другом порядке вы должны указать имена параметров как

weekday_calculator(new_hour=new_hour, new_minute=new_minute, new_am_pm=new_am_pm, weekday=weekday, day_count=day_count)

или используйте параметры в том же порядке, что и определенный:weekday_calculator(weekday, day_count, new_hour, new_minute, new_am_pm)

ваша проблема здесь: starting weekday:2 должен быть строкой, а не целым числом.

Ответ принят как подходящий

Проблема в вашей функции time_calculator. В последних нескольких строках вы сначала вызываете day_calculator(new_hour, new_minute, new_am_pm, am_pm, weekday, day_count), который, в свою очередь, вызывает weekday_calculator (это нормально). Однако в следующих двух строках вы также вызываете weekday_calculator с совершенно неправильными аргументами.

Ваша функция определяет аргументы как weekday, day_count, new_hour, new_minute, new_am_pm.

Но глядя на вызов функции, вы проходите new_hour, new_minute, new_am_pm, weekday, day_count.

Спасибо за Ваш ответ. Я изменил это по вашему совету, к сожалению, это все еще не работает, первая успешная итерация исчезла (вероятно, потому, что я удалил вызов функции, как вы предложили) и в начале функции weekday_calculator для week_day присваивается целочисленное значение , даже если я дважды проверил правильность назначения всех переменных. Более того, в функции day_calculator переменная дня недели, отображаемая после печати, по-прежнему корректна.

Jess 22.11.2022 12:52

Возможно, попробуйте использовать отладчик с точками останова, чтобы вам было легче увидеть, где возникают определенные ошибки. На самом деле пройдитесь по коду строка за строкой, и вы, вероятно, довольно быстро увидите, в чем заключается реальная проблема.

Jeanot Zubler 22.11.2022 16:56

Большое спасибо! Я еще раз перепроверил код и понял, что не так, теперь эта часть наконец-то работает!

Jess 23.11.2022 10:12

Другие вопросы по теме