Kode python di bawah ini digunakan untuk melakukan operasi seperti menambahkan, mengurutkan, mencetak pada daftarL. Saya menganalisis kode, tetapi tidak dapat memahami beberapa baris dalam kode.

 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))

Deklarasi kamus,choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}memiliki tanda kurung dan kurung, saya tidak dapat memahami signifikansinya. Baris terakhirelif choice in choices: eval("l." + choices[choice].format(*cmds)) tampaknya misterius karena

  1. eval fungsi yang digunakan untuk mengeksekusi kode Python.
  2. fungsi string format yang tampaknya tidak jelas dengan penambahan simbol *.

Masukan dalam format di bawah ini

insert 0 6
print 
remove 6
append 9
0
user7390268 11 Maret 2017, 20:48

2 jawaban

Jawaban Terbaik

Ini benar-benar kode yang jelek. insert 0 6 tidak valid sebagai input pertama; pertama Anda harus menyatakan berapa kali Anda ingin menggunakan monstrositas ini mis. 1.

Kemudian:

  1. Input insert 0 6 memiliki tiga parameter di dalamnya. cmds = raw_input.split(" ") dan choice = str(len(cmds)) kemudian berhasil bahwa Anda meneruskan tiga (3) parameter ke kode.
  2. Angka 3 kemudian digunakan untuk mengembalikan string pemformatan yang sesuai dari choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}. Pada kasus ini; "{}({}, {})"

  3. Kami tidak meminta print, kami meminta insert, jadi if cmds[0] == "print": print l adalah False dan kami melewatkannya.

  4. Ini berarti kita kemudian harus mengevaluasi elif choice in choices: eval("l." + choices[choice].format(*cmds)). Nah, kita sudah tahu dari poin (2) bahwa choice == 3 sesuai dengan "{}({}, {})". (*cmds)) adalah untuk membongkar tuple... itu membongkar (input, 0, 6) ke dalam string di kurung kurawal, memberikan "insert(0, 6)".
  5. Kami kemudian menggabungkan string di akhir (4) untuk memberikan "l.insert(0, 6)" sebagai string. Itu kemudian diteruskan ke eval dan dieksekusi.
1
roganjosh 11 Maret 2017, 18:38

Fungsi ini memungkinkan pengguna untuk memasukkan metode yang bekerja pada daftar sebagai input mentah. Itu kemudian membuat string dengan itu adalah baris kode python yang valid dan mengevaluasinya di daftar.

Kamus choices berisi string format yang digunakan untuk menyusun garis yang akan dievaluasi. Tanda kurung {} akan diganti dengan item dari daftar input dalam panggilan .format. Tanda kurung () adalah tanda kurung yang digunakan untuk membuat panggilan fungsi yang tepat di python.

Jika Anda mengganti eval dengan print Anda akan melihat persis seperti apa tampilan perintah setelah penggantian.

Perhatikan juga, kode ini hanya berfungsi untuk Python 2, untuk Python 3 Anda perlu menggunakan:

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))
1
Craig 11 Maret 2017, 18:43