2016-01-31 3 views
11

Я использую 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].

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

+13

1. Не делайте изменчивые аргументы по умолчанию. 2. Вы можете только «вернуть» один раз. – jonrsharpe

+1

Тогда как я могу вернуть массив в качестве вывода. Можете ли вы дать мне какие-либо идеи? Спасибо –

+3

Принесите возврат из цикла for. –

ответ

14

Вы в настоящее время возвращает значение из вашей функции в первой итерации вашего 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] 
+0

Как кто-то использовал для программирования на основе скобок, а не для отступов, я должен сказать, что одна вкладка, в которой функция возвращается, - это то, что я нахожу ужасно неинтуитивным. – Pharap

+0

Но вы все еще отступаете от своего кода, даже если используете брекеты, не так ли? – Matthias

18

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

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

Edit: Первая проблема, так как несколько людей указали, что вы короткое замыкание вашего 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 
+2

На самом деле это не говорит OP, где они идут не так, и это всего лишь один лайнер, как квадрат массива – ShaneQful

+1

@ShaneQful: пожалуйста, взгляните еще раз. –

+0

Извинения, мой первоначальный комментарий выше был основан на вашем первоначальном сжатом ответе. У меня есть голосование :) – ShaneQful

3

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

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

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

Append - это функция, которую вы не хотите переписывать здесь. –

6

Мы даже используем 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] 
+0

Ну, это можно рассматривать как начальное значение, например. Возможно, OP предназначался для 'square ([1,2,3], [100,200,300])' для возврата '[100,200,300,1,4,9]'. – muru

0

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

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

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

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

из

[1,2,3,] 
3

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

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

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

for sq in square(x): 
    ... 

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

2

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

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().

Смежные вопросы