gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:53 25 4
gpt4 key购买 nike

这段代码似乎有味道:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com