Подтвердить что ты не робот

Как передать список как вход функции в Python

Я использую Python, и у меня есть функция, которая принимает список в качестве аргумента. Например, я использую следующий синтаксис,

def square(x,result= []):
    for y in x:
        result.append=math.pow(y,2.0)
        return result

print(square([1,2,3]))

и вывод [1] только там, где я должен получить [1,4,9].

Что я делаю неправильно?

4b9b3361

Ответ 1

В настоящее время вы возвращаете значение из своей функции в первой итерации цикла for. Из-за этого вторая и третья итерации вашего цикла for никогда не происходят. Вам нужно переместить оператор return за пределы цикла следующим образом:

import math

def square(x):
    result = []
    for y in x:
        result.append(math.pow(y,2.0))
    return result 

print(square([1,2,3]))

Выход

[1.0, 4.0, 9.0]

Ответ 2

Почему бы не устранить проблему вообще?

def square(vals):
    return [v*v for v in vals]

Изменить:. Первая проблема, как отметили несколько человек, заключается в том, что вы замыкаете цикл for. Ваш return должен появиться после цикла, а не в нем.

Следующая проблема заключается в использовании list.append - вам нужно вызвать ее, а не назначать ей, то есть result.append(y*y). result.append = y*y вместо этого перезаписывает метод с числовым значением, возможно, выдает ошибку при следующем вызове.

Как только вы исправите это, вы обнаружите еще одну менее очевидную ошибку, если вы повторно назовете свою функцию:

print(square([1,2,3])     # => [1, 4, 9]
print(square([1,2,3])     # => [1, 4, 9, 1, 4, 9]

Поскольку вы передаете изменяемый элемент (список) по умолчанию, все дальнейшее использование этого элемента по умолчанию указывает на тот же исходный список.

Вместо этого попробуйте

def square(vals, result=None):
    if result is None:
        result = []
    result.extend(v*v for v in vals)
    return result

Ответ 3

Мы даже используем result? Вы можете использовать понимание списка, чтобы сгенерировать результат, который вы затем вернете. Я не уверен, почему вы передали result в качестве переменной в функцию, так как она не используется.

Кроме того, наличие return result внутри вашего цикла означает, что функция возвращает значение на первой итерации, поэтому он просто возвращает квадрат первого числа в списке.

import math

def square(x):
    return [math.pow(y, 2) for y in x]

>>> print(square([1,2,3]))
[1.0, 4.0, 9.0]

Ответ 4

Вы должны вернуться за цикл for. В противном случае он прекратится после первой итерации.

def square(x):
    result=[]
    for y in x:
        result.append(math.pow(y,2.0)) # add to list after calculation
    return result 

print(square([1,2,3])

Ответ 5

Вам может быть интересно использовать yield

def square(x):
    for y in x:
        yield math.pow(y, 2.0)

таким образом вы можете вызвать

for sq in square(x):
    ...

который не будет генерировать весь список квадратов одновременно, а скорее один элемент на итерацию, или использовать list(square(x)) для получения полного списка по запросу.

Ответ 6

Это интересная возможность использовать немного более функциональный стиль:

import math
map(lambda x:(math.pow(x,2)), [1,2,3])

Здесь используется функция map, которая принимает список и функцию и возвращает новый список, в котором эта функция была применена индивидуально каждому члену списка. В этом случае он применяет функцию math.pow(x,2) к каждому члену списка, где каждое число равно x.

Обратите внимание, что map(lambda x:(math.pow(x,2)), [1,2,3]) возвращает итерируемый, что очень удобно, но если вам нужно получить список обратно, просто оберните весь оператор в list().

Ответ 7

ваш код не имеет смысла нигде. синтаксическая ошибка в конце отсутствует закрывающая скобка для печати, обратный вызов внутри цикла for означает, что он выполняется только один раз, а result.append - это функция, а не конструктор sp, правильный вызов

result.append(math.pow(y,2))

Единственное, что не является проблемой, это передача списка, который является вашим вопросом, функция получает весь список, если вы делаете

def f(a):
    print a
f([1,2,3])

из

[1,2,3,]