পাইথনে ** নাম কী?


59

পাইথন প্রোগ্রামিং **করার সময় আমি কখনও কখনও রূপান্তর করতে একটি করি। আমি বুঝতে পারছি এটি কী করে তবে আমি কোন ডেটা স্ট্রাকচারগুলি হেরফের করছি? এ dictএবং অন্যটি কী? আন array? **অপারেটরের নাম আছে কি ?


3
ঘনিষ্ঠ অপারেটর?
রক

12
এর দুটি অর্থ রয়েছে **। শক্তি এবং "কীওয়ার্ড আর্গুমেন্ট অভিধান"। আপনি কোন বিষয়ে কথা বলছেন? ডকুমেন্টেশনের এই শব্দগুলির মধ্যে রয়েছে: "যদি" ** সনাক্তকারী "ফর্মটি উপস্থিত থাকে তবে এটি কোনও নতুন শূন্য অভিধানে ডিফল্ট হয়ে কোনও অতিরিক্ত কীওয়ার্ড আর্গুমেন্ট গ্রহণ করে একটি নতুন অভিধানে শুরু করা হয়" " এর মধ্যে কোনটি আপনার প্রশ্নের সাথে প্রাসঙ্গিক বলে মনে হচ্ছে?
এস .লট

"কীওয়ার্ড আর্গুমেন্ট অভিধান" হ'ল আমি সেই বিষয়ে জিজ্ঞাসা করছি। মন্তব্যের জন্য আপনাকে ধন্যবাদ।
নিক্লাস রোসক্র্যান্টজ

উত্তর:


86

এটি এর মতো কোনও অপারেটর নয়, সুতরাং এর আসলে কোনও নাম নেই, তবে এটি একটি "সিনট্যাকটিক নিয়ম" হিসাবে সংজ্ঞায়িত হয়েছে । সুতরাং এটি বলা উচিত:

  • "কীওয়ার্ড আর্গুমেন্ট সিনট্যাক্স আনপ্যাক করে"

আপনি আর্গুমেন্ট এর একটি তালিকায় থাকে, তাহলে *args, এটা বলা হচ্ছে "যুক্তি আন-প্যাক" , একই পদ্ধতিতে **kwargsবলা হয় "KEYWORD যুক্তি unpacking"

আপনি একটি বাম দিকে এটা ব্যবহার করেন তাহলে =, হিসাবে a, *middle, end = my_tuple, আপনি বলতে চাই "tuple unpacking"

মোট, তিন ধরণের (একক প্যারামিটার) যুক্তি রয়েছে:

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*argsযুক্তি "পরিবর্তনশীল অবস্থানগত পরামিতি" এবং বলা হয় **kwargs"পরিবর্তনশীল শব্দ পরামিতি" হয়। কেবলমাত্র কীওয়ার্ড-যুক্তি যুক্তিগুলি অবস্থানগতভাবে দেওয়া যায় না, কারণ একটি ভেরিয়েবল পজিশনাল প্যারামিটার আপনার দ্বারা পাস করা সমস্ত আর্গুমেন্ট গ্রহণ করবে।

এর বেশিরভাগটি পিইপি 0362 এবং 3102 , পাশাপাশি ডক্সের নিয়ন্ত্রণ ফ্লো বিভাগে পাওয়া যাবে। এটি লক্ষ করা উচিত যে ফাংশন স্বাক্ষরকারী বস্তু পিইপি কেবল একটি খসড়া, এবং পরিভাষাটি কেবল একজন ব্যক্তির ধারণা হতে পারে। তবে সেগুলি যাইহোক ভাল পদ। :)

সুতরাং *এবং **যুক্তিগুলি কেবল তাদের সম্পর্কিত ডেটা কাঠামো আনপ্যাক করে:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: ইটেটারেবলগুলি হ'ল অবজেক্টগুলি যা __iter__()পদ্ধতি প্রয়োগ করে এবং ম্যাপিংগুলি এমন বস্তু যা বাস্তবায়ন করে keys()এবং __getitem__()। এই প্রোটোকলকে সমর্থন করে এমন কোনও বস্তু নির্মাতারা বুঝতে পারবেন tuple()এবং dict()তাই সেগুলি প্যাকেজটি আনপ্যাক করার জন্য ব্যবহার করা যেতে পারে।


3
অন্য কেউ বিভ্রান্ত হলে, def f(x, *xs, y=0): passপাইথন ২ বৈধ নয় {5,6,7} বাক্য গঠন, এবং def f(x, y=0, *xs):আপনি যা আশা করতে পারেন তা করেন না। আফাইক, (স্পষ্টত) উদ্দেশ্যপ্রাপ্ত প্রভাব অর্জনের একমাত্র উপায় def f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...। পাইথন 3 প্রত্যাশার মতো মূল সিনট্যাক্স পরিচালনা করে।
chbrown

1
আমরা যখন এটিতে begin, *middle, end = (0, 1, 2, 3, 4, 5)রয়েছি: পাইথন ২.x তে বাক্য গঠনও কাজ করে না।
স্টেফানো প্যালাজো

এই উত্তরটি পাইথন 3.5 এবং এর পরেও ভুল। পিইপি -৪৪৮ ** অপারেটরটিকে অভিধান আনপ্যাকিং অপারেটর হিসাবে নির্দিষ্ট করে। দেখুন python.org/dev/peps/pep-0448
devnul3

13

আমি মনে করি না এর কোনও নাম আছে। ইন পাইথন ডক্স অধীনে "আর্গুমেন্ট তালিকাসমূহ আনপ্যাক করা হচ্ছে", এটা শুধু হিসাবে উল্লেখ করা হচ্ছে " **-operator।"

আপনি "অন্যান্য" ডেটা স্ট্রাকচার বলতে কী বোঝাতে চাইছেন তা নিশ্চিত নই। আপনি যখন কী-মান জোড়ার ক্রম হিসাবে f(**kwargs)অভিধানটি আনপ্যাক করেন kwargs। আমি দেখতে পাচ্ছি না যে আরও একটি কাঠামো জড়িত রয়েছে।

আমি উপরের ডকুমেন্টেশনে উদাহরণটি স্বচ্ছতার জন্য অনুলিপি করব ।

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

আরও দেখুন: * আরগস এবং ** কাওয়ারগুলি কী বোঝায়?


পাঠক ব্যাখ্যা করতে পারে এমন বেশ কয়েকটি সম্ভাব্য উপায় রয়েছে f(**kwargs)...
হরিণ হান্টার

3

কোনও নির্দিষ্ট অপারেটরকে কী কল করবেন তা আপনি যদি নিশ্চিত না হন বা এটি নামবিহীন হয় তবে আপনি কী বলতে পারবেন তা নির্ধারণের জন্য আপনি সর্বদা রেফারেন্স হিসাবে ওয়াকা ওয়াকা ব্যাং স্প্ল্যাট অবলম্বন করতে পারেন। এই ক্ষেত্রে **আমি এটি কল করব double-splat, যদিও চিহ্নগুলির জন্য কিছু বিকল্প নাম রয়েছে

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