Python中两个multiply函数运行差异及args[0]作用的技术咨询
问题解答
为什么第一个函数能运行,第二个不行?
先看第一个函数的关键逻辑:
import math def multiply(*args): args = int(args[0]) # 提取元组第一个元素转成整数,覆盖了原args元组 arg_length = len(str(abs(args))) return args * (5 ** arg_length)
*args是可变参数语法,接收的参数会被打包成一个元组。第一个函数里,args = int(args[0])把元组的第一个元素取出来转成整数,之后的args就变成了整数类型,后续的abs()、str()等操作都能正常执行,所以函数可以正常运行。
再看第二个函数的问题:
import math def multiply(*args): arg_length = len(str(abs(int(args)))) # 直接对元组转int,触发报错 return args * (5 ** arg_length)
这里的int(args)是尝试把整个元组转成整数,但元组本身不能直接转换为整数,运行时会抛出TypeError: int() argument must be a string, a bytes-like object or a real number, not 'tuple',这就是第二个函数无法运行的核心原因。必须像第一个函数那样,先取元组里的具体元素(比如args[0])再做类型转换。
关于args[0]的疑问
args[0]只是提取可变参数元组的第一个元素,不会自动排除负号。比如调用multiply(-123)时,args是(-123,),args[0]就是-123;调用multiply(456)时,args[0]就是456。
你看到的“负号被排除”是后续abs(args)的作用——abs()会返回整数的绝对值,不管原数正负,都会转为非负数。当参数是正数时,abs(args)和原数完全一致,转成字符串后自然保留所有数字字符,不会排除第一个字符。
内容的提问来源于stack exchange,提问作者From_0_to_1
相关产品推荐
相关产品推荐

