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

标签 python structure controls

这段代码似乎有味道:

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/

相关文章:

python - 将邻接矩阵转换为字典的有效方法是什么?

c - 如何在邮件中引用C结构成员

asp.net - 如何从 CSS 引用嵌入图像?

asp.net - 内联脚本在 ASP.Net 自定义控件中无法解析

python - 使用 autograd.grad() 作为损失函数的参数(pytorch)

python - 如何按关键字分割文件?

python - 如何使用条件索引在单元格上获取标量值

c - 指向结构体的指针的二维数组(动态)

java - 如何使用java在Oracle sql中存储目录结构

WPF RichTextBox 性能