Skip to main content
 首页 » 编程设计

python之这个控制结构是代码味道吗

2025年05月04日18mengfanrong

这段代码似乎有味道:

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) 

我在顶部的代码只是将这些放在一个语句中。