Объединение строк в список элементов с использованием циклов for в python - PullRequest
0 голосов
/ 07 августа 2020

Я новичок в python3, и в последнее время я практиковался со списками и функциями.

Здесь я сохранил строки внутри списка, а затем передал этот список функции, которая должна объединять / добавляем строку, например:

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
    return names


liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = hello(liiist)
print(liiist)

Но вместо ['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!'] я просто получаю ['L Lawliet', 'Nate River', 'Mihael Keehl'] Ничего не произошло . Кроме того, PyCharm предупреждает меня, что Local variable 'name' value is not used

Я тоже экспериментировал с этой проблемой, и оказалось, что также не работает вне функций :

vars = ["trying", "to", "rewrite", "lists"]
for var in vars:
    var = var + " hello"
print(vars)

Результат: ['trying', 'to', 'rewrite', 'lists']

Я уже нашел способ обойти эту проблему, но я не рад, что нашел решение случайно / огромным количеством проб и ошибок. Думаю, я не понимаю, почему python дает такие результаты, которые могут помешать моей карьере в будущем. Кто-нибудь, пожалуйста, объясните, почему это происходит?

Также, если вам интересно, вот это обходной путь, который я нашел:

def hello(names):
    counter = 0
    for name in names:
        name = name + " the Great"
        names[counter] = names
        counter += 1
    return names

names = ["L Lawliet", "Nate River", "Mihael Keehl"]
names = hello(names)
print(names)

Предоставление мне более эффективного кода, чем приведенный выше, также может помочь:)

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Один из способов получить вышеуказанный результат - это добавить в список, как указано выше @Andrej Kesely. Другой способ - использовать генератор yield, который выводит последовательность. См. Приведенный ниже код.

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
        yield name     # generator that outputs sequence. Yield should be inside loop

liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = list(hello(liiist))     # store the yield output in a list when calling the function
print(liiist)

См. Снимок ниже для вывода

введите описание изображения здесь

0 голосов
/ 07 августа 2020

Ваша функция

def hello(names):
    for name in names:
        name = "Hello "+name+"!"
    return names

фактически ничего не делает, потому что строки в Python неизменяемы. Одним из решений является возврат нового списка, который содержит вновь созданные строки, например:

def hello(names):
    rv = []
    for name in names:
        rv.append("Hello "+name+"!")
    return rv


liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]
liiist = hello(liiist)
print(liiist)

Печать:

['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!']

Или вы можете изменить список на месте (но в этом случае ваша функция ничего не возвращает):

def hello(names):
    for i, name in enumerate(names):
        names[i] = "Hello "+name+"!"

liiist = ["L Lawliet", "Nate River", "Mihael Keehl"]

hello(liiist)
print(liiist)

Выводит:

['Hello L Lawliet!', 'Hello Nate River!', 'Hello Mihael Keehl!']
...