python pycharm - একটি dict আক্ষরিক এবং একটি dict constructor ব্যবহার মধ্যে একটি পার্থক্য আছে?




download (9)

এই দুইটি পন্থাগুলি একই রকম অভিধান তৈরি করে, যেমনটি আপনি উল্লেখ করেছেন, যেখানে পাইথন এর লিকিক্যাল নিয়মগুলি হস্তক্ষেপ করে।

অভিধান লিখনগুলি একটু বেশি স্পষ্টভাবে অভিধানগুলি, এবং আপনি কোনও কী তৈরি করতে পারেন তবে আপনাকে কী নামগুলি উদ্ধৃত করতে হবে। অন্যদিকে, যদি কিছু কারণে আপনার প্রয়োজন হয় তবে আপনি কীগুলির জন্য ভেরিয়েবল ব্যবহার করতে পারেন:

a = "hello"
d = {
    a: 'hi'
    }

dict() কনস্ট্রাক্টর আপনাকে বিভিন্ন ধরণের ইনপুটগুলির কারণে আরও বেশি নমনীয়তা দেয়। উদাহরণস্বরূপ, আপনি এটি জোড়াগুলির একটি ইটারারেটর সরবরাহ করতে পারেন এবং এটি তাদের কী / মান জোড়া হিসাবে গণ্য করবে।

পাইচার্ম এক ফর্মকে অন্য রূপে রূপান্তর করার প্রস্তাব দিচ্ছে কেননা আমার কোন ধারণা নেই।

PyCharm ব্যবহার করে, আমি লক্ষ্য এটি একটি আক্ষরিক আক্ষরিক রূপান্তর প্রস্তাব:

d = {
    'one': '1',
    'two': '2',
}

একটি dict কন্সট্রাকটর মধ্যে :

d = dict(one='1', two='2')

এই বিভিন্ন পদ্ধতির কিছু উল্লেখযোগ্য ভাবে ভিন্ন?

(এই প্রশ্নটি লেখার সময় আমি লক্ষ্য করলাম যে dict() ব্যবহার করে একটি সংখ্যাসূচক কী উল্লেখ করা অসম্ভব বলে মনে হচ্ছে। d = {1: 'one', 2: 'two'} সম্ভব, কিন্তু সম্ভবত, dict(1='one' ...) না অন্য কিছু?)


তারা পাইথন 3.2 তে বেশিরভাগ একই রকম দেখাচ্ছে।

যেমন গিনব্ললার নির্দেশ করেছেন, প্রথমটিকে স্বাক্ষর দেখার দরকার নেই, যা এটিটিকে আরও দ্রুততর করে তুলবে।

>>> def literal():
...   d = {'one': 1, 'two': 2}
...
>>> def constructor():
...   d = dict(one='1', two='2')
...
>>> import dis
>>> dis.dis(literal)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('one')
              9 STORE_MAP
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('two')
             16 STORE_MAP
             17 STORE_FAST               0 (d)
             20 LOAD_CONST               0 (None)
             23 RETURN_VALUE
>>> dis.dis(constructor)
  2           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_CONST               1 ('one')
              6 LOAD_CONST               2 ('1')
              9 LOAD_CONST               3 ('two')
             12 LOAD_CONST               4 ('2')
             15 CALL_FUNCTION          512
             18 STORE_FAST               0 (d)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE

dict () শব্দটি চমৎকার, যখন আপনি অন্য কিছু থেকে (অন্য কোন পাইথন) মূল্যগুলি অনুলিপি করতে পারেন উদাহরণস্বরূপ, পরিবেশের পরিবর্তনগুলির একটি তালিকা। যদি আপনি একটি bash ফাইল ছিল, বলুন

FOO='bar'
CABBAGE='good'

আপনি সহজেই একটি dict() আক্ষরিক মধ্যে পেস্ট এবং মন্তব্য যোগ করতে পারেন। এটি বিপরীত করতে সহজ করে তোলে, অন্য কিছুতে অনুলিপি করে। যেখানে {'FOO': 'bar'} সিনট্যাক্সটি পাইথন এবং জসনের জন্য অত্যন্ত অনন্য। সুতরাং যদি আপনি জসনকে অনেক ব্যবহার করেন তবে আপনি ডাবল কোট সহ {} লিটারাল ব্যবহার করতে পারেন।


এছাড়াও এটি বিবেচনা করুন যে অপারেটরগুলির সাথে মেলে এমন টোকেনগুলি কন্সট্রাকটর সিনট্যাক্স, অর্থাৎ ড্যাশেরাইজড কীগুলিতে ব্যবহার করা যাবে না।

>>> dict(foo-bar=1)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression

>>> {'foo-bar': 1}
{'foo-bar': 1}

পাইথন থেকে 2.7 টিউটোরিয়াল:

ব্রেসির একটি জোড়া একটি খালি অভিধান তৈরি করে: {}। একটি কমা দ্বারা বিভাজিত কী তালিকা: ধনুর্বন্ধনীগুলির মধ্যে মান জোড়াগুলি প্রাথমিক কী যোগ করে: অভিধানে মান জোড়াগুলি; এই আউটপুট উপর লেখা হয় উপায় উপায়।

tel = {'jack': 4098, 'sape': 4139}
data = {k:v for k,v in zip(xrange(10), xrange(10,20))}

যদিও:

Dict () কন্সট্রাক্টর tuples হিসাবে সংরক্ষিত কী-মান জোড়াগুলির তালিকা থেকে সরাসরি অভিধান তৈরি করে। যখন জোড়া একটি প্যাটার্ন গঠন করে, তালিকা বোঝার কম্প্যাক্টভাবে কী-মান তালিকা নির্দিষ্ট করতে পারে।

tel = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'jack': 4098, 'guido': 4127}
data = dict((k,v) for k,v in zip(xrange(10), xrange(10,20)))

যখন কীগুলি সহজ স্ট্রিং হয় তখন কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করে জোড়া নির্দিষ্ট করা সহজ হয়:

dict(sape=4139, guido=4127, jack=4098)
>>>  {'sape': 4139, 'jack':4098, 'guido': 4127}

তাই উভয় {} এবং dict () শব্দ অভিধান তৈরি করে তবে অভিধান ডেটা প্রারম্ভিকতার কিছুটা ভিন্ন উপায় সরবরাহ করে।


স্বতন্ত্র উত্তরাধিকারী ক্লাস, অতিরিক্ত পদ্ধতির সাথে কাস্টম ডিস্ট্রিক ক্লাসগুলি তৈরি করার কোন আক্ষরিক আক্ষরিক নেই। যেমন ক্ষেত্রে কাস্টম টেক ক্লাস কন্সট্রাকটর ব্যবহার করা উচিত, উদাহরণস্বরূপ:

class NestedDict(dict):

    # ... skipped

state_type_map = NestedDict(**{
    'owns': 'Another',
    'uses': 'Another',
})

সাহিত্য অনেক দ্রুত, এটি জেনারেটিক CALL_FUNCTION এর পরিবর্তে অপ্টিমাইজ করা BUILD_MAP এবং STORE_MAP অপপড ব্যবহার করে:

> python2.7 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.958 usec per loop

> python2.7 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.479 usec per loop

> python3.2 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.975 usec per loop

> python3.2 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.409 usec per loop

আমি আপনি সবচেয়ে সুস্পষ্ট পার্থক্য নির্দিষ্ট করেছেন। সেটা থেকে পৃথক,

প্রথমটি একটি স্বল্প বিট দ্রুততর করা উচিত যা dict করার প্রয়োজন হয় না

দ্বিতীয়টি locals() এবং তারপরে globals() এবং globals() খুঁজে পাওয়া যায়, তাই আপনি স্থানীয় বলা dict সংজ্ঞায়িত করে আচরণটি স্যুইচ করতে পারেন, উদাহরণস্বরূপ উদাহরণস্বরূপ যদিও আমি কোথাও ভাবতে পারছি না এটি একটি ভাল ধারণা ছাড়া সম্ভবত ডিবাগ করার সময়


কেন isinstance type চেয়ে ভাল হয়:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

এই ক্ষেত্রে, একটি ট্রাক বস্তু একটি যানবাহন, তবে আপনি এটি পাবেন:

isinstance(Vehicle(), Vehicle)  # returns True
type(Vehicle()) == Vehicle      # returns True
isinstance(Truck(), Vehicle)    # returns True
type(Truck()) == Vehicle        # returns False, and this probably won't be what you want.

অন্য কথায়, isinstance subclasses জন্য খুব সত্য।

এছাড়াও দেখুন: কিভাবে Python একটি বস্তুর ধরন তুলনা?





python pycharm