2015-01-24 4 views
-1

Полный новичок здесь, играя с Codeacademy. Мне просто интересно. Если бы я хотел настроить эту функцию, чтобы позволить пользователю вводить вместо «d», как бы я это сделал?Получить пользовательский ввод вместо аргумента функции

def distance_from_zero(d): 
    if type(d) == int or type(d) == float: 
     print abs(d) 
     return abs(d) 


    else: 
     print "please enter a number" 
     return "please enter a number" 
+2

Обратите внимание, что (если вы вообще настаиваете на проверке типа), это должно быть 'if isinstance (d, (int , float)) ', а в 2.x есть также' long'. – jonrsharpe

+1

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

+0

@JoelCornett, современный подход ** goose typing ** еще лучше - 'isinstance (d, numbers.Real)' в этом случае (так как я - возможно, незаслуженно - зачислен на wikipedia по термину/концепции «Утка набрав», я думаю, я получаю слово :-) - или 'numbers.Number', если« complex »также является приемлемым. –

ответ

0

Использование попробовать/за исключением и сделать d=raw_input:

def distance_from_zero(d=raw_input): 
     try: 
      d = abs(float(d("Enter a number"))) # if it can be a float it can an int 
      return d 
     except ValueError: 
      return "please enter a number" 


In [10]: distance_from_zero() 
-444 
Out[10]: 444.0 

In [11]: distance_from_zero() 
foo 
Out[11]: 'please enter a number' 

Это делает работу, если вы хотите d быть введен от пользователя, который, кажется, ваш вопрос, хочу, но я бы не рекомендовал использовать его, Я хотел бы использовать следующие взять вход:

def distance_from_zero(): 
    while True: 
     try: 
      d = abs(float(raw_input("Enter a number"))) 
      return d 
     except ValueError: 
      print "please enter a number" 

для обработки, возможно, принимая число в качестве входных данных или не установлен d = None и либо попытаться бросить что-нибудь прошел в пользователем или принимать входные данные от пользователя, если не аргумент не подается:

def distance_from_zero(d=None): 
    try: 
     d = abs(float(raw_input("Enter a number"))) if d is None else abs(float(d)) 
     return d 
    except ValueError: 
     return "please enter a number" 
+4

Это кажется странным способом сделать это, 'raw_input' будет вызываться во время определения. – jonrsharpe

+0

'def distance_from_zero (d = raw_input()):' не работает так, как можно было бы подумать ... – glglgl

+0

** ОЧЕНЬ ** сомнительный код: это безоговорочно вызывает 'raw_input' в' def' time, один раз и только один раз , Чрезвычайно удивительное поведение! –

0

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

import numbers 
def distance_from_zero(d=None): 
    while not isinstance(d, numbers.Real): 
     try: d = float(raw_input('please enter a number')) 
     except ValueError: print('{!r} is not a number'.format(d)) 
    print(abs(d)) 
    return abs(d) 

[Добавлено: значение по умолчанию, не номер для d только в случае, если вы хотите, чтобы иметь возможность вызвать функцию без аргументов силы пользовательского ввода , а не только позволяют это, как вы сформулировали Q; ниже).

(Если Python 3, используйте input вместо raw_input).

Это использование «гусиной печати» - проверяет абстрактный базовый класс numbers.Real, охватывая все числа, кроме сложных (если вам тоже нравятся сложные номера, используйте вместо этого numbers.Number). Он набирает ноль или больше раз, пока, наконец, d не является допустимым числом (если вам тоже нравятся сложные номера, используйте complex вместо float), затем выполняет работу.

(Эта проверка против абстрактного базового класса [aka ABC], известного как «гусиная типизация», часто, хотя и не всегда предпочтительнее более общего подхода «утиная печать», я также выступаю - грубо говоря, гусь лучше чем утка, когда ABC уже существует, что идеально подходит для ваших потребностей, но не иначе).

Это может быть не самая лучшая архитектура, так как она объединяет две проблемы: обеспечение того, чтобы d было числом, а затем что-то с ним (в этом случае печатаем и возвращаем его абсолютное значение). Особенно в крупномасштабном программировании «разделение проблем» - отличная идея - использовать отдельные блоки (функции, классы, модули и т. Д.) Для решения отдельных проблем, объединить их на уровне «оркестровки», используемый.

Это может быть преждевременным беспокойством за уровень мастерства в программировании, но на самом деле это не так сложно, как слияние проблем. То есть, вы можете иметь def ensure_number(d): функцию, которая просто делает петлю while выше, а затем возвращает d когда это приемлемо количество и функцию отдельныйshow_abs, который просто делает то print и return из abs(d).

Если вы сделали это, то ваша функция «более высокого уровня абстракции» будет проще, просто делегируя два других функций ...:

def distance_from_zero(d=None): 
    d = ensure_number(d) 
    return show_abs(d) 

Посмотрите, как много «чистый» это, по сравнению к взаимопониманию? Значимое имя для подблоков (здесь простые функции) ensure_number и show_abs облегчают читаемость и четкость.

Кроме того, вы можете повторно использовать один или оба из этих «строительных блоков», если они вам нужны в другом месте вашей программы, просто повторив эти функции нижнего уровня, избегая «кардинального греха копирования и вставки» и уважая основной принцип программирования «СУХОЙ» («Не повторяй себя»).

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

Смежные вопросы