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

最初の関数は 1 つのタプル引数を取りますが、2 番目の関数は 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 から削除された機能です)。それを呼び出すには、単一のパラメーターを指定します。そのパラメーターは、4 つの値を含むシーケンスであることが期待されます。

# 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 に答える