2013-08-25 4 views
-1

Я написал программу в Ruby, которая принимает вес пользователя/высоту в качестве входных данных. Я застрял, превратив его в Python. Вот мой рубин код, который работает отлично:Перевод If/Else && RegEx - Ruby to Python

print "How tall are you?" 
height = gets.chomp() 
if height.include? "centimeters" 
    #truncates everything but numbers and changes the user's input to an integer 
    height = height.gsub(/[^0-9]/,"").to_i/2.54 
else 
    height = height 
end 

print "How much do you weigh?" 
weight = gets.chomp() 
if weight.include? "kilograms" 
    weight = weight.gsub(/[^0-9]/,"").to_i * 2.2 
else 
    weight = weight 
end 

puts "So, you're #{height} inches tall and #{weight} pounds heavy." 

Кто-нибудь есть какие-либо советы или указания о том, что я могу перевести это? Вот мой код Python:

print "How tall are you?", 
height = raw_input() 
if height.find("centimeters" or "cm") 
    height = int(height)/2.54 
else 
    height = height 

print "How much do you weight?", 
weight = raw_input() 
if weight.find("kilograms" or "kg") 
    weight = int(height) * 2.2 
else 
    weight = weight 

print "So, you're %r inches tall and %r pounds heavy." %(height, weight) 

Это не работает. Здесь ошибка я получаю:

MacBook-Air:Python bdeely$ python ex11.py 
How old are you? 23 
How tall are you? 190cm 
Traceback (most recent call last): 
    File "ex11.py", line 10, in <module> 
    height = int(height)/2.54 
ValueError: invalid literal for int() with base 10: '190cm' 
+2

'если height.find ("см" или "см")' - это как 'if height.include? ("сантиметры" || "см") '. Python хорош, но это не волшебство; попробуйте '' сантиметры "в высоту или" см "в высоту'. То же самое для килограммов. Затем вы можете использовать одно и то же регулярное выражение - посмотрите на модуль re. – Ryan

+2

Я не уверен, что в Ruby есть 'height = height' и' weight = weight', но здесь, в Python, вы также можете оставить их – scohe001

+0

Число заполнителей форматирования также не совпадает с '(возраст, рост, вес) 'вы проходите.В любом случае, добавление ошибки, которую вы пытаетесь исправить на этот раз, было бы очень полезно ... – Ryan

ответ

1

У вас есть другие проблемы, но первая проблема, которую вы будете сталкиваться в том, что if и else заявления требуют двоеточия в конце строки, чтобы ввести блок.

1

Эта линия не будет делать то, что вы думаете, что делает:

if height.find("centimeters" or "cm") 

Помимо отсутствующего : (предположительно, это опечатка), код не будет работать по двум причинам:

  • str.find() возвращает -1, если ничего не найдено, 0, если искомая строка найдена в начале. 0 считается False в булевом контексте, и вместо этого вы должны проверить на > -1.

  • Вы не тестируете ни 'centimeters' or 'cm'. Вы тестируете только 'centimeters'. Сначала вычисляется выражение or и короткое замыкание, чтобы вернуть первое значение True -ish, первую непустую строку, поэтому в этом случае 'centimeters'.

Вы должны вместо тест на наличие строк с помощью in:

if 'centimeters' in height or 'cm' in height: 

Демо:

>>> height = '184cm' 
>>> height.find("centimeters" or "cm") 
-1 
>>> 'centimeters' in height or 'cm' in height 
True 
>>> height = '184 centimeters' 
>>> height.find("centimeters" or "cm") 
4 
>>> 'centimeters' in height or 'cm' in height 
True 
>>> height = 'Only fools and horses' 
>>> height.find("centimeters" or "cm") 
-1 
>>> 'centimeters' in height or 'cm' in height 
False 

Ваша следующая проблема состоит в том, что int() не доброжелательно к дополнительным текст в тексте ввода. Вы уже определили, что присутствует 'centimeter', и именно это вызывает исключение.

Вы можете использовать регулярное выражение, как код Ruby:

import re 

height = int(re.search('(\d+)', height).group(1))/2.54 

Демо:

>>> import re 
>>> height = '184cm' 
>>> int(re.search('(\d+)', height).group(1))/2.54 
72.44094488188976 
>>> height = '184 centimeters' 
>>> int(re.search('(\d+)', height).group(1))/2.54 
72.44094488188976