这段代码似乎有味道:
result = None
for item in list:
if result is None:
result = item.foo(args)
else:
if ClassFred.objects.get(arg1=result) < ClassFred.objects.get(arg1=item.foo(args)):
result = item.foo(args)
最臭的部分是“结果”的效用。有好心人帮我闻一闻吗?
最佳答案
L = list # 'list' is a poor variable name, use something else
result = min((n.foo(args) for n in L),
key=lambda x: ClassFred.objects.get(arg1=x))
# if you don't have to use arg1 as a named parameter:
result = min((n.foo(args) for n in L), key=ClassFred.objects.get)
min 函数比较给定的项并返回最小项(当然是 :P)。一开始并不明显的是,您可以控制用于比较它们的值,这是“关键”参数。
>>> L = [-2, -1, 3]
>>> min(L)
-2
>>> min(L, key=abs)
-1
key 函数计算“比较键”,这就是用来比较的。默认键函数是标识,其中项目的比较键是项目本身。
>>> def identity(x):
... return x
>>> min(L, key=identity)
-2
另一个例子:
>>> min("0000", "11", "222", "3")
"0000" # lexicographical minimum
>>> min("0000", "11", "222", "3", key=len)
"3"
您上面的代码使用 item.foo(args)
作为值,其中 item 来自您的列表;但是通过 ClassFred.objects.get(arg1=..)
传递的结果用于比较。这意味着构造是您的关键函数:
values = (n.foo(args) for n in L) # this is a generator expression
# it is similar to a list comprehension, but doesn't compute or store
# everything immediately
def keyfunc(x):
return ClassFred.objects.get(arg1=x)
result = min(values, key=keyfunc)
我在顶部的代码只是将这些放在一个语句中。
关于python - 这个控制结构是代码味道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886002/