我被告知
编写一个函数 square(a),它接受一个数字数组 a,并返回一个包含每个平方值的数组。
起初,我有
def square(a):
for i in a: print i**2
但这不起作用,因为我正在打印,并且没有像我被问到的那样返回。所以我尝试了
def square(a):
for i in a: return i**2
但这只会平方我数组的最后一个数字。我怎样才能让它平方整个列表?
您可以使用列表理解:
def square(list):
return [i ** 2 for i in list]
或者你可以map
:
def square(list):
return map(lambda x: x ** 2, list)
或者你可以使用发电机。它不会返回列表,但您仍然可以遍历它,并且由于您不必分配整个新列表,因此它可能比其他选项更节省空间:
def square(list):
for i in list:
yield i ** 2
或者你可以做无聊的老for
循环,虽然这不像一些 Python 程序员喜欢的那样惯用:
def square(list):
ret = []
for i in list:
ret.append(i ** 2)
return ret
使用列表推导(这是纯 Python 的方式):
>>> l = [1, 2, 3, 4]
>>> [i**2 for i in l]
[1, 4, 9, 16]
或者numpy(一个成熟的模块):
>>> numpy.array([1, 2, 3, 4])**2
array([ 1, 4, 9, 16])
在numpy
中,默认情况下,数组上的数学运算是按元素执行的。这就是为什么你可以**2
在那里放置一个完整的数组。
其他可能的解决方案将map
基于 -,但在这种情况下,我真的会选择列表理解。它是 Pythonic :) 并且map
需要lambda
s的基于解决方案的解决方案比 LC 慢。
import numpy as np
a = [2 ,3, 4]
np.square(a)
使用 numpy。
import numpy as np
b = list(np.array(a)**2)
def square(a):
squares = []
for i in a:
squares.append(i**2)
return squares
另一种地图解决方案:
def square(a):
return map(pow, a, [2]*len(a))
你可以做
square_list =[i**2 for i in start_list]
返回
[25, 9, 1, 4, 16]
或者,如果列表已经有值
square_list.extend([i**2 for i in start_list])
这会产生一个如下所示的列表:
[25, 9, 1, 4, 16]
注意:你不想做
square_list.append([i**2 for i in start_list])
因为它实际上是在原始列表中添加了一个列表,例如:
[_original_, _list_, _data_, [25, 9, 1, 4, 16]]
def square(a):
squares = []
for i in a:
squares.append(i**2)
return squares
那么我将如何使用上述函数计算 1-20 的数字平方
n = int(input())
final_list = [n**2 for n in range(1, n+1)]
print(final_list)