Python функций: метод возврата внутри цикла for - PullRequest
0 голосов
/ 10 июля 2020

У меня есть следующий код:

def encrypt(plaintext, k):
    return "".join([alphabet[(alphabet.index(i)+k)] for i in plaintext.lower()])

Я не понимаю, как python может читать такой синтаксис, может ли кто-нибудь сломать здесь порядок выполнения?

Я часто встречал этот вид «однострочного» стиля письма в python, который всегда казался таким элегантным и эффективным, но я никогда не понимал logi c.

Заранее спасибо, удачного дня.

1 Ответ

0 голосов
/ 10 июля 2020

В Python мы называем это пониманием списка. Существуют и другие сообщения stackoverflow, которые подробно освещали эту c эту тему, например: Что означает «понимание списка»? Как это работает и как я могу его использовать? и Объяснение того, как работает понимание вложенных списков? .

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

"".join([alphabet[(alphabet.index(i)+k)] for i in plaintext.lower()])

Может быть разбито как:

"".join(  # The join method will stitch all the elements from the container (list) together
    [
        alphabet[alphabet.index(i) + k]  # alphabet seems to be a list, that we index increasingly by k
        for i in plaintext.lower()
        # we loop through each element in plaintext.lower() (notice the i is used in the alphabet[alphabet.index(i) + k])
    ]
)

Обратите внимание, что мы можем переписать для понимания в качестве фор-л oop. Я создал похожий пример, который, надеюсь, может лучше прояснить ситуацию:

alphabet = ['a', 'b', 'c']
some_list = []

for i in "ABC".lower():
    some_list.append(alphabet[alphabet.index(i)])  # 1 as a dummy variable

bringing_alphabet_back = "".join(some_list)
print(bringing_alphabet_back) # abc

И, наконец, return просто возвращает результат. Это аналогично возврату всего результатаring_alphabet_back.

...