ফাংশন কল এ তারকাচিহ্ন


111

আমি এই ফ্যাশনটিতে তালিকার একটি তালিকা "সমতল" করতে ব্যবহার করছি er

uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

এটি বলার চেয়ে আলাদা কীভাবে:

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))

8
আরও তথ্যের জন্য পাইথন ডক্সে যুক্তি তালিকাগুলি আনপ্যাক করে দেখুন ।
কাই

8
আপনার **অপারেটরটিও পরীক্ষা করা উচিত - এটি *কীওয়ার্ড আর্গুমেন্টের সাথে একইভাবে কাজ করে ।
শান ভায়েরা

উত্তর:


181

* এটি "স্প্ল্যাট" অপারেটর: এটি ইনপুট হিসাবে একটি তালিকা নেয় এবং এটি ফাংশন কলের আসল অবস্থানগত আর্গুমেন্টগুলিতে প্রসারিত করে।

সুতরাং যদি uniqueCrossTabsছিল [ [ 1, 2 ], [ 3, 4 ] ], তবে itertools.chain(*uniqueCrossTabs)বলার মত একইitertools.chain([ 1, 2 ], [ 3, 4 ])

এটা ন্যায়বিচার মধ্যে পাস থেকে স্পষ্টতই পৃথক uniqueCrossTabs। আপনার ক্ষেত্রে, আপনার তালিকাগুলি চাওয়া তালিকাগুলির একটি তালিকা রয়েছে; আপনি যে itertools.chain()স্থিতিগত আর্গুমেন্টের কাছে এটি পাঠাচ্ছেন তার সংমিশ্রণের উপর একটি পুনরাবৃত্তিকে ফেরত দেয়, যেখানে প্রতিটি অবস্থানগত আর্গুমেন্ট তার নিজস্বভাবে পুনরাবৃত্তিযোগ্য।

অন্য কথায়, আপনি প্রতিটি তালিকাটি uniqueCrossTabsআর্গুমেন্ট হিসাবে পাস করতে চান chain(), যা তাদের একসাথে শৃঙ্খলাবদ্ধ করবে, তবে আপনার পৃথক ভেরিয়েবলের তালিকাগুলি নেই, সুতরাং আপনি *তালিকাগুলির তালিকাকে কয়েকটি তালিকার যুক্তিতে বিস্তৃত করতে অপারেটরটি ব্যবহার করেন ।

জোচেন রিটজেল মন্তব্যগুলিতে chain.from_iterable()যেমন উল্লেখ করেছেন, এই অপারেশনের জন্য এটি আরও উপযুক্ত। আপনার কোডটি তখন সহজ হয়ে যায়:

uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))

9
@ এলারসম্যানস: আমি মনে করি এই শব্দটি রুবি বিশ্বে বেশি জনপ্রিয়, তবে পাইথনের পক্ষে এটি গ্রহণযোগ্য বলে মনে হয় আমিও এটি পছন্দ করি কারণ এটি বলার মজাদার ;-)
ক্যামেরন

1
@ এলারসম্যানস: মজার! আমি সর্বদা ভাবতাম এটি আসল চরিত্রটি নয়, তালিকাকে একটি আর্গুমেন্ট তালিকায় আনপ্যাক করার ক্রিয়াকে বোঝায়।
ক্যামেরন

1
স্ট্রিংগুলি সর্বোত্তম উদাহরণ নয় কারণ প্রত্যেকে স্ট্রিংগুলিকে পুনরাবৃত্ত হিসাবে দেখায় না। বিটিডব্লিউ: পরিবর্তে chain(*it)আমি লিখতে চাই chain.from_iterable(it)
জোচেন রিটজেল

@ জোচেন: আপনি একদম ঠিক বলেছেন, আমি এর পরিবর্তে সংখ্যাগুলি ব্যবহার করতে এটি পরিবর্তন করব। এছাড়াও, আমি from_iterableঅস্তিত্ব জানি না! আমি
ক্যামেরন

1
@ র্যামি: *কেবলমাত্র কোনও ক্রিয়াকলাপের জন্য অবস্থানগত আর্গুমেন্টে তালিকাটি বিস্ফোরণের জন্য (তাই হ্যাঁ, খুব নির্দিষ্ট)। আপনি for l in uniqueCrossTabs:এগুলি পুনরাবৃত্তি করতে পারেন । দুর্ভাগ্যক্রমে *কাজটি দেখা শক্ত কারণ আপনি যখন কোনও ফাংশনে তালিকাটি পাস করছেন কেবল তখনই এটি কাজ করে (প্রথম প্যারামিটার হিসাবে তালিকাটি পাস করার পরিবর্তে তালিকার *প্রতিটি উপাদানকে পৃথক প্যারামিটার হিসাবে একের পর এক পাস করার কারণ হয়) , যেন তারা প্যারামিটার তালিকায় কমা দ্বারা পৃথক টাইপ করে ফেলেছিল)
ক্যামেরন

72

এটি ক্রমটি ফাংশন কলের জন্য পৃথক যুক্তিগুলিতে বিভক্ত করে।

>>> def foo(a, b=None, c=None):
...   print a, b, c
... 
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
...   print a
... 
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)

উদাহরণ সহ সফল ব্যাখ্যা। +1 টি!
অরুণিআরসি

28

ধারণাটি ব্যাখ্যা করার / এটি ব্যবহার করার একটি বিকল্প উপায়।

import random

def arbitrary():
    return [x for x in range(1, random.randint(3,10))]

a, b, *rest = arbitrary()

# a = 1
# b = 2
# rest = [3,4,5]

3
এটি গুরুত্বপূর্ণ এবং অন্য কোথাও উল্লেখ করা হয়নি
গেরশম

1
এই উত্তরটি বিশেষভাবে প্রশ্নের ক্ষেত্রে প্রযোজ্য নয়, তবে তারাটি একটি গুরুত্বপূর্ণ অ্যাপ্লিকেশন (সুতরাং আমি বরং "কুয়াশাচ্ছন্ন" শিরোনামে উপযুক্ত বলে মনে করি)। একই শিরা বরাবর, আরও একটি গুরুত্বপূর্ণ অ্যাপ্লিকেশন ফাংশন সংজ্ঞাতে রয়েছে: আরও তথ্যের জন্য এই উত্তরটিdef func(a, b, *args): দেখুন ।
এএসএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.