Есть ли способ оторваться от функции range () при заданном значении c? - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в программировании на python и пытаюсь создать календарь, который начинает месяц в зависимости от выбранного дня начала. Однако я не знаю, как остановить печать после превышения количества дней (например, перерывы в днях = 31, когда месяц == "январь"). Печатные значения должны быть дополнительно выровнены по правому краю. Вот как я впервые подошел к нему:

month=input("Enter the month: ")

if month=="January" or month=="March" or month=="May" or month=="July" or month=="August" or month=="October" or month=="December":
    days=31
else:
    days=30
if month=="February":
    days=28
Start_day=input("Enter the start day: ")
print(month)
print("Mo","Tu","We","Th","Fr","Sa","Su")
if Start_day == "Monday":
    i=1
if Start_day == "Tuesday":
    i=0
if Start_day == "Wednesday":
    i=-1
if Start_day == "Thursday":
    i=-2
if Start_day == "Friday" :
    i=-3
if Start_day == "Saturday":
    i=-4
if Start_day == "Sunday":
    i=-5

j=1
for j in range(i,days,7):
    print(str(j).rjust(2," "),str(j+1).rjust(2," "),str(j+2).rjust(2," "),str(j+3).rjust(2," "),str(j+4).rjust(2," "),str(j+5).rjust(2," "),str(j+6).rjust(2," "))

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Вместо этого вы можете закодировать его как

j=1
for j in range(i,days,7):
  for i in range(0,7):
    if j+i>days: break
    print(str(j+i).rjust(2," "),end=' ')
  print('')

Это будет называться «вырывом из всех oop», а не «вырывом из функции диапазона». Нет способа «выйти из функции диапазона».

0 голосов
/ 26 марта 2020

Могу ли я посоветовать немного перестроить это, чтобы сделать его более эффективным? Вы можете использовать dicts и определить пользовательскую функцию для обработки форматирования даты, чтобы предотвратить некоторое повторение.

Чтобы ответить на ваш вопрос, вы можете оценить номер даты во время финала l oop:

for j in range(i,days,7):
    # add to j value via range() and adjust()
    # (defined above) to prevent repetition
    for k in range(7):
        if j + k > 0 and j + k <= days:
            print(adjust(j + k), end = ' ') # don't print new line
        else:
            # print spaces if the number is <1 or >days
            print('   ', end = '')
    # print new line for a new week
    print('\n', end = '')

Полный пример:

# function to format dates later
def adjust(val):
    return str(val).rjust(2," ")

# get inputs
month=input("Enter the month: ")
start_day=input("Enter the start day: ")

# map months to days in a dict
month_to_days={"january":31,
               "march":31,
               "may":31,
               "july":31,
               "august":31,
               "october":31,
               "december":31,
               "february":28,
               "april":30,
               "june":30,
               "september":30,
               "october":30
               }
# map weekdays to int
days_to_int={"monday":1,
             "tuesday":0,
             "wednesday":-1,
             "thursday":-2,
             "friday":-3,
             "saturday":-4,
             "sunday":-5
             }

# get the day amount based on the entry, ignoring case
days=month_to_days[month.lower()]
# get the int based on the entry, ignoring case
i=days_to_int[start_day.lower()]

# print month and day headers
print(month)
print("Mo","Tu","We","Th","Fr","Sa","Su")

for j in range(i,days,7):
    # add to j value via range() and adjust()
    # (defined above) to prevent repetition
    for k in range(7):
        if j + k > 0 and j + k <= days:
            print(adjust(j + k), end = ' ') # don't print new line
        else:
            # print spaces if the number is <1 or >days
            print('   ', end = '')
    # print new line for a new week
    print('\n', end = '')

Вывод:

Enter the month: january
Enter the start day: monday
january
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7 
 8  9 10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 31             
>>> 
Enter the month: june
Enter the start day: wednesday
june
Mo Tu We Th Fr Sa Su
       1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 
20 21 22 23 24 25 26 
27 28 29 30       
0 голосов
/ 26 марта 2020

Прежде чем печатать после for for l oop, просто наберите if оператор , чтобы проверить ваше состояние, и перед печатью добавьте оператор break. Что-то вроде:

if statement:
   break
...