为什么这是非常错误的,逐行:def median(list): # 1
list.sort() # 2
if len(list)%2 == 0:
#have to take avg of middle two
i = len(list)/2 # 3
median = avg() # 4
else:
#find the middle (remembering that lists start at 0)
i = len(list)/2 # 5
median = list # 6
return median
#1:给变量指定与数据类型相同的名称,即list是个坏主意。
#2:list.sort()将修改正在传递的列表。人们会期望像median()这样的getter不会这样做。
#4它调用一个没有参数的函数avg(),这是完全没有意义的,即使定义了这样一个函数。
无论采用何种分支,都以相同的方式计算#3和#5。无论如何,i从未使用过。
#6它将median设置为原始的list,这是没有意义的。
以下是我将如何重写(同时保持清晰性):def median(alist):
srtd = sorted(alist) # returns a sorted copy
mid = len(alist)/2 # remember that integer division truncates
if len(alist) % 2 == 0: # take the avg of middle two
return (srtd[mid-1] + srtd[mid]) / 2.0
else:
return srtd[mid]
此外,avg_list()函数(在median()中既不使用也不能使用)可以重写为:def avg_list(numbers):
return float(sum(numbers))/len(numbers)
^{}是返回iterable中所有元素之和的函数。