我想执行以下操作:
<UserControl.Template>
<ControlTemplate TargetType="UserControl">
<Grid>
<Path Fill="{TemplateBinding Background}"
Stroke="{TemplateBinding BorderBrush}"
StrokeLineJoin="Round"
StrokeThickness="{Binding OutlineThickness, RelativeSource={RelativeSource TemplatedParent}}"
Data="{Binding Outline, RelativeSource={RelativeSource TemplatedParent}}"/>
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</ControlTemplate>
</UserControl.Template>
x / y /它们都可以是None。 如果我以这种方式过滤None值:
min_xy=min(x,y)
如果x&amp; y都是None,我可能会得到这个断言。
min_xy=min(filter(None,(x,y)))
如果只有其中一个是None,那么有一个优雅的方法来获取小数字,如果它们都是None,那么得到None吗?
答案 0 :(得分:2)
你可以这样做:
min_xy = None if all(n is None for n in (x, y)) else min(filter(None,(x,y)))
您也可以将其变为function
:
def min_xy(x, y):
if all(n is None for n in (x, y)):
return None
else:
return min(filter(None,(x,y)))
或lambda
:
min_xy = lambda x, y: None if all(n is None for n in (x, y)) else min(filter(None,(x,y)))
<强>试验:强>
print(min_xy(1, None)) # 1
print(min_xy(1, 2)) # 1
print(min_xy(None, 1)) # 1
print(min_xy(None, None)) # None
修改强>
自Python 3.4以来,min
已更新为接受默认参数,以防提供的iterable为空。这样可以实现优雅的单行:
min_xy = min(filter(None, (x, y)), default=None)
默认参数指定在提供的iterable为空时返回的对象。如果iterable为空并且未提供default,则会引发ValueError。
答案 1 :(得分:1)
为了保持可读性,我建议:
def coalescing_min(*args):
args = [i for i in args if i is not None]
if args:
return min(args)
else:
return None
答案 2 :(得分:0)
x, y = None, 1
min_xy = next(filter(lambda __: __ is not None, (x, y)), None) if any(map(lambda __: __ is None, (x, y))) else min(x, y)
print(min_xy)
答案 3 :(得分:0)
def get_min(arr):
mini = None
for ar in arr:
if ar is not None:
mini = ar
mini = min(ar,mini)
return mini
它将参数作为任意数量元素的列表并返回最小值。我认为这应该有用。
答案 4 :(得分:0)
另一种选择:
def nmin(*args):
try:
return min(x for x in args if x is not None)
except ValueError:
return None