我想根据结果从初始值中获取百分比,但仅限于大于100的结果,否则返回初始值。目前检查两个结果if all(results) >= 100
,如果我向生成器表达式(i*percent/100 for i in results if i >= 100)
添加过滤器,则变量赋值将失败。总之,如果结果小于100,则应跳过计算,否则运行,因此如果结果为(500,0),则函数应返回(250,75)。什么是pythonic方法呢?
total = 150
user_total = 75
def test01(results=(500, 0)):
if all(results) >= 100:
percent = 50
total, user_total = (i*percent/100 for i in results)
return (total, user_total)
答案 0 :(得分:4)
all()
函数返回一个布尔值,因此all(results) >= 100
无法执行您想要的操作。由于bool
是Python中int
的子类,因此比较不会在Python 2或Python 3中引发异常。
正确的方法是使用生成器表达式作为all()
的参数。另外,如果只在函数中使用了total
和user_total
关键字参数,则可以这样做:
def test01(results=(500, 0), total=150, user_total=75):
if all(x >= 100 for x in results):
percent = 50
total, user_total = (i*percent/100 for i in results)
return total, user_total
更新:如果要在结果小于100时跳过计算,可以使用带三元运算符的生成器:
def test01(results=(500, 0), defaults=(150, 75)):
percent = 50
total, user_total = (results[i]*percent/100 if results[i] >= 100
else defaults[i] for i in [0, 1])
或zip()
:
def test01(results=(500, 0), defaults=(150, 75)):
percent = 50
total, user_total = (r*percent/100 if r >= 100 else d
for r, d in zip(results, defaults))