2013-09-09 3 views
3

Я пытаюсь изучить различные способы выполнения простых вещей в python, а также немного узнать о некоторых функциональных практиках. У меня есть некоторые цифры, которые пользователь вводит, и я хочу знать, действительно ли они номера. Я придумал этот вид классического решения:Есть ли функция в python, которая возвращает true, если все члены итеративного являются истинными?

def foo(list_of_inputs): 
    for n in list_of_inputs: 
     if not hasattr(n, "real"): 
      # some number is not a number! 
      return False 
    # all are numbers 
    return True 

Но потом я понял, это другая «вещь», которая может иметь некоторый потенциал:

def foo(list_of_inputs): 
    bool_list = map(lambda input: hasattr(input, "real"), list_of_inputs) 
    return reduce(lambda x, y: x == y, bool_list) 

Я думаю, что, может быть функция, возвращает «Истинно», если все члены коллекции, итерируемые или что-то, что правильная концепция, которую я ищу, являются «Верными», может уже быть чем-то более распространенным, а также эта вторая попытка не возвращается, когда «False «найден, в то время как классический делает ... Но я нахожу его изящным, и, возможно, это потому, что я еще не с программированием вообще.

Итак, мой вопрос: какой способ «вероятно, лучше» это сделать?

+1

Http: //docs.python. org/2/library/functions.html # all –

+2

Вы обычно используете 'all' с выражением генератора:' all (hasattr (input, 'real') для ввода в list_of_inputs) '. –

+0

Это на самом деле лучший способ, который я видел до сих пор, даже если отрицает, где я думал, что найду его (за некоторыми функциональными связями). Спасибо – ferhtgoldaraz

ответ

3

Как уже упоминалось, функция all будет делать то, что вы хотите. То, что вы описали, вы пытаетесь сделать, также может быть выполнено с помощью функции str.isnumeric().

def foo(listOfInputs): 
    return all(map(str.isnumeric,listOfInputs)) 

Edit: Я нахожу, что он не на ['1','2','3.14','4'] который немного раздражает. Может быть, кто-то может придумать умное решение, чем это, но я решил обернуть несколько измененный подход в try:

def foo(listOfInputs): 
    try: 
     return all(map(float,listOfInputs)) 
    except ValueError: 
     return False 

Это работает на:

['1','2','-3','4'] 
['1','2','3.14','4'] 
+0

Приятно знать о isnumeric(), он не работал, но кажется, что это потому, что я на python 2.7.5, и он должен быть unicode. Большое спасибо. Может быть, я просто должен забыть о том, чтобы попытаться избежать тестирования всех, если бы не было ненужного, по крайней мере пока. – ferhtgoldaraz

+0

А мне плохо. тестирование пользовательского ввода является хорошей практикой, но вы можете легко «спуститься по кроличьей дыре», проверяя любую возможную вещь, которую может ввести пользователь. Пример: что, если кто-то войдет в «1,000,000»? Или '1,199,99'? Или что, если они в Европе, и они печатают '1.000.000,99'? Все они должны быть действительными, теоретически, но написание кода для проверки всех этих может стать целым [regex] (http://stackoverflow.com/questions/tagged/regex). –

+0

Да, но эй, есть некоторые синтаксические ограничения, поэтому, возможно, лучший способ справиться с этими крайними случаями - сообщить, как ожидается вход. Я из Европы на самом деле, поэтому я понимаю, как пример, который вы упомянули, может быть проблемой. – ferhtgoldaraz

2

Вы имеете в виду нечто вроде встроенной функции all?

Возврат True Если все элементы итерабельного являются истинными (или если итерабельность пуста). Эквивалент:

+0

Да, все (карта (lambda x: hasattr (x, "real"), list_of_inputs)) выглядит лучше, спасибо! Я должен чаще проверять бултинов ... Но все еще есть дело с проверкой всех, а не с возвратом, когда есть «Ложь». Спасибо, но – ferhtgoldaraz

+0

@ferhtgoldaraz '(map (lambda x: hasattr (x," real "), list_of_inputs))' выглядит лучше, чем короткие и сладкие 'все'? –

+0

Нет, это просто, что мне нужно собрать коллекцию логических элементов и называть все() на ней ... Не так ли? – ferhtgoldaraz