11

我见过一些这样写的 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() 的样式,反之亦然,而不影响现有调用者的语法?

4

3 回答 3

10

第一个函数接受一个元组参数,而第二个函数接受 4 个参数。您可以单独传递这些参数,也可以将这些参数作为带有splat运算符的元组传递,这会将元组解包为单独的参数。

例如:

# 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
于 2013-02-14T17:18:50.993 回答
8

您的示例中的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

于 2013-02-14T18:11:55.257 回答
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]
于 2013-02-14T18:26:09.977 回答