2016-08-16 3 views
1

Я получаю параметры с плавающей запятой от пользователя в скрипте и задаюсь вопросом, есть ли лучший/эффективный способ, включая параметр, например, если пользователь только поставляет один параметр (или вообще отсутствует), является есть ли способ, чтобы я по умолчанию оставил два в качестве 0.0? И может быть какой-то лучший способ сохранить в файлеPython - список переменных с плавающей запятой

#inside a loop to keep getting values   
line = raw_input("Enter three parm values: ") 
x=line.split(' ') 
fa=fb=fc=0.0 

a=x[0] 
b=x[1] #what if user only supplies only one? 
c=x[2] # how can i leave this or default to 0.0? 

fa=float(a) 
fb=float(b) 
fc=float(c) 

file=open(inputFile, 'a+') 
file.write(name) 
file.write("\t") 
file.write(a) 
file.write(" ") 
file.write(b) 
file.write(" ") 
file.write(c) 
file.write("/n") 

ответ

3

Почему вы не используете список для хранения произвольного числа переменных?

floats = [float(var) if var else 0. 
      for var in raw_input("Enter three parm values: ").split(' ')] 
with open(inputFile, 'a+') as f: 
    f.write(name + '\t' + ' '.join(str(f) for f in floats) + '\n') 

Если вы хотите раздуть этот список с дополнительными нулями до трех параметров, то вы можете сделать это:

floats = [1] # For example. 
if len(floats) < 3: 
    floats += [0] * (3 - len(floats)) 

>>> floats 
[1, 0, 0] 
+0

Лучший ответ, я верю, ценю вашу чистую логику – Naumann

+0

вы можете упомянуть, как обращаться с пустым вводом здесь? – Naumann

+0

@Naumann См. Править выше в 'floats' – Alexander

2

Обновлен адрес индекса из диапазона ошибок:

# use python ternary operator to set default value 
# index goes out of range 
#c = x[2] if x[2] is not None else 0 
# use array length instead 
b = x[1] if len(x) >= 2 else 0 
c = x[2] if len(x) >= 3 else 0 

file=open(inputFile, 'a+') 
# string concatenation gets rid of repeated function calls 
file.write(name + "\t" + a + " " + b + " " + c + "\n") 
+0

Не работает для меня (я использую Python 2.6) ... «Файл« ./test.py », строка 99, в get_input c = x [2], если x [2] не является None else 0 IndexError: индекс списка за пределами допустимого диапазона – Naumann

+0

@Naumann - Обновлено с помощью различных логический тест, чтобы убедиться, что это значение существует. –

+0

Спасибо, Хуан, тот же IndexError: индекс индекса за пределами диапазона ... но я вижу вашу логику, надеюсь, что я 'll настроить, что ... +1 – Naumann

1

Вы можете проверить длину списка, возвращаемого line.split (»«) посмотреть, сколько у вас есть, и идти оттуда. Или вы можете проверить, есть ли запись в списке None, прежде чем назначать ее.

Для записи в файлы лучше всего установить структуру ваших данных, а затем вызвать запись только один раз, так как это будет затруднять эффективность ввода/вывода файлов.

+0

Проблема заключается в том, что пользователь вводит пробел, он не работает, поэтому проверка альтернативных логик – Naumann

+1

Вы можете использовать функцию 'strip()' для очистки ввода пользователя, а затем создать список: 'x.strip(). split ("") ' – pomtree

+0

да, вы правы, я все еще приспосабливаюсь к python. действительно большой опыт до сих пор – Naumann

1
#use length of list for checking the input and continue with your operation 
line = raw_input("Enter three parm values: ") 
x=line.split(' ') 
a=b=c=0 
fa=fb=fc=0.0 
listLen = len(x) 
if(listLen == 3): 
    a, b, c = x[0], x[1], x[2] 
elif(listLen == 2): 
    a, b = x[0], x[1] 
elif(listLen == 1): 
    a = x[0] 
+0

, что приятно иметь альтернативное решение. проблема будет только в том случае, если вы введете 1 2 3, а затем может возникнуть пробел, так как это будет пустая строка – Naumann

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