Не могу понять, как работает этот код Python - PullRequest
0 голосов
/ 16 сентября 2018

Я нашел этот вопрос на HackerRank и не могу понять код (решение), отображаемый на странице обсуждений.

Вопрос в следующем: Рассмотрим список (list = []). Вы можете выполнить следующие команды:

insert i e: вставить целое число в позицию. печать: распечатать список. удалить e: удалить первое вхождение целого числа. append e: вставить целое число в конец списка. сортировка: сортировка списка. pop: вытолкнуть последний элемент из списка реверс: перевернуть список.

Хотя я решил проблему с помощью if-else, я не понимаю, как работает этот код:

n = input()
slist = []
for _ in range(n):
    s = input().split()
    cmd = s[0]
    args = s[1:]
    if cmd !="print":
        cmd += "("+ ",".join(args) +")"
        eval("slist."+cmd)
    else:
        print slist

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Ну, в коде используется функция Python eval. Эта возможность есть во многих языках: eval, сокращение от «оценивать», берет фрагмент текста и выполняет его так, как если бы он был частью программы, а не просто частью данных, передаваемых в программу. Эта строка:

s = input().split()

читает строку ввода от пользователя и разбивает ее на слова на основе пробела, поэтому, если вы введете «insert 1 2», s будет установлен в список ["insert","1","2"]. Затем он преобразуется следующими строками в "insert(1,2)", который затем добавляется к "slist." и передается в eval, что приводит к выполнению вызова метода slist.insert(1,2). Таким образом, в основном этот код использует тот факт, что в Python уже есть методы для выполнения требуемых функций, которые даже имеют те же имена, которые используются в задаче. Все, что нужно сделать, это взять имя и аргументы из строки ввода и преобразовать их в синтаксис Python. (Опция print имеет специальный регистр, поскольку нет метода slist.print(); для этого случая используется глобальная команда: print slist.)

В реальном коде вы почти никогда не должны использовать eval; это очень опасная функция, поскольку она позволяет пользователям вашего приложения потенциально запускать любой код, который они хотят. Это, безусловно, одна из самых простых возможностей для взлома хакерами.

0 голосов
/ 16 сентября 2018

На самом деле я нахожу некоторую ошибку в коде, но я понял, как работает этот код.вот оно:

вход:

3
1 2 3
cmd = 1 + ( 2 + 3)

затем eval(cmd) то есть eval("1 + (2 + 3)"), который дает на выходе 6 еще один вход:

4 
4 5 6 2
cmd = 4 + ( 5 + 6 + 2)
eval(cmd)
0 голосов
/ 16 сентября 2018

Это грязный код, который злоупотребляет eval.

В основном, когда вы вводите, например, "remove 1", он создает некоторый код, который выглядит как sList.remove(1), а затем дает созданный код eval. Это имеет Python интерпретировать это.

Это, вероятно, худший способ решить эту проблему вне соревнований по кодированию. Использование eval здесь совершенно не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...