তর্কগুলি তর্কগুলিতে প্রসারিত করা হচ্ছে


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)আপনি অনুরোধ ঠিক কি করে। *অপারেটর কেবল tuple (অথবা কোন iterable) unpacks এবং তাদের ফাংশন অবস্থানগত আর্গুমেন্ট হিসাবে প্রেরণ করা হয়। যুক্তিগুলি আনপ্যাক করার বিষয়ে আরও পড়ুন ।


8
* অপারেটর কেবল টিপলটিকে আনপ্যাক করে ফাংশনে অবস্থানিক আর্গুমেন্ট হিসাবে তাদের পাস করে। এখানে আরও দেখুন: ডকস.পিথন.আর / 3
টিউটোরিয়াল

4
নোট করুন যে একই সিনট্যাক্সটি তালিকাগুলির পাশাপাশি তালিকার জন্যও ব্যবহার করা যেতে পারে।
ব্রেন্ডন-এআই

আমি খুঁজে পেয়েছি যে তালিকার সাহায্যে আপনি একই কাজ করতে পারেন, (আসলে, স্ট্রিং সহ কোনও পুনরাবৃত্ত), নিশ্চিত নয় যে কীভাবে তাদের পরিবর্তনগুলি জিনিসগুলিকে প্রভাবিত করে। এটি সন্ধান করা আকর্ষণীয় হবে।
wcyn

52

নোট করুন যে আপনি যুক্তি তালিকার অংশটিও প্রসারিত করতে পারেন:

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

13
দেখা যাচ্ছে আপনি কেবল তখনই এটি করতে পারেন যদি প্রসারিত টিপলটি সাধারণত সরবরাহিত যুক্তির পরে হয় - দোভাষক এটি পছন্দ করেন না যখন আমি এটি করি:some_func(*tuple_of_stuff, another_argument)
টম গ্যালভিন

6
@ কৌম্যাটিক যে কোনও স্থানে প্রসারিত দ্বৈত কাজ পাইথন 3.5.5.1
নদীতে

1
@ কৌম্যাটিক সেকেন্ডিং @ রিভার, এটি পাইথনে ৩.৪.৪ এ দুর্দান্ত কাজ করেছে: এর def func(a,b,c,d): print(a,b,c,d)সাথেargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
আর নাভেগা

15

কটাক্ষপাত পাইথন টিউটোরিয়াল অধ্যায় 4.7.3 এবং 4.7.4। এটি আর্গুমেন্ট হিসাবে tuples পাস সম্পর্কে কথা বলে।

আমি টিউপল ব্যবহার না করে সিকোয়েন্স পাস করার পরিবর্তে নামকরণকৃত প্যারামিটারগুলি (এবং একটি অভিধান পাস করা) ব্যবহার করার বিষয়েও বিবেচনা করব। পজিশনগুলি স্বজ্ঞাত না হলে বা একাধিক পরামিতি থাকা অবস্থায় আমি অবস্থানগত যুক্তিগুলির ব্যবহারকে একটি খারাপ অনুশীলন বলে মনে করি।


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
এটি কোনও শিক্ষানবিশকে সহায়ক নয়। এটি তৃতীয় পক্ষের মডিউলগুলি ব্যবহার করে এবং অন্যান্য বিভ্রান্তিকর জিনিসগুলি করে ...
গবার্গার

গ্যাবার্গার, lambda f, t: f(*t)তৃতীয় পক্ষের মডিউলগুলি ব্যবহার করে না এবং আমি পাইথন প্রারম্ভিক এবং এটি আমার পক্ষে সহায়ক। এটি একটি খাঁটি কার্যকরী পদ্ধতির। আপনি যদি এই স্টাইলটি ব্যবহার না করেন তবে এই উত্তরটি আপনার পক্ষে নয়।
ডোমিনিকাস মোস্তাউসকিস

1
টুলজটি তৃতীয় পক্ষের, আমি যা বোঝাতে
চাইছি

5
প্রতিটি উত্তরই কোনও শিক্ষানবিসের পক্ষে হওয়া উচিত নয়
জর্দান

1
আপনি যে উদাহরণটি দিয়েছেন তার জন্য, starmap ডকস.পিথথন.আর
./ /
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.