পাইথনে, ডিক.পপ (ক, খ) এর অর্থ কী?


92
class a(object):
    data={'a':'aaa','b':'bbb','c':'ccc'}
    def pop(self, key, *args):
            return self.data.pop(key, *args)#what is this mean.

b=a()
print b.pop('a',{'b':'bbb'})
print b.data

self.data.pop(key, *args) ← ------ এখানে দ্বিতীয় যুক্তি কেন?


8
বা আপনি যদি সত্যিই help(b.data.pop)আরপিএলে অলস হন।
মাইকেল মায়ার

উত্তর:


121

popDicts পদ্ধতি (যেমন self.data, অর্থাত্ {'a':'aaa','b':'bbb','c':'ccc'}, এখানে) দুটি আর্গুমেন্ট লাগে - দেখুন ডক্স

দ্বিতীয় যুক্তি,, যদি প্রথম যুক্তি, অনুপস্থিত থাকে তবে defaultতা popফিরে আসে key। (আপনি যদি popকেবল একটি যুক্তি দিয়ে কল করেন key, যদি কীটি অনুপস্থিত থাকে তবে এটি ব্যতিক্রম করে)

আপনার উদাহরণে, print b.pop('a',{'b':'bbb'})এটি অপ্রাসঙ্গিক কারণ 'a' এটি একটি চাবি b.data। তবে আপনি যদি সেই লাইনের পুনরাবৃত্তি করেন ...:

b=a()
print b.pop('a',{'b':'bbb'})
print b.pop('a',{'b':'bbb'})
print b.data

প্রথম: আপনি এটি একটি পার্থক্য তোলে দেখতে পাবেন popঅপসারণ 'a'কী, দ্বিতীয় যাতে যুক্তি আসলে ফিরিয়ে দেওয়া হয় (যেহেতু এখন অনুপস্থিত )।popdefault'a'b.data


4
কেবলমাত্র একটি ছোট্ট মন্তব্য যা আমি মনে করি যে এটি এমন কিছু পরিস্থিতিতে গুরুত্বপূর্ণ যেখানে ব্যবহারকারীর popএকটি উপাদান প্রয়োজন dictতবে পপড উপাদানটির মান বজায় রাখতে পারে। সুতরাং, dict.pop(key)সরিয়ে ফেলা keyযুক্ত একসাথে valueকিন্তু ফেরৎ valueএর keyযে শুধু সরানো হয়েছে। আমি এটি দরকারী বলে মনে করেছি ...
flamenco

@ ফ্ল্যাঙ্কো যা আমি প্রত্যাশা করি pop()- জাভা স্ক্রিপ্ট, পিএইচপি, জাভা এর মতো আরও অনেক ভাষা জুড়ে সাধারণ আচরণ, যদিও সমস্ত ভাষা তা করে না - যেমন সি ++।
jave.web

27

এখানে অনেক প্রশ্ন। আমি কমপক্ষে দুটি দেখতে পাচ্ছি, সম্ভবত তিনটি:

  • পপ (ক, খ) কী করে? / কেন দ্বিতীয় যুক্তি রয়েছে?
  • কি জন্য *argsব্যবহার করা হচ্ছে?

পাইথন স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্সে প্রথম প্রশ্নের তুচ্ছ উত্তর দেওয়া হয়েছে :

পপ (কী [, ডিফল্ট])

যদি অভিধানে কী থাকে তবে এটিকে সরিয়ে ফেলুন এবং এর মানটি ফিরিয়ে দিন, অন্যথায় ডিফল্ট করুন। যদি ডিফল্টটি দেওয়া না হয় এবং কী অভিধানে না থাকে তবে একটি কীআরার উত্থাপিত হবে।


দ্বিতীয় প্রশ্নটি পাইথন ভাষার রেফারেন্সে আচ্ছাদিত :

যদি "* সনাক্তকারী" ফর্মটি উপস্থিত থাকে, এটি খালি টিপলটিকে ডিফল্ট করে কোনও অতিরিক্ত অবস্থানগত পরামিতি গ্রহণকারী টিপল থেকে শুরু করা হয়। যদি "** সনাক্তকারী" ফর্মটি উপস্থিত থাকে তবে এটি কোনও নতুন শূন্য অভিধানে ডিফল্ট হয়ে কোনও অতিরিক্ত কীওয়ার্ড আর্গুমেন্ট গ্রহণ করে নতুন অভিধানে শুরু করা হয়।

অন্য কথায়, popফাংশনটি কমপক্ষে দুটি আর্গুমেন্ট নেয়। প্রথম দুটি নাম নির্ধারিত selfএবং key; এবং বাকী একটি tuple বলা হয় স্টাফ করা হয় args

পরবর্তী লাইনে যা ঘটছে তা *argsকলটিতে পাশ করার সাথে সাথে self.data.popএর বিপরীতটি হয় - টিপলটি *argsঅবস্থানগত পরামিতিগুলিতে প্রসারিত হয় যা বরাবর পাশ হয়। পাইথন ভাষার রেফারেন্সে এটি ব্যাখ্যা করা হয়েছে :

যদি সিনট্যাক্স * এক্সপ্রেশনটি ফাংশন কলে উপস্থিত হয়, এক্সপ্রেশন অবশ্যই একটি ক্রম মূল্যায়ন করতে হবে। এই ক্রমটি থেকে উপাদানগুলি এমনভাবে বিবেচনা করা হয় যেন তারা অতিরিক্ত অবস্থানগত যুক্তি

সংক্ষেপে, a.pop()নমনীয় হতে এবং অবস্থানের পরামিতিগুলির যে কোনও সংখ্যক গ্রহণ করতে চায়, যাতে এটি এই অজানা সংখ্যক অবস্থানের পরামিতিগুলিকে পাস করতে পারে self.data.pop()

এটি আপনাকে নমনীয়তা দেয়; dataএকটি হতে হবে dictএখন, এবং তাই self.data.pop()হয় এক বা দুটি প্যারামিটার নেয়; তবে আপনি যদি dataএমন কোনও রূপে পরিবর্তিত হন যা কল করার জন্য 19 প্যারামিটার নিয়েছিল self.data.pop()তবে আপনাকে কোনও ক্লাস পরিবর্তন করতে হবে না a। আপনাকে এখনও কোনও কোড পরিবর্তন a.pop()করতে হবে যা প্রয়োজনীয় 19 টি প্যারামিটার পাস করার জন্য ডেকেছে ।


4
প্রচেষ্টা জন্য +1। আমি আশঙ্কা করি যে ওপি'র ইংরেজি আপনার উত্তর পড়ার কাজটি শেষ করবে না।
যান্ত্রিক_মেট

আমি লিখেছিলাম যে আমি ওপিএস প্রোফাইলটি পড়ার আগে। আমি এখন বলেছেন প্রোফাইলটি পড়েছি এবং ওপিএসের বেশ কয়েকটি প্রশ্ন দেখেছি। আমি কেবলমাত্র আরেকটি চেষ্টা করেছি, এবার কেবল কোড ব্যবহার করে :)
জেমস পোলি

7
def func(*args): 
    pass

আপনি যখন কোনও ফাংশনটি এভাবে সংজ্ঞায়িত করেন তখন ফাংশনটিতে *argsআর্গুমেন্টের অ্যারে হবে। এটি আপনার ফাংশনটি কত আর্গুমেন্ট এতে পাস হতে চলেছে তা আগে না জেনে কাজ করার অনুমতি দেয়।

আপনি কীওয়ার্ড আর্গুমেন্ট দিয়েও এটি ব্যবহার করে **kwargs:

def func2(**kwargs): 
    pass

দেখুন: স্বেচ্ছাসেবী যুক্তির তালিকাগুলি


আপনার ক্ষেত্রে, আপনি একটি শ্রেণির সংজ্ঞা দিয়েছেন যা অভিধানের মতো কাজ করে acting dict.popপদ্ধতি হিসাবে সংজ্ঞায়িত করা হয় pop(key[, default])

আপনার পদ্ধতিটি defaultপ্যারামিটার ব্যবহার করে না । তবে, আপনার পদ্ধতিটি সংজ্ঞায়িত করে *argsএবং এর সাথে চলে যাওয়ার *argsমাধ্যমে dict.pop()আপনি কলারকে defaultপ্যারামিটারটি ব্যবহার করার অনুমতি দিচ্ছেন ।

অন্য কথায়, আপনার ক্লাসের popপদ্ধতিটি ব্যবহার করতে সক্ষম হওয়া উচিত dict.pop:

my_a = a()
value1 = my_a.pop('key1')       # throw an exception if key1 isn't in the dict
value2 = my_a.pop('key2', None) # return None if key2 isn't in the dict

6
>>> def func(a, *args, **kwargs):
...   print 'a %s, args %s, kwargs %s' % (a, args, kwargs)
... 
>>> func('one', 'two', 'three', four='four', five='five')
a one, args ('two', 'three'), kwargs {'four': 'four', 'five': 'five'}

>>> def anotherfunct(beta, *args):
...   print 'beta %s, args %s' % (beta, args)
... 
>>> def func(a, *args, **kwargs):
...   anotherfunct(a, *args)
... 
>>> func('one', 'two', 'three', four='four', five='five')
beta one, args ('two', 'three')
>>> 

4
আমি আমার অন্যান্য উত্তরে বিস্তারিত হিসাবে কয়েকটি প্রশ্ন পড়েছি। আমি ওপিএস প্রোফাইলটিও পড়েছি এবং বুঝতে পেরেছিলাম যে আমার অন্য উত্তরটি অকেজো। এই উত্তরটি * আরগসগুলি যা করে তার কমপক্ষে একটি অংশটি প্রদর্শন করা উচিত, যা আমি অনুমান করি যে বিষয়টি অপরিহার্য হওয়া সত্ত্বেও আসল বিভ্রান্তি।
জেমস পোলি

@ জেমস, অতিরিক্ত চেষ্টা করার জন্য +1। আমি আসল প্রশ্নটি সম্পর্কে একই সিদ্ধান্তে পৌঁছেছি।
পিটার হানসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.