2017-03-11 12 views
0

以下は、Pythonコードを使用して、リスト内のappend、sort、printのような操作を実行します。L。私はコードを分析していましたが、コード内のいくつかの行を理解できませんでした。以下の数行のpythonコードスニペットについては、説明が必要です。

l = []#declare the list 
choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}#dicationary declaration 
for _ in range(int(raw_input())): #prompt for user input and iterate 
     cmds = raw_input().split(" ") #get the operation that needs to be performed on the list 
     choice = str(len(cmds)) #get the length 
     if cmds[0] == "print": print l #print the list 
     elif choice in choices: eval("l." + choices[choice].format(*cmds)) 

辞書宣言、choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}はブラケットと括弧を持って、私はその重要性を理解することができません。最後の行elif choice in choices: eval("l." + choices[choice].format(*cmds))があるため、Pythonのコードを実行するために使用されている

  1. eval機能の神秘的のようです。
  2. 文字列機能format 記号の追加が不明瞭なように見える*

入力はこれは本当に醜いコードで以下の形式で

insert 0 6 
print 
remove 6 
append 9 
+1

どこでこのコードを見つけましたか? – roganjosh

+1

'eval'は一般に安全ではありません。あなたは何をしようとしているのですか? – Chris

+0

@roganjosh @ hankerankから入手しました –

答えて

1

です。 insert 0 6は、の最初の入力として無効です。まずこの怪物を何回使用したいかを明記しなければなりません。 1

その後

  1. 入力insert 0 6は、その中に3つのパラメータを持っています。 cmds = raw_input.split(" ")choice = str(len(cmds))は、3つのパラメータ(3)をコードに渡したことを確認します。
  2. 数字3を使用して、choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}から適切な書式設定文字列を戻します。この場合; "{}({}, {})"

  3. 我々はprintのために要求していない、我々はinsertを求め、そのif cmds[0] == "print": print lFalseであり、我々はそれをスキップ。

  4. これは、elif choice in choices: eval("l." + choices[choice].format(*cmds))を評価する必要があることを意味します。さて、ポイント(2)から、choice == 3"{}({}, {})"に対応していることはすでに分かっています。 (*cmds))はタプルを展開するためのものです。(input, 0, 6)を中括弧の文字列に展開し、"insert(0, 6)"としています。
  5. 次に、文字列として "l.insert(0、6)"を与えるために、(4)の最後に文字列を連結します。それはevalに渡され、実行されます。
1

この機能を使用すると、リストで作業するメソッドを生の入力として入力できます。それは、有効な行のPythonコードである文字列を作成し、それをリスト上で評価します。

choices辞書には、評価対象の行を構成するための書式文字列が含まれています。角括弧{}は、.format呼び出しの入力リストの項目に置き換えられます。括弧()は、pythonで適切な関数呼び出しを行うための括弧です。

evalprintに置き換えると、置き換え後のコマンドの外観が正確にわかります。

にも注意してください、このコードは、あなたが使用する必要があるのPython 3のために、Pythonの2のために働く:

l = []#declare the list 
choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}#dicationary declaration 
for _ in range(int(input())): #prompt for user input and iterate 
    cmds = input().split(" ") #get the operation that needs to be performed on the list 
    choice = str(len(cmds)) #get the length 
    if cmds[0] == "print": print(l) #print the list 
    elif choice in choices: eval("l." + choices[choice].format(*cmds)) 
+0

"Pythonで適切な関数呼び出しを行うためにかっこが使用されました"私の答えでは、それに対処することを意味します。 +1。 – roganjosh

関連する問題