2013-02-14 19 views
10

Widziałem niektóre funkcje Pythona napisane tak:Dlaczego niektóre funkcje Pythona mają dodatkowy zestaw nawiasów wokół listy argumentów?

def get_year((year,prefix,index,suffix)): 
    return year 

Jak to różnią się (jeśli w ogóle) z innych funkcji bez dodatkowych nawiasach tak:

def do_format(yr,pfx,id,sfx): 
    return "%s %s %s/%s"%(yr, id, pfx, sfx) 

A może to po prostu kwestia gustu w stylach, czy też różnią się one, czy get_year() może być przepisany tak, aby był w stylu do_format() lub na odwrót, bez wpływania na składnię obecnego wywołującego?

+3

Tuple rozpakowaniu do wstrzymania ole. –

+4

Zauważ, że funkcja ta na szczęście zniknęła w Pythonie 3. – delnan

Odpowiedz

7

get_year funkcja w swoim przykładzie używa automatycznie rozpakowane parametr krotny (jest to cecha poszedł z Pythonie 3). Aby go wywołać, nadajemy mu pojedynczy parametr, a ten parametr ma być sekwencją zawierającą cztery wartości.

# Invocation 
my_input = [2013, 'a', 'b', 'c'] # sequence does NOT have to be a tuple! 
my_year = get_year(my_input) # returns 2013 

przepisać to dla Pythona 3, ale nie zmienia to wywołanie (innymi słowy, aby nie przerwać istniejący kod, który wywołuje get_year):

def get_year(input_sequence): 
    year, prefix, index, suffix = input_sequence 
    return year 

Powyższe co krotka rozpakowanie robi na zasadzie automatycznie. W tym konkretnym przypadku można po prostu napisać

def get_year(input_sequence): 
    return input_sequence[0] 

Aby uzyskać więcej informacji, przeczytaj PEP 3113.

+0

+1 Perfect Teraz dostałem to, o co pytał OP Wygląda na to, że sam się zmieszałam :(Sorry OP. –

+0

Do tej pory pracowałem tylko nad Pythonem 2.7 Ale teraz myślę, że to naprawdę pora się ruszyć na Python 3.x. :) –

10

Pierwsza funkcja przyjmuje jeden argument krotki, podczas gdy druga funkcja przyjmuje 4 argumenty. Te parametry można przekazać pojedynczo lub jako krotkę z operatorem splat, która rozpakuje krotkę na poszczególne parametry.

Np:

# 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 
+0

Jak przerobisz funkcję rozpakowania krotki, aby nie używać tej funkcji? – WilliamKF

+0

@WilliamKF. Nie rozumiem. Jaka funkcja? Jeśli nie chcesz rozpakowywać tuple, to po prostu przekazuj je jako krotkę, jak w pierwszej funkcji. –

+0

@WilliamKF Aby napisać 'get_year' w postaci' do_format', po prostu usuń te nawiasy. To wszystko. –

1

Są to odpowiednik (rozmówca nie będzie musiał zmienić):

# 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]