Python 许多不同项目的发电机
有许多不同项目(函数、对象属性、值)的数组,例如:Python 许多不同项目的发电机,python,generator,dry,yield,Python,Generator,Dry,Yield,有许多不同项目(函数、对象属性、值)的数组,例如: lst = [ 1, a(), obj.prop, ... z() ] 我想检查所有值是否为真,因此我使用all(): 但在这种情况下,列表的所有值都是在创建列表时计算的 其目的不是计算列表初始化时的所有值,而是“动态”计算,并停止迭代(和计算)列表中的第一个错误项。因此,一个解决方案是从生成器中产生每个值: def gen(): yield 1 yield a() yield obj.prop ... yield z
lst = [
1,
a(),
obj.prop,
...
z()
]
我想检查所有值是否为真,因此我使用all()
:
但在这种情况下,列表的所有值都是在创建列表时计算的
其目的不是计算列表初始化时的所有值,而是“动态”计算,并停止迭代(和计算)列表中的第一个错误项。因此,一个解决方案是从生成器中产生每个值:
def gen():
yield 1
yield a()
yield obj.prop
...
yield z()
但它不是干巴巴的代码,重复使用yield关键字看起来很难看。还有其他更漂亮的解决方案吗?我会被否决发表这篇文章,但如果你能将函数和参数拆分成一个元组列表(如果函数不是真正的函数,则参数=None),类似的方法就行了。 但正如人们在评论中所说的那样,这些数据是丑陋的。在将这些函数添加到列表之前,请再次考虑它们是否来自,如果可能,请尝试在生成列表之前逐个评估它们
def a(z):
print('a')
return True
def b(z):
print('b')
return False
def c(z):
print('c')
return True
def map_func_params(x):
for func, params in x:
if params is None:
if func:
continue
if func(*params):
continue
else:
return False
return True
print(
map_func_params([(a, (1,)), (b, (2, )), (c, (2, )), (4, None)])
)
照片显示:
a
b
False
函数c永远不会执行。代码很难看,因为“各种项目的数组”从一开始就很难看,您只在每行添加了
yield
关键字。如果定义此列表的最佳方法是按您所示逐字写出每个元素,那么答案是否定的:没有比将其作为生成器编写更漂亮的方法,可以支持您在发现第一个false后停止计算元素的要求(这是all
为您所做的),它处理函数,但不处理变量,与obj.prop
-可以使用getattr
重写对象属性一样,简单变量需要一个包装函数:def get_a():返回一个
不仅函数调用,而且对象属性也可能导致计算时执行任意代码
a
b
False