Эффективность Python - Лучшая версия, чем несколько, если операторы elif - использовать преобразования for - цикл chr ord?

Я беру вступление к онлайн-курсу Python и вот описание проблемы.

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

Может кто-нибудь ответить более эффективным способом написания следующего?

letter = input()
x = ord(letter)
if x >= ord('A') and x == 65:
   print(1)
elif x >= ord('A') and x == 66:
   print(2)
elif x >= ord('A') and x == 67:
   print(3)
elif x >= ord('A') and x == 68:
   print(4)
elif x >= ord('A') and x == 69:
   print(5)
elif x >= ord('A') and x == 70:
   print(6)
elif x >= ord('A') and x == 71:
   print(7)
elif x >= ord('A') and x == 72:
   print(8)


else:
   print("invalid")

Я думал о какой-то петле для. Я запустил несколько версий циклов for, но не могу понять, как обращаться с итератором и соотносить его с возрастающим значением asci. Спасибо! Эта таблица может помочь

4 ответа

Решение

Вам не нужны петли, чтобы решить это. Во-первых, поймите, что вы повторяете первый тест в каждом elifИтак, давайте потянем это прямо к вершине:

if x < ord('A')

В настоящее время существует только ограниченный диапазон возможных значений для нашего x, На самом деле, действительные значения для x также включать x < ord('A') так что мы можем удалить этот тест:

if x < 65 or x > 72:
    print("invalid")

Хорошо, теперь у нас остались только действительные результаты. На самом деле есть очень простая формула для того, что вы печатаете: x - 64, Так что можете пойти в else часть:

else:
    print(x - 64)

Таким образом, все заканчивается тем, что

x = ord(letter)
if x < 65 or x > 72:
    print('invalid')
else:
    print(x - 64)

Обратите внимание, что заглавные буквы охватывают больше, чем это. Тем не менее, исправление должно быть довольно простым.

letter = input()
x = ord(letter)
if x>64:
    print x-64
else:
    print "invalid"

более компактный остроумный оператор

x = ord(input())
print (x-64 if x>64 else 'invalid')
ord(letter)-64 if 65<=ord(letter)<=90 else 'Invalid'

Не отдавая полного решения: вы можете [1] сначала проверить, x не заглавная буква (проверить string.uppercase), а затем [2] (теперь, когда вы знаете, x действительно заглавная буква), вернуть ord(x) - n где n порядок, в котором начинаются заглавные буквы (попробуйте ord('A') - 1).

Надеюсь, это поможет!

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