ट्यूपल्स को तर्कों में विस्तारित करना


411

क्या एक फ़ंक्शन में पायथन टपल को विस्तारित करने का एक तरीका है - वास्तविक मापदंडों के रूप में?

उदाहरण के लिए, यहां expand()जादू है:

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

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

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

मुझे पता है कि एक को परिभाषित myfunकिया जा सकता है myfun((a, b, c)), लेकिन निश्चित रूप से विरासत कोड हो सकता है। धन्यवाद

जवाबों:


733

myfun(*some_tuple)ठीक वही करता है जो आप अनुरोध करते हैं। *ऑपरेटर बस टपल (या किसी भी iterable) unpacks और उन्हें कार्य करने के लिए स्थितीय तर्कों के रूप गुजरता है। अनपैक तर्कों के बारे में और पढ़ें ।


8
* ऑपरेटर बस टपल को अनपैक करता है और फ़ंक्शन को स्थितीय तर्क के रूप में उन्हें पास करता है। यहां देखें: docs.python.org/3/tutorial/…
john_mc

4
ध्यान दें कि समान सिंटैक्स का उपयोग सूचियों के साथ-साथ टुपल्स के लिए भी किया जा सकता है।
ब्रेंडन-एआई

मैंने पाया है कि आप सूचियों के साथ भी ऐसा कर सकते हैं, (वास्तव में, कोई पुनरावृत्ति, जिसमें तार भी शामिल हैं), यह सुनिश्चित नहीं है कि उनकी पारस्परिकता किस तरह की चीजें हैं। यह देखना दिलचस्प होगा।
wcyn

52

ध्यान दें कि आप तर्क सूची के भाग का भी विस्तार कर सकते हैं:

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

13
ऐसा प्रतीत होता है कि आप केवल ऐसा कर सकते हैं यदि विस्तारित टपल सामान्य रूप से प्रदान किए गए तर्कों के बाद है - दुभाषिया को यह पसंद नहीं है जब मैं ऐसा करता हूं:some_func(*tuple_of_stuff, another_argument)
टॉम गैल्विन

6
@Quackmatic का विस्तार किसी भी स्थान पर होने के कारण पायथन 3.5.1 में ठीक काम करता प्रतीत होता है
रिवर

1
: @Quackmatic seconding @River, इस अजगर 3.5.4 में ठीक काम करता है def func(a,b,c,d): print(a,b,c,d)के साथargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
आर Navega

15

पायथन ट्यूटोरियल खंड 4.7.3 और 4.7.4 पर एक नज़र डालें । यह ट्यूपल्स को तर्कों के रूप में पारित करने की बात करता है।

मैं नामांकित मापदंडों का उपयोग करने पर भी विचार करूंगा (और एक शब्दकोश पारित कर रहा हूं) एक टुप्ले का उपयोग करने और एक अनुक्रम पारित करने के बजाय। जब स्थिति सहज नहीं होती है या एक से अधिक पैरामीटर होते हैं, तो मुझे स्थिति-संबंधी तर्कों का उपयोग एक बुरा अभ्यास लगता है।


8

यह कार्यात्मक प्रोग्रामिंग विधि है। यह सिंटैक्स चीनी से टपल विस्तार सुविधा को हटा देता है:

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

उदाहरण उपयोग:

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'

करी रेडिफिनिटॉन लंबे समय में apply_tupleकई partialकॉल बचाता है ।


5
यह एक शुरुआत के लिए सहायक नहीं है। यह थर्ड-पार्टी मॉड्यूल का उपयोग करता है और अन्य भ्रामक सामान करता है ...
14

gberger, lambda f, t: f(*t)तृतीय-पक्ष मॉड्यूल का उपयोग नहीं करता है और मैं एक पायथन शुरुआत करता हूं और यह मेरे लिए मददगार है। यह एक शुद्ध कार्यात्मक दृष्टिकोण है। यदि आप इस शैली का उपयोग नहीं करते हैं तो यह उत्तर आपके लिए नहीं है।
डोमिनीकस मोस्टस्किस

1
toolz थर्ड-पार्टी है, मेरा मतलब है
gberger

5
हर उत्तर एक शुरुआत के लिए नहीं होना चाहिए
जॉर्डन

1
आपके द्वारा दिए गए उदाहरण के लिए, कोई starmap docs.python.org/3.7/library/itertools.html#itertools.starmap
Bo का
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.