2010-11-02 3 views
3

Возможно ли, чтобы пользовательский ввод равнялся переменной для задач, связанных с химическими элементами.Входные переменные в Python 3

Например, углерод имеет молекулярную массу 12, но я не хочу использовать вход 12, они должны вводить «C». но по мере того, как вход превращает это в строку, это невозможно сравнить с переменной C = 12.

Есть ли способ ввода переменной istead строки?

Если нет, могу ли я установить строку как переменную.

пример:

C = 12 

element = input('element symbol:') 
multiplier = input('how many?') 

print(element*multiplier) 

Это просто возвращает ошибку о том, что вы не можете умножить строку.

+0

, что вы ожидаете ответа? – SilentGhost

+5

(не по теме) молекулярная масса углерода составляет 12,0107 г/моль, а не 12. – kennytm

ответ

8

Вы можете изменить свой код так:

>>> masses = {'C': 12} 
>>> element = input('element symbol:') 
element symbol:C 
>>> masses[element] 
12 
>>> multiplier = input('how many?') 
how many?5 
>>> multiplier 
'5'           # string 
>>> masses[element] * int(multiplier) 
60 
3

input in Python 3.x эквивалентен raw_input в Python 2.x, то есть возвращает строку.

Оценить это выражение как Python 2.x's input, use eval, как показано в doc for changes from 2.x to 3.0.

element = eval(input("element symbol: ")) 
.... 

Однако eval позволяет выполнять любой код Python, так что это может быть очень опасно (и медленно). В большинстве случаев вам не нужна сила eval, включая это. Поскольку вы просто получаете глобальный символ, вы можете использовать the globals() dictionary, а для преобразования строки в целое число используйте the int function.

element = globals()[input("element symbol: ")] 
multiplier = int(input("how many? ")) 

но когда нужен словарь, так или иначе, почему бы не реструктурировать программу и не хранить все в словаре?

ELEMENTS = {'C': 12.0107, 'H': 1.00794, 'He': 4.002602, ...} 

try: 
    element_symbol = input("element symbol: ") 
    element_mass = ELEMENTS[element_symbol] 

    multiplier_string = input("how many? ") 
    multiplier = int(multiplier_string) 

    print(element_mass * multiplier) 

# optional error handling 
except KeyError: 
    print("Unrecognized element: ", element_symbol) 
except ValueError: 
    print("Not a number: ", multiplier_string) 
+0

'eval'? как хорошо ваш ответ читается, пока вы не нажмете 'eval'! – SilentGhost

+0

Не используйте 'eval()', 'globals()' здесь. Используйте 'if element_symbol не в MASSES: ...'. – jfs

+0

@JF: Я соглашаюсь на 'eval' и' globals', поэтому окончательный ответ их не имеет, но я не согласен с 'if element_symbol не в MASSES:' над обработкой исключений. «Легче просить прощения, чем разрешения». – kennytm

0

элемент = Eval (вход ("элемент символа:"))

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

вы можете предпочесть иметь объект словаря

1

Поскольку вход всегда возвращает тип строки. Умножение на строку не допускается. Итак, после принятия input, вам нужно ввести листинг, используя int тип в python.

Попробуйте это:

multiply_string = input("how many? ") 
multiplier = int(multiplier_string) #type cast here as int 
Смежные вопросы