Я начинающий пользователь 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")
Что делают result_printer
и adjust_weekday
? Код Пожалуйста!
кажется, проблема в result_printer
, потому что часть, которую вы разместили, должна работать как положено
Когда я запустил ваш код, удалив вызовы 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 переменная дня недели, отображаемая после печати, по-прежнему корректна.
Возможно, попробуйте использовать отладчик с точками останова, чтобы вам было легче увидеть, где возникают определенные ошибки. На самом деле пройдитесь по коду строка за строкой, и вы, вероятно, довольно быстро увидите, в чем заключается реальная проблема.
Большое спасибо! Я еще раз перепроверил код и понял, что не так, теперь эта часть наконец-то работает!
Пожалуйста, опубликуйте действительный код Python.