Python:条件解包和赋值

时间:2017-06-30 22:11:30

标签: python

我想根据结果从初始值中获取百分比,但仅限于大于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)

1 个答案:

答案 0 :(得分:4)

all()函数返回一个布尔值,因此all(results) >= 100无法执行您想要的操作。由于bool是Python中int的子类,因此比较不会在Python 2或Python 3中引发异常。

正确的方法是使用生成器表达式作为all()的参数。另外,如果只在函数中使用了totaluser_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))