2016-04-11 17 views
0

我想知道在Python中編寫代碼時如何使用「用戶輸入列表」 ?非交互式環境如何在python中使用'用戶輸入列表'在**非交互式環境中編寫代碼**?

比如...在字符串的情況下,我們做以下幾點: -

str1=input("Enter the string1: ") 

同樣,對於我們輸入一邊寫代碼以下行整數

num1=int(input("Enter the number1:")) 

類似地,對於複數,我們在編寫代碼時輸入以下行。

c1=complex(input("Enter complex number1: ")) 

請幫助,並提供元組和字典的答案。什麼是語法?

+0

他們輸入由',''或其他分隔符分隔的項目,您可以使用'split'作爲一個選項。你可以爲元組做同樣的事情,但只需將'split'放入'tuple'中即可。如果你想讓它們成爲字符串等,你將不得不處理類型的課程。 – Pythonista

+0

有人不可避免地要推薦'eval'。這是一個壞主意;當用戶做出某些惡意的事情時,用戶做了一些錯誤的事情並且可能導致災難性的結果,並且它避免了學習如何解析不直接映射到Python語法的輸入的重要任務。 – user2357112

+0

'ast.literal_eval' – kindall

回答

0

可以使用ast.literal_eval安全評價來自用戶的字面任何蟒蛇:

import ast 

data = ast.literal_eval(input("enter a python literal:")) 
print(type(data),data) 

這可以讓你輸入各種事情:

enter a python literal:[1,2,3] 
<class 'list'> [1, 2, 3] 
enter a python literal:(3,2,1) 
<class 'tuple'> (3, 2, 1) 
enter a python literal:"hello" 
<class 'str'> hello 
enter a python literal:3.4 
<class 'float'> 3.4 

#this one is *extremely* malicious when put in eval() 
enter a python literal:open(__file__,"w").close() 
Traceback (most recent call last): 
    ... 
ValueError: malformed node or string: <_ast.Name object at 0x1056b4f98> 

# but ast.literal_eval is safe with user input like this. 

雖然你可能也只是split通過逗號得到的數據列表:

data = input("enter some values seperated by ,s: ").split(",") 

這會給你一個列表:

enter some values seperated by ,s: 1,2,3 
<class 'list'> ['1', '2', '3'] 
0

不要認爲這是進入一個列表的用戶。用戶輸入列表就像老闆手動發射神經元;列表是用戶不應該處理的程序內部數據結構。

定義用戶輸入的格式並編寫適當的格式相關代碼來解析它。例如,如果你希望你的用戶輸入基地10的整數,以逗號和(可選)空格分開,你可以使用

ints = [int(s) for s in input().split(',')] 

如果你真的想你的輸入格式是Python的文字語法,你可以使用ast.literal_eval

obj = ast.literal_eval(input()) 

如果你看到沒有錯的老闆手工燒製的神經元的想法,你可以用eval讓用戶輸入任意的Python表達式(不聲明)。 這是幾乎從來沒有一個好主意

# Bad idea - this makes a mess if the user does something wrong and is potentially 
# catastrophic if the user does something malicious. 
# For example, if the user types __import__('os').system('nasty command'), 
# they can delete all your files or steal your browser's saved passwords. 
terrible_idea = eval(input()) 
+0

'open(__ file __,「w」)。close()'是一個有效的python表達式,如果'eval'uated它會刪除內容.py目前正在執行的文件。但它不是一個有效的_literal_,所以它仍然是安全的。 –

+0

正如其他人所說,不要在明顯的編程/ python初學者中給出'eval()'的提示 - 在光明文本中沒有關於eval和用戶輸入可能發生的問題的大聲明!這意味着解釋爲什麼eval是邪惡的,並且把它清理乾淨,除非你知道爲什麼需要訴諸它,否則這是一件超級愚蠢的事情。我們正在幫助世界來到這裏,如果初學者問一個問題,我們會留下一個好的教訓,這樣我們就不必處​​理下一代的愚蠢問題。先謝謝你。 – Torxed

+0

我已經明確表示這是一個壞主意,加上我上面的評論,但肯定。回答更詳細的說明爲什麼這是一個壞主意,並強調文本的粗體。 – user2357112

0

用戶可以輸入只有str。這意味着input()返回str。如果你想list,你必須使它成爲list。其他一切都一樣。

x = input("a, b, c: ") 
# a, b, c: 2,3,4 => x -> "a,b,c" str 
l = [int(i.strip()) for i in x.split(",")] # [2, 3, 4] 

如果你寧願讓他們你想要什麼輸入repr(),然後(最好不要做這樣)如果你希望用戶進入「名單」只是

x = eval(input("a, b, c: ")) 
# a, b, c: 2,3,4 => x -> (2, 3, 4) tuple 
+0

使用eval你可以輸入'open(__ file __,「w」)。close()',用戶將從字面上刪除.py文件的內容,請不要使用'eval'。 –

+0

@ TadhgMcDonald-Jensen同意。只是爲了表明它的工作原理。我將不會在給定的上下文中以任何形式使用'eval()'。 –

+1

那麼你爲什麼不建議['ast.literal_eval'](https://docs.python.org/3.5/library/ast.html#ast.literal_eval),因爲它只解析python _literals_而不是泛型表達式。 –

相關問題