2013-09-09 3 views
2

Я принимаю интро к онлайн-курсу Python и вот описание проблемы.Python Efficiency - Лучшая версия, чем несколько операторов ifif, - используйте преобразования for loop - chr ord?

Напишите программу, которая выполняет обратное примеру выше: она должна принимать символ в качестве входного и выводить соответствующее число (от 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") 

Я думал о какой-то петле. Я начал несколько версий для циклов, но не могу понять, как обрабатывать итератор и соответствовать ему увеличению значения asci. Благодаря! This chr ord chart could help

ответ

4

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

if x < ord('A') 

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

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

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

else: 
    print(x - 64) 

Так что все это заканчивается существо:

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

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

+0

Вы могли бы упростить вам 'if' заявления там. – sberry

+0

@sberry Да, я понял, что сразу после того, как я разместил его. Исправлена. – Yuushi

+0

Спасибо Yuushi, наслаждайтесь очками! – StacyM

0

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

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

более
+0

вы можете написать код, который будет стоить меньше набрав :) –

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

компактный Wit turnary оператор

x = ord(input()) 
print (x-64 if x>64 else 'invalid')