我见过一些像这样编写的Python函数:
def get_year((year,prefix,index,suffix)):
return year
如果没有像这样的额外括号,它与其他函数有何不同(如果有的话):
def do_format(yr,pfx,id,sfx):
return "%s %s %s/%s"%(yr, id, pfx, sfx)
或者它只是风格上的品味问题,或者如果它们不同,可以将get_year()重写为do_format()或反之亦然,而不会影响现有调用者的语法吗?
答案 0 :(得分:10)
第一个函数采用单个元组参数,而第二个函数采用4个参数。您可以单独传递这些参数,也可以将其作为带有splat
运算符的元组传递,将元组解压缩为单个参数。
E.g:
# Valid Invocations
print do_format(*('2001', '234', '12', '123')) # Tuple Unpacking
print do_format('2001', '234', '12', '123') # Separate Parameter
print get_year(('2001', '234', '12', '123'))
# Invalid invocation.
print do_format(('2001', '234', '12', '123')) # Passes tuple
答案 1 :(得分:7)
示例中的get_year
函数使用自动解压缩的元组参数(这是Python 3中的功能)。要调用它,可以给它一个参数,该参数应该是一个包含四个值的序列。
# Invocation
my_input = [2013, 'a', 'b', 'c'] # sequence does NOT have to be a tuple!
my_year = get_year(my_input) # returns 2013
要为Python 3重写此内容,但不要更改调用(换句话说,不要破坏调用get_year
的现有代码):
def get_year(input_sequence):
year, prefix, index, suffix = input_sequence
return year
以上基本上是元组解包为您自动完成的事情。在这种特殊情况下,您只需编写
即可def get_year(input_sequence):
return input_sequence[0]
有关详细信息,请阅读PEP 3113。
答案 2 :(得分:1)
这些都是等效的(调用者不必更改):
# 2.x unpacks tuple as part of the function call, 3.x raises exception
def get_year((year,prefix,index,suffix)):
"""get year from (year, prefix, index, suffix) tuple"""
return year
# 2.x and 3.x, you unpack tuple in the function call
def get_year(year_tuple):
"""get year from (year, prefix, index, suffix) tuple"""
year, prefix, index, suffix = year_tuple
return year
# 2.x and 3.x, speedier because you don't unpack what you don't need
def get_year(year_tuple):
"""get year from (year, prefix, index, suffix) tuple"""
return year_tuple[0]