Tuples'ı argümanlara genişletmek


411

Gerçek parametreler olarak bir Python grubunu bir işleve genişletmenin bir yolu var mı?

Örneğin expand(), sihir burada :

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

Ben biri myfunolarak tanımlayabilirsiniz biliyorum myfun((a, b, c)), ama tabii ki eski kod olabilir. Teşekkürler

Yanıtlar:


734

myfun(*some_tuple)tam olarak ne istediğini yapar. *Operatör sadece başlığın (ya da herhangi bir iterable) açar ve işleve konumsal bağımsız değişkenler olarak iletir. Bağımsız değişkenleri açma hakkında daha fazla bilgi edinin .


8
* İşleci basitçe paketi açar ve bunları işleve konumsal argümanlar olarak iletir. Daha fazlasını burada görebilirsiniz: docs.python.org/3/tutorial/…
john_mc

4
Aynı sözdiziminin listeler ve gruplar için kullanılabileceğini unutmayın.
brendon-ai

Aynı şeyi listelerle de yapabileceğinizi gördüm (aslında, dizeler de dahil olmak üzere herhangi bir yinelenebilir), bunların değişebilirliklerini nasıl etkilediğinden emin değilim. Bunu incelemek ilginç olurdu.
wcyn

52

Bağımsız değişken listesinin bir bölümünü de genişletebileceğinizi unutmayın:

myfun(1, *("foo", "bar"))

13
Bunu sadece genişletilmiş demet normalde sağlanan argümanlardan sonra ise yapabilirsiniz - yorumlayıcı bunu yaptığımda hoşlanmıyor:some_func(*tuple_of_stuff, another_argument)
Tom Galvin

6
@Quackmatic Python 3.5.1
River

1
@Quackmatic atayan @River, bu Python 3.5.4 yılında cezası çalışır: def func(a,b,c,d): print(a,b,c,d)ileargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
R. Navega

15

Bir göz atın Python öğretici bölüm 4.7.3 ve 4.7.4. Tuple'leri argüman olarak geçirmekten bahsediyor.

Ben de bir tuple kullanarak ve bir dizi geçen yerine adlandırılmış parametreleri (ve bir sözlük geçirerek) kullanmayı düşünün. Pozisyonlar sezgisel olmadığında veya birden fazla parametre olduğunda konumsal argümanların kullanımını kötü bir uygulama olarak görüyorum.


8

Bu fonksiyonel programlama yöntemidir. Tuple genleşme özelliğini sözdizimi şekerinden kaldırır:

apply_tuple = lambda f, t: f(*t)

Örnek kullanım:

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

köri yeniden tanımlamak uzun vadede apply_tuplebirçok partialçağrı kaydeder .


5
Bu yeni başlayanlar için yararlı değildir. Üçüncü taraf modülleri kullanır ve diğer kafa karıştırıcı şeyler yapar ...
gberger

gberger, lambda f, t: f(*t)üçüncü taraf modülleri kullanmıyor ve ben bir Python acemiyim ve bu bana yardımcı oluyor. Bu saf işlevsel bir yaklaşımdır. Bu stili kullanmazsanız, bu cevap sizin için değildir.
Dominykas Mostauskis

1
toolz üçüncü taraf, demek istediğim bu
gberger

5
Her cevap yeni başlayanlar için değil
Ürdün

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.