Как передать список как вход функции в 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]
.
Что я делаю неправильно?
Ответы
Ответ 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,]