Python中可选参数与返回值的优雅编码方案问询
如何用更优雅的方式减少/移除if语句实现这个多返回值函数?
先看你给出的原始代码:
import numpy as np X = np.ones((3,3)) def calculate(X, output2=False, output3=False): y1=X*2 y2=X*3 y3=X*4 if (output2==False and output3==False): return y1 if (output2==True and output3==False): return y1,y2 if (output2==False and output3==True): return y1,y3 if (output2==True and output3==True): return y1,y2,y3
确实,四个并列的if判断有点冗余,这里给你几种更优雅的写法,既能减少甚至移除if语句,还能保持原函数的所有行为:
方案一:用列表收集结果(仅2个独立if)
这种写法逻辑直观,把必返回的y1先放进结果列表,再根据参数决定是否添加y2和y3,最后统一处理返回格式:
import numpy as np X = np.ones((3,3)) def calculate(X, output2=False, output3=False): y1 = X * 2 result = [y1] if output2: result.append(X * 3) if output3: result.append(X * 4) # 和原函数保持一致:单个值返回元素,多个返回元组 return tuple(result) if len(result) > 1 else result[0]
方案二:用三元表达式拼接元组(无显式if块)
如果想彻底去掉if块,可以用三元表达式来拼接结果元组,写法更紧凑:
import numpy as np X = np.ones((3,3)) def calculate(X, output2=False, output3=False): y1 = X * 2 y2 = X * 3 y3 = X * 4 # 根据参数选择要拼接的元素 return_values = (y1,) + ((y2,) if output2 else ()) + ((y3,) if output3 else ()) return return_values if len(return_values) > 1 else return_values[0]
方案三:利用布尔值的特性(完全无if相关语法)
Python里布尔值是整数的子类,True等价于1,False等价于0,我们可以利用这个特性来生成结果列表,完全不用任何if相关的语法:
import numpy as np X = np.ones((3,3)) def calculate(X, output2=False, output3=False): y1 = X * 2 y2 = X * 3 y3 = X * 4 # 用布尔值控制列表元素的添加:[y2]*True = [y2],[y2]*False = [] result = [y1] + [y2]*output2 + [y3]*output3 return tuple(result) if len(result) > 1 else result[0]
这几种写法都保留了原函数的返回逻辑:当两个开关都关闭时返回单个y1,否则返回对应数量的元组,同时代码结构更简洁,可读性也更好。
内容的提问来源于stack exchange,提问作者mile.d
相关产品推荐
相关产品推荐

