পুনরাবৃত্তি, পুনরাবৃত্তিযোগ্য এবং পুনরাবৃত্তি ঠিক কী?


442

পাইথনে "পুনরাবৃত্ত", "পুনরাবৃত্তি" এবং "পুনরাবৃত্তি" এর সর্বাধিক প্রাথমিক সংজ্ঞাটি কী?

আমি একাধিক সংজ্ঞা পড়েছি কিন্তু সঠিক অর্থটি সনাক্ত করতে পারছি না কারণ এটি এখনও ডুবে না।

সাধারণ কেউ পদে 3 সংজ্ঞা দিয়ে আমাকে সাহায্য করতে পারেন?

উত্তর:


530

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

পাইথন সালে iterable এবং পুনরুক্তিকারীর নির্দিষ্ট অর্থ আছে।

একটি iterable একটি বস্তু একটি রয়েছে __iter__পদ্ধতি যা একটি ফেরৎ পুনরুক্তিকারীর , অথবা যা সংজ্ঞায়িত __getitem__পদ্ধতি যা অনুক্রমিক ইনডেক্স শূন্য থেকে শুরু নিতে পারেন (এবং একটি উত্থাপন IndexErrorযখন ইনডেক্স আর কার্যকর নয় সেগুলি)। একটি সুতরাং iterable একটি বস্তু যে আপনি একটি পেতে পারেন পুনরুক্তিকারীর থেকে।

একটি পুনরাবৃত্তি একটি next(পাইথন 2) বা __next__(পাইথন 3) পদ্ধতিযুক্ত একটি বস্তু ।

যখনই আপনি ব্যবহার forলুপ, অথবা map, অথবা একটি তালিকা ধী, ইত্যাদি পাইথন এ, nextপদ্ধতি স্বয়ংক্রিয়ভাবে বলা হয় থেকে প্রতিটি আইটেমের পেতে পুনরুক্তিকারীর , এইভাবে প্রক্রিয়া মাধ্যমে চালু পুনরাবৃত্তির

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


1
নোট করুন যে collections.abc.AsyncIteratorপরীক্ষা __aiter__এবং __anext__পদ্ধতি জন্য। এটি 3.6 এ একটি নতুন সংযোজন।
জানুস ট্রয়লসেন

1
@jlh কেন __len__পুনরাবৃত্তির সাথে আবশ্যকভাবে আবদ্ধ থাকবেন ? কীভাবে কোনও কিছুর দৈর্ঘ্য জানলে আপনি এটির পুনরাবৃত্তি করতে সহায়তা করবেন?
ছায়াছবির

2
@ শ্যাডোওয়াল্টার এটি জানতে সাহায্য করবে যে কোন সূচকগুলি বৈধ। তাই আপনি কীভাবে সূচকগুলি ব্যবহার করতে পারবেন তা জানেন __getitem__
jlh

4
@ জেএলএইচটি শুনে মনে হচ্ছে আপনি খুব মতামতযুক্ত আচরণের প্রস্তাব দিচ্ছেন। {'a': 'hi', 'b': 'bye'}এর দৈর্ঘ্য 2
হ'ল

2
@shadowtalker। তবে একটি ডিকের একটি __iter__পদ্ধতি আছে। আমি মনে করি যে জেএলএইচ নির্দিষ্টভাবে পুনরাবৃত্তিযোগ্য এমন বস্তুর উল্লেখ করছে কারণ তারা নির্ধারণ করে: "এমন একটি __getitem__পদ্ধতি যা শূন্য থেকে শুরু করে অনুক্রমিক সূচকগুলি নিতে পারে"।
ধনী

337

পাইথন ক্লাস শেখানোর ক্ষেত্রে আমি এখানে ব্যাখ্যাটি ব্যবহার করি:

একটি অপরিহার্য হ'ল:

  • লুপ করা যায় এমন যে কোনও কিছু (যেমন আপনি একটি স্ট্রিং বা ফাইলের উপর লুপ করতে পারেন) বা
  • একটি লুপের ডান দিকে প্রদর্শিত হতে পারে এমন কিছু: for x in iterable: ...বা
  • এর সাথে আপনি iter()যে কোনও কল করতে পারেন কোনও আইট্রেটর ফিরিয়ে দেবে: iter(obj)বা
  • এমন একটি বস্তু যা সংশোধন করে __iter__যে একটি তাজা আইটিরিওরটি দেয় বা এটির সূচকযুক্ত __getitem__অনুসন্ধানের জন্য উপযুক্ত কোনও পদ্ধতি থাকতে পারে ।

একজন আইটিইটিউটার হ'ল একটি বস্তু:

  • রাষ্ট্রের সাথে মনে আছে যে এটি পুনরাবৃত্তির সময় কোথায় রয়েছে,
  • একটি __next__পদ্ধতিতে যে:
    • পুনরাবৃত্তির পরবর্তী মানটি প্রদান করে
    • পরবর্তী মানের দিকে নির্দেশ করতে রাষ্ট্র আপডেট করে
    • এটি উত্থাপন দ্বারা সম্পন্ন করা হয় যখন সংকেত StopIteration
  • এবং এটি স্ব-পুনরাবৃত্তিযোগ্য (এর অর্থ এটির __iter__যে পদ্ধতিটি ফিরে আসে self)।

মন্তব্য:

  • __next__পাইথন 3 পদ্ধতি বানান করা হয় nextপাইথন 2, এবং
  • বিল্টিন ফাংশন next()সেই পদ্ধতিটিকে কল করে দেওয়া বস্তুটিতে কল করে।

উদাহরণ স্বরূপ:

>>> s = 'cat'      # s is an ITERABLE
                   # s is a str object that is immutable
                   # s has no state
                   # s has a __getitem__() method 

>>> t = iter(s)    # t is an ITERATOR
                   # t has state (it starts by pointing at the "c"
                   # t has a next() method and an __iter__() method

>>> next(t)        # the next() function returns the next value and advances the state
'c'
>>> next(t)        # the next() function returns the next value and advances
'a'
>>> next(t)        # the next() function returns the next value and advances
't'
>>> next(t)        # next() raises StopIteration to signal that iteration is complete
Traceback (most recent call last):
...
StopIteration

>>> iter(t) is t   # the iterator is self-iterable

আপনি তাজা পুনরাবৃত্তি বলতে কি বোঝাতে চান?
lmiguelvargasf

13
"ক্লান্ত বা আংশিকভাবে গ্রাস করা" এর বিপরীতে @ নতুনজিগুয়েভার্গসফ "নতুন" এবং "অপ্রকাশিত" হিসাবে "টাটকা"। ধারণাটি হ'ল নতুন আইট্রেটার শুরুতে শুরু হয়, যখন একটি আংশিকভাবে ব্যবহৃত পুনরুক্তিটি যেখানে ছেড়ে গিয়েছিল সেখানে নিয়ে যায়।
রেমন্ড হেটেঙ্গার

আপনার ২ য়, তৃতীয়, এবং চতুর্থ বুলেটগুলি নির্দিষ্ট পাইথন নির্মাণ বা বিল্ট-ইন বা পদ্ধতি কলগুলির ক্ষেত্রে আপনার অর্থ কী তা স্পষ্টভাবে নির্দেশ করে। তবে 1 ম বুলেটের ("যে কোনও কিছুতেই লুপ করা যায়") এর স্পষ্টতা নেই। এছাড়াও, প্রথম বুলেটটি দ্বিতীয় বুলেটটির সাথে একটি ওভারল্যাপ রয়েছে বলে মনে হয়, যেহেতু ২ য় বুলেট প্রায় forলুপগুলি সম্পর্কে , এবং 1 ম বুলেটটি "লুপিং ওভার" সম্পর্কে। আপনি কি দয়া করে এগুলি সম্বোধন করতে পারেন?
ফাউন্টেনহেড

2
অনুগ্রহ করে "আপনি যে কোনও কিছুতে iter()" আপনি যেতে পারেন "এর সাথে " কল করতে পারেন এমন কোনও কিছু iter()"
ফাউন্টেনহেড

98

উপরের উত্তরগুলি দুর্দান্ত, তবে আমি যা দেখেছি তার বেশিরভাগ হিসাবে আমার মতো লোকের পক্ষে যথেষ্ট পার্থক্যকে চাপ দেবেন না।

এছাড়াও, "X একটি __foo__()পদ্ধতি যা পদ্ধতিতে আছে" এর মতো সংজ্ঞা রেখে "খুব পাইথোনিক" পাওয়ার প্রবণতা লোকেদের থাকে । এই জাতীয় সংজ্ঞাগুলি সঠিক - এগুলি হাঁসের-টাইপিং দর্শনের উপর ভিত্তি করে, তবে ধারণাগুলিটিকে তার সরলতার সাথে বোঝার চেষ্টা করার সময় পদ্ধতির উপর দৃষ্টি নিবদ্ধ করা হয়।

সুতরাং আমি আমার সংস্করণ যোগ করুন।


প্রাকৃতিক ভাষায়,

  • পুনরাবৃত্তি হ'ল উপাদানগুলির এক সারিতে একবারে একটি উপাদান গ্রহণ করার প্রক্রিয়া।

পাইথনে,

  • পুনরাবৃত্তিযোগ্য এমন একটি বস্তু যা ভাল, পুনরাবৃত্তিযোগ্য, যা সহজভাবে বলা হয়, এর অর্থ এটি পুনরাবৃত্তিতে যেমন forলুপের সাহায্যে ব্যবহার করা যায় । কিভাবে? পুনরুক্তি ব্যবহার করে । আমি নীচে ব্যাখ্যা করব।

  • ... যখন পুনরুক্তিকারীর একটি বস্তু সংজ্ঞায়িত যে কিভাবে আসলে কি পুনরাবৃত্তির - বিশেষভাবে পরবর্তী কি উপাদান। এজন্য এর অবশ্যই next()পদ্ধতি থাকতে হবে ।

Iterators নিজেদের এছাড়াও iterable, পার্থক্য যে তাদের সঙ্গে আছে __iter__()পদ্ধতি ফেরৎ একই বস্তু ( self), হোক বা না হোক তার আইটেম পূর্ববর্তী কল খায় হয়েছে নির্বিশেষে next()


সুতরাং পাইথন দোভাষী যখন এটি for x in obj:বিবৃতি দেখেন তখন কী মনে করেন ?

দেখুন, একটি forলুপ। একটি পুনরাবৃত্তিকারীর জন্য কাজের মতো দেখে মনে হচ্ছে ... আসুন একটি পাই। ... এই আছেobj লোকটি আছে, সুতরাং তাকে জিজ্ঞাসা করুন।

"মিঃ obj, আপনার কি আপনার পুনরাবৃত্তি আছে?" (... কলগুলি iter(obj), যা কল করে obj.__iter__(), যা আনন্দের সাথে একটি চকচকে নতুন পুনরুক্তি প্রদান করে _i))

ঠিক আছে, এটা সহজ ছিল ... এর পরে পুনরাবৃত্তি শুরু করা যাক। ( x = _i.next()... x = _i.next()...)

মিঃ যেহেতু objএই পরীক্ষায় সাফল্য পেয়েছেন (কোনও বৈধ পুনরাবৃত্তকারীকে ফিরিয়ে দেওয়ার নির্দিষ্ট পদ্ধতি দ্বারা), আমরা তাকে বিশেষণ দিয়ে পুরস্কৃত করি: আপনি এখন তাকে "পুনরাবৃত্ত মিঃ obj" বলতে পারেন।

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

এ কারণেই বেশিরভাগ উদাহরণগুলিতে আমি দেখেছি (এবং যা আমাকে বার বার বিভ্রান্ত করে তুলেছিল), আপনি দেখতে পারেন:

class IterableExample(object):

    def __iter__(self):
        return self

    def next(self):
        pass

পরিবর্তে

class Iterator(object):
    def next(self):
        pass

class Iterable(object):
    def __iter__(self):
        return Iterator()

যদিও এমন কিছু ক্ষেত্রে রয়েছে যখন আপনি পুনরাবৃত্তকারী থেকে পৃথক পৃথকীকরণের মাধ্যমে উপকার করতে পারেন, যেমন আপনি যখন এক সারি আইটেম রাখতে চান তবে আরও "কার্সার" থাকে। উদাহরণস্বরূপ আপনি যখন "বর্তমান" এবং "আগত" উপাদানগুলির সাথে কাজ করতে চান, আপনার উভয়ের জন্য পৃথক পুনরাবৃত্তি থাকতে পারে। বা একটি বিশাল তালিকা থেকে টানা একাধিক থ্রেড: সমস্ত আইটেমের উপর দিয়ে যাওয়ার জন্য প্রত্যেকের নিজস্ব ইউটরেটর থাকতে পারে। দেখুন রেমন্ড এর @ এবং @ glglgl এর উপরে উত্তর।

আপনি কী করতে পারেন তা কল্পনা করুন:

class SmartIterableExample(object):

    def create_iterator(self):
        # An amazingly powerful yet simple way to create arbitrary
        # iterator, utilizing object state (or not, if you are fan
        # of functional), magic and nuclear waste--no kittens hurt.
        pass    # don't forget to add the next() method

    def __iter__(self):
        return self.create_iterator()

মন্তব্য:

  • আমি আবার পুনরাবৃত্তি করব: পুনরাবৃত্তি পুনরাবৃত্তিযোগ্য নয় । লুপগুলিতে ইলেটরটিকে "উত্স" হিসাবে ব্যবহার করা যায় না for। কি forলুপ প্রাথমিকভাবে প্রয়োজন __iter__() (সঙ্গে যে আয় কিছু next())।

  • অবশ্যই, forকেবলমাত্র পুনরাবৃত্তির লুপ নয়, সুতরাং উপরের কিছু অন্যান্য কন্সট্রাক্টসের ক্ষেত্রেও প্রযোজ্য ( while...)।

  • ইটারেটরগুলি next()পুনরাবৃত্তি থামাতে স্টপআইটারেশন ছুড়ে দিতে পারে। এটি করার দরকার নেই, যদিও এটি চিরতরে পুনরাবৃত্তি করতে পারে বা অন্য উপায়গুলি ব্যবহার করতে পারে।

  • উপরের "চিন্তার প্রক্রিয়া" তে _iআসলে উপস্থিত নেই really আমি নামটি তৈরি করেছি।

  • পাইথন ৩.x এর একটি ছোট পরিবর্তন আছে: next()পদ্ধতি (বিল্ট-ইন নয়) এখনই ডাকতে হবে __next__()। হ্যাঁ, এটি পাশাপাশি হওয়া উচিত ছিল।

  • আপনি এটি এর মতোও ভাবতে পারেন: পুনরাবৃত্তকারীগুলির ডেটা থাকে, পুনরাবৃত্তকারী পরবর্তী আইটেমটি টান দেয়

দাবি অস্বীকার: আমি কোনও পাইথন ইন্টারপ্রেটারের বিকাশকারী নই, তাই অনুবাদক "কী ভাবেন" আসলে আমি জানি না। উপরের চিত্রগুলি কেবলমাত্র পাইথনের নবাগত ব্যক্তির অন্যান্য ব্যাখ্যা, পরীক্ষা-নিরীক্ষা এবং বাস্তব জীবনের অভিজ্ঞতা থেকে আমি বিষয়টি কীভাবে বুঝতে পারি তার একমাত্র প্রদর্শন ration


1
এটি দুর্দান্ত - তবে আমি এখনও কিছুটা বিভ্রান্ত। আমি ভেবেছিলাম আপনার হলুদ বাক্সটি বলছিল যে একটি forলুপের জন্য একটি পুনরুক্তি প্রয়োজন ("দেখুন, লুপের জন্য একটি ite তবে তারপরে আপনি নোটগুলিতে শেষে বলবেন যে "ইল্ট্রেটারকে কোনও forলুপের উত্স হিসাবে ব্যবহার করা যায় না " ...?
রেডিং ট্যাডপোল

আপনি কেন passএই nextসংজ্ঞাগুলির কোডে রেখেছেন ? আমি ধরে নিচ্ছি আপনি ঠিক বোঝাতে চাইছেন যে কাউকে পরেরটি পাওয়ার একটি উপায় বাস্তবায়ন করতে হবে, যেহেতু পরের দিকে কিছু ফিরিয়ে দিতে হবে।
nealmcb

হ্যাঁ, আমি মনে করি এটি আমার অতীত বলতে চাইছিল past (এটি সর্বোপরি, passএটি ))
অ্যালোস মাহদল

@ অলিসমহদল আহ, আমি আগে এই ব্যবহারটি দেখিনি। আমি যখন দেখি pass, তখন মনে হয় সিনট্যাকটিক কারণে এটি রয়েছে। আমি মাত্র উপবৃত্তাকার অবজেক্টের উত্তরগুলি জুড়ে ছুটে এসেছি যা বেশ আকর্ষণীয়: আপনি ...একটি "টুডো পরে" ব্লক নির্দেশ করতে ব্যবহার করতে পারেন । NotImplementedপাওয়া যায়।
nealmcb

আমি যখন চাই যে আপনি একটি পুনরাবৃত্তকারী এবং একটি পুনরাবৃত্তযোগ্য মধ্যে পার্থক্য জোর দেওয়া হয়, এই উত্তর নিজেই বিপরীতে। প্রথমে আপনি লিখবেন, 'আইট্রেটাররাও তারা নিজেরাই পুনরাবৃত্তিযোগ্য', (যা পাইথন ডকুমেন্টেশনে লিখিত আছে তার সাথে মেলে )। তবে তারপরে আপনি লিখে: ' পুনরুক্তি পুনরাবৃত্ত হয় নাforলুপে "উত্স" হিসাবে ইট্রেটর ব্যবহার করা যায় না । আমি আপনার উত্তরটির পয়েন্ট পেয়েছি এবং অন্যথায় এটি পছন্দ করি তবে আমি মনে করি এটি ঠিক করার মাধ্যমে এটি উপকৃত হবে।
ধনী

22

একটি পুনরাবৃত্তযোগ্য একটি অবজেক্ট যা একটি __iter__()পদ্ধতি আছে। এটি সম্ভবত list()এস এবং tuple()এস এর মতো বেশ কয়েকবার পুনরাবৃত্তি হতে পারে ।

একটি পুনরাবৃত্তি হ'ল বস্তু যা পুনরাবৃত্তি হয়। এটি কোনও __iter__()পদ্ধতি দ্বারা ফিরে আসে, নিজস্ব __iter__()পদ্ধতির মাধ্যমে নিজেই ফিরে আসে এবং একটি next()পদ্ধতি রয়েছে ( __next__()3.x এ)।

Iteration এই next()শ্রদ্ধা কল করার প্রক্রিয়া । __next__()যতক্ষণ না এটি উত্থাপিত হয় StopIteration

উদাহরণ:

>>> a = [1, 2, 3] # iterable
>>> b1 = iter(a) # iterator 1
>>> b2 = iter(a) # iterator 2, independent of b1
>>> next(b1)
1
>>> next(b1)
2
>>> next(b2) # start over, as it is the first call to b2
1
>>> next(b1)
3
>>> next(b1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> b1 = iter(a) # new one, start over
>>> next(b1)
1

সুতরাং সত্যিই এটি ঠিক একটি বস্তু যা কন্টেইনারগুলির মধ্য দিয়ে যায়? এই কি দরকারী হবে?
ঠাক্রিশাদাদ

প্রায়শই, তবে সবসময় না। একটি জেনারেটর, ফাইল বা ডাটাবেস কার্সার কেবল একবার পুনরাবৃত্তি করা যেতে পারে এবং এইভাবে তাদের নিজস্ব পুনরাবৃত্ত হয়।
glglgl

আমার ধারণা বি বি 2 এর বি-ই আলাদা করতে হবে না? এই বিশেষ ক্ষেত্রে, এটি স্বাধীন, নিশ্চিত যে আমি এটিকে স্বতন্ত্র নয় বরং বৈধও বানাতে পারি Iterable
বিন

@ বিন হাঁ হিসাবে এবং Iteratorসর্বদা Iterableএবং এর নিজস্ব হিসাবে Iterator, দুটি কল iter()অগত্যা দুটি স্বতন্ত্র Iteratorএস দেয় না।
glglgl

13

এখানে আমার ঠকানো শীট:

 sequence
  +
  |
  v
   def __getitem__(self, index: int):
  +    ...
  |    raise IndexError
  |
  |
  |              def __iter__(self):
  |             +     ...
  |             |     return <iterator>
  |             |
  |             |
  +--> or <-----+        def __next__(self):
       +        |       +    ...
       |        |       |    raise StopIteration
       v        |       |
    iterable    |       |
           +    |       |
           |    |       v
           |    +----> and +-------> iterator
           |                               ^
           v                               |
   iter(<iterable>) +----------------------+
                                           |
   def generator():                        |
  +    yield 1                             |
  |                 generator_expression +-+
  |                                        |
  +-> generator() +-> generator_iterator +-+

কুইজ: আপনি কি দেখছেন ...

  1. প্রতিটি পুনরুক্তি একটি পুনরাবৃত্তিযোগ্য?
  2. একটি ধারক বস্তুর __iter__() পদ্ধতি একটি জেনারেটর হিসাবে প্রয়োগ করা যেতে পারে?
  3. একটি পুনরাবৃত্তির একটি __next__পদ্ধতি রয়েছে যে একটি পুনরুক্তি করা আবশ্যক?

উত্তর:

  1. প্রতিটি পুনরুক্তকারী একটি __iter__পদ্ধতি থাকতে হবে । থাকার __iter__একটি পুনরাবৃত্তযোগ্য হতে যথেষ্ট। সুতরাং প্রতিটি পুনরাবৃত্তি একটি পুনরাবৃত্তিযোগ্য।
  2. যখন __iter__ডাকা হয় এটির পুনরুক্তি করা উচিত ( return <iterator>উপরের চিত্রে)। একটি জেনারেটরকে কল করা একটি জেনারেটর পুনরুদ্ধারককে ফেরত দেয় যা এক ধরণের পুনরুক্তিকারী।

    class Iterable1:
        def __iter__(self):
            # a method (which is a function defined inside a class body)
            # calling iter() converts iterable (tuple) to iterator
            return iter((1,2,3))
    
    class Iterable2:
        def __iter__(self):
            # a generator
            for i in (1, 2, 3):
                yield i
    
    class Iterable3:
        def __iter__(self):
            # with PEP 380 syntax
            yield from (1, 2, 3)
    
    # passes
    assert list(Iterable1()) == list(Iterable2()) == list(Iterable3()) == [1, 2, 3]
  3. এখানে একটি উদাহরণ:

    class MyIterable:
    
        def __init__(self):
            self.n = 0
    
        def __getitem__(self, index: int):
            return (1, 2, 3)[index]
    
        def __next__(self):
            n = self.n = self.n + 1
            if n > 3:
                raise StopIteration
            return n
    
    # if you can iter it without raising a TypeError, then it's an iterable.
    iter(MyIterable())
    
    # but obviously `MyIterable()` is not an iterator since it does not have
    # an `__iter__` method.
    from collections.abc import Iterator
    assert isinstance(MyIterable(), Iterator)  # AssertionError

1
কুইজে, আমি কেবল 1 ম বুলেট পয়েন্টটি বুঝতে পেরেছিলাম। অর্থাত্‍ পুনরাবৃত্তির __iter__পদ্ধতি রয়েছে বলে এটি পুনরাবৃত্ত হয় । আপনি দয়া করে এই উত্তরটি সম্পাদনা করে ২ য় এবং ৩ য় পয়েন্টগুলিতে বিশদভাবে বর্ণনা করতে পারেন
আনভি

@ আনভি: যতদূর আমি বুঝতে পেরেছি: পুনরায় 2: __iter__()একটি পুনরাবৃত্তি প্রদান করে । একটি জেনারেটর একটি পুনরুক্তিকারী, তাই এটি এই উদ্দেশ্যে ব্যবহার করা যেতে পারে। পুনরায় 3: আমি কেবল এখানে অনুমান করতে পারি, তবে আমি মনে করি যে যদি __iter__()অনুপস্থিত বা ফিরে না আসে তবে selfএটি কোনও পুনরুক্তিকারী নয়, কারণ একটি পুনরাবৃত্তিকে __iter__()ফিরে আসতে হবে self
glglgl

10

আমি জানি না এটি কারও সাহায্য করে কিনা তবে আমি সেগুলি আরও ভালভাবে বুঝতে আমার মাথায় ধারণাগুলি দেখতে সবসময় পছন্দ করি। আমার ছোট ছেলে হিসাবে আমি ইট এবং সাদা কাগজ দিয়ে পুনরাবৃত্ত / পুনরুক্তি ধারণাটি কল্পনা করতে পারি।

মনে করুন আমরা অন্ধকার ঘরে এবং মেঝেতে আমাদের ছেলের জন্য ইট লাগিয়েছি। বিভিন্ন আকারের, রঙের ইটগুলি এখন গুরুত্বপূর্ণ নয়। মনে করুন আমাদের মতো 5 টি ইট রয়েছে। এই 5 টি ইটকে একটি অবজেক্ট হিসাবে বর্ণনা করা যেতে পারে - এর ইট কিট বলি । আমরা এই ইটের কিট দিয়ে অনেকগুলি কাজ করতে পারি - একটি নিতে পারি এবং তারপরে দ্বিতীয় এবং তৃতীয়টি নিতে পারি, ইটের স্থান পরিবর্তন করতে পারে, দ্বিতীয়টির উপরে প্রথম ইট লাগাতে পারে। আমরা তাদের সাথে বিভিন্ন ধরণের জিনিস করতে পারি। সুতরাং প্রতিটি ইটের মধ্য দিয়ে যেতে এবং এটি দিয়ে কিছু করতে পারি তাই এই ইটের কিটটি একটি পুনরাবৃত্তিযোগ্য অবজেক্ট বা ক্রম । আমরা কেবলমাত্র আমার সামান্য পুত্র মত এটা করতে পারেন - আমরা সঙ্গে খেলা করতে পারেন এক ইট একটি সময়ে । তাই আবার আমি নিজেকে এই ব্রিকস কিটটি কল্পনা করিiterable

এখন মনে রাখবেন আমরা অন্ধকার ঘরে আছি। বা প্রায় অন্ধকার। বিষয়টি হ'ল আমরা সেই ইটগুলি পরিষ্কারভাবে দেখতে পাচ্ছি না, সেগুলি কী রঙ, কোন আকার ইত্যাদি So তাই আমরা যদি তাদের সাথে কিছু করতে চাই - উফ তাদের মাধ্যমে পুনরাবৃত্তি করি - তবে আমরা সত্যই জানি না কারণ এটি কী এবং কীভাবে অনেক অন্ধকার.

আমরা যা করতে পারি তা প্রথম ইটের কাছাকাছি - একটি ইটের কিটের উপাদান হিসাবে - আমরা প্রথম ইট-উপাদানটি কোথায় রয়েছে তা দেখতে আমাদের জন্য একটি সাদা ফ্লোরোসেন্ট কাগজ রেখে দিতে পারি। এবং প্রতিবার যখনই আমরা একটি কিট থেকে একটি ইট নিয়ে যাই, অন্ধকার ঘরে এটি দেখতে সক্ষম হবার জন্য আমরা কাগজের সাদা টুকরোটিকে পরবর্তী ইটের প্রতিস্থাপন করি। এই সাদা কাগজের টুকরোটি পুনরাবৃত্তকারী ছাড়া আর কিছুই নয় । এটি পাশাপাশি একটি বস্তু । তবে আমরা যা করতে পারি তা নিয়ে একটি অবজেক্ট এবং আমাদের পুনরাবৃত্ত বস্তুর উপাদানগুলির সাথে খেলতে পারি - ইটসকল

আমি যখন প্রথম আইডিএল-তে নিম্নলিখিত চেষ্টা করেছিলাম এবং একটি টাইপ-এরর পেয়েছিলাম তখন সেভাবে আমার প্রথম ভুলটি ব্যাখ্যা করে:

 >>> X = [1,2,3,4,5]
 >>> next(X)
 Traceback (most recent call last):
    File "<pyshell#19>", line 1, in <module>
      next(X)
 TypeError: 'list' object is not an iterator

লিস্ট এক্স এখানে আমাদের ইট কিট ছিল কিন্তু কাগজের সাদা টুকরা নয়। আমার প্রথমে একজন পুনরুক্তিকারীর সন্ধান করা দরকার:

>>> X = [1,2,3,4,5]
>>> bricks_kit = [1,2,3,4,5]
>>> white_piece_of_paper = iter(bricks_kit)
>>> next(white_piece_of_paper)
1
>>> next(white_piece_of_paper)
2
>>>

এটি সাহায্য করে কিনা জানি না তবে এটি আমাকে সাহায্য করেছিল। যদি কেউ ধারণাটির সঠিক ধারণা / সত্যায়ন করতে পারে তবে আমি কৃতজ্ঞ হব। এটি আমাকে আরও শিখতে সহায়তা করবে।


6

পরিবেশনযোগ্য : - এমন কিছু যা পুনরাবৃত্তিযোগ্য তা পুনরাবৃত্তিযোগ্য; তালিকাগুলি, স্ট্রিং ইত্যাদির মতো ক্রমগুলির মতো এটির __getitem__পদ্ধতি বা একটি __iter__পদ্ধতিও রয়েছে has এখন আমরা যদি iter()সেই অবজেক্টটিতে ফাংশন ব্যবহার করি , আমরা একটি পুনরাবৃত্তি পেলাম।

আইট্রেটার : - যখন আমরা iter()ফাংশন থেকে পুনরাবৃত্তি বস্তুটি পাই ; আমরা একে একে উপাদান পাওয়ার জন্য __next__()পদ্ধতি (পাইথন 3 এ) বা কেবল next()( পাইথন 2 তে) কল করি । এই শ্রেণীর এই শ্রেণি বা উদাহরণটিকে পুনরাবৃত্তকারী বলা হয়।

ডক্স থেকে:

পুনরাবৃত্তাকারগুলির ব্যবহার প্যাডনকে একত্রিত করে এবং একত্রিত করে। পর্দার আড়ালে, স্টেট স্টেটমেন্টটি iter() ধারক বস্তুটিতে কল  করে। ফাংশনটি একটি পুনরাবৃত্ত বস্তু ফেরত দেয় __next__() যা সেই পদ্ধতিটি সংজ্ঞায়িত করে  যা একবারে ধারকটিতে উপাদানগুলিতে অ্যাক্সেস করে। যখন আর কোনও উপাদান নেই,  __next__() স্টপআইটারেশন ব্যতিক্রম উত্থাপন করে যা লুপটি বন্ধ করতে বলে। আপনি  বিল্ট-ইন ফাংশনটি __next__() ব্যবহার করে পদ্ধতিটি  কল করতে পারেন  next(); এই উদাহরণটি দেখায় যে এটি কীভাবে কাজ করে:

>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    next(it)
StopIteration

একটি ক্লাসের প্রাক্তন: -

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    def __iter__(self):
        return self
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
...     print(char)
...
m
a
p
s

4

আমি মনে করি না যে আপনি এটি ডকুমেন্টেশনের চেয়ে অনেক সহজ পেতে পারেন তবে আমি চেষ্টা করব:

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

  • শব্দের মেরিলিয়াম-ওয়েস্টার সংজ্ঞা দ্বারা ইস্ট্রেশন সম্ভবত সেরাভাবে ব্যাখ্যা করা হয়েছে :

বি: কম্পিউটার নির্দেশের ক্রমের পুনরাবৃত্তি নির্দিষ্ট সময় বা একটি শর্ত পূরণ না হওয়া অবধি - পুনরাবৃত্তির তুলনা করে


3
iterable = [1, 2] 

iterator = iter(iterable)

print(iterator.__next__())   

print(iterator.__next__())   

তাই হয়,

  1. iterableএমন একটি বস্তু যা লুপ করা যায় । যেমন তালিকা, স্ট্রিং, টুপল ইত্যাদি

  2. iterআমাদের iterableঅবজেক্টে ফাংশনটি ব্যবহার করে একটি পুনরুক্তিযোগ্য বস্তু ফিরে আসবে

  3. এখন এই পুনরাবৃত্তকারী অবজেক্টটির নাম দেওয়া আছে __next__(পাইথন 3 এ, বা কেবল nextপাইথন 2 এ) যার সাহায্যে আপনি পুনরাবৃত্তিযোগ্য প্রতিটি উপাদান অ্যাক্সেস করতে পারবেন

সুতরাং, উপরের কোডের আউটপুটটি হবে:

1

2


3

ইটারেবলগুলির একটি __iter__পদ্ধতি থাকে যা প্রতিবার নতুন পুনরাবৃত্তিকে ইনস্ট্যান্ট করে।

আইট্রেটাররা এমন একটি __next__পদ্ধতি প্রয়োগ করে যা স্বতন্ত্র আইটেমগুলি ফেরত দেয় এবং এমন __iter__পদ্ধতি যা প্রত্যাবর্তন করেself

সুতরাং, পুনরুক্তিগুলিও পুনরাবৃত্ত হয় তবে পুনরাবৃত্তকারীগুলি পুনরাবৃত্ত হয় না।

লুসিয়ানো রামালহো, সাবলীল পাইথন।


2

পুনরাবৃত্তিযোগ্য এবং পুনরাবৃত্তকারীদের সাথে ডিলের আগে যে প্রধান ফ্যাক্টরটি পুনরাবৃত্তিযোগ্য এবং পুনরুক্তি স্থির করে তা সিদ্ধান্ত নেয় ence

সিকোয়েন্স: সিকোয়েন্স হ'ল ডেটা সংগ্রহ

পরিশ্রমযোগ্য: পরিশ্রমযোগ্য হ'ল ক্রম টাইপ অবজেক্ট যা সমর্থন __iter__পদ্ধতিটি।

আইটার পদ্ধতি: আইটার পদ্ধতিটি ইনপুট হিসাবে ক্রম নেয় এবং এমন একটি উপাদান তৈরি করে যা পুনরায় হিসাবে পরিচিত

Iterator: Iterator হ'ল অবজেক্ট যা পরবর্তী পদ্ধতি কল করে এবং অনুক্রমের মধ্য দিয়ে ট্রান্সভার্স করে। পরবর্তী পদ্ধতিতে কল করার সময় এটি সেই বস্তুটি ফেরত দেয় যা এটি বর্তমানে ট্র্যাভার করে।

উদাহরণ:

x=[1,2,3,4]

এক্স একটি ক্রম যা ডেটা সংগ্রহ নিয়ে গঠিত

y=iter(x)

iter(x)এটিকে কল করার সময় কেবল পুনরুক্তি ফেরত আসে যখন এক্স অবজেক্টটির ইটার পদ্ধতি রয়েছে অন্যথায় এটি একটি ব্যতিক্রম উত্থাপন করে I যদি এটি পুনরাবৃত্তিকে ফেরত দেয় তবে y এর মতো নির্ধারিত হবে:

y=[1,2,3,4]

যেহেতু y একটি পুনরাবৃত্তকারী তাই এটি next()পদ্ধতি সমর্থন করে

পরবর্তী পদ্ধতিতে কল করার পরে তালিকার পৃথক উপাদানগুলি একে একে প্রদান করে।

সিক্যুয়েন্সের শেষ উপাদানটি ফিরে আসার পরে যদি আমরা আবার পরের পদ্ধতিটিকে কল করি তবে এটি স্টপআইটারেশন ত্রুটি উত্থাপন করে

উদাহরণ:

>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration

কেবলমাত্র একটি পর্যবেক্ষণ: y = iter (x) হুবহু y = [1,2,3,4] নয়, যেহেতু y এখন একটি পুনরুক্তিযোগ্য বস্তু। সম্ভবত আপনার স্পষ্ট করতে একটি মন্তব্য যুক্ত করা উচিত যা কোনও তালিকা নয় বরং একটি পুনরাবৃত্তিকারী অবজেক্ট বা প্রতিনিধিত্ব পরিবর্তন করতে হবে।
coelhudo

-6

পাইথনে সবকিছুই একটি বস্তু। যখন কোনও অবজেক্টকে পুনরাবৃত্তিযোগ্য বলা হয়, এর অর্থ হ'ল আপনি সংগ্রহ হিসাবে পদক্ষেপটি (অর্থাৎ পুনরাবৃত্তি) পদক্ষেপ করতে পারেন।

উদাহরণস্বরূপ অ্যারেগুলি পুনরাবৃত্তিযোগ্য। লুপের জন্য আপনি তাদের মাধ্যমে পদক্ষেপ নিতে পারেন এবং সূচী 0 থেকে সূচী n, n এ অ্যারে অবজেক্টের বিয়োগ দৈর্ঘ্য 1 হওয়াতে যেতে পারেন।

শব্দভাণ্ডারগুলি (কী / মানের জোড়া, যাদেরকে এসোসিয়েটিভ অ্যারেও বলা হয়) এছাড়াও পুনরাবৃত্তিযোগ্য। আপনি তাদের কীগুলি দিয়ে পদক্ষেপ নিতে পারেন।

স্পষ্টতই যে বস্তুগুলি সংগ্রহ নয় সেগুলি পুনরাবৃত্ত হয় না। উদাহরণস্বরূপ একটি বুল অবজেক্টের কেবল একটি মান, সত্য বা মিথ্যা থাকে। এটি পুনরাবৃত্তিযোগ্য নয় (এটি কোনও পুনরাবৃত্ত বস্তু তা বোঝা যাবে না)।

আরও পড়ুন। http://www.lepus.org.uk/ref/companion/Iterator.xml


6
বস্তুগুলি যা সংগ্রহগুলি নয় তা পুনরাবৃত্তিযোগ্য নয় সাধারণত সঠিক নয়। কয়েকটি উদাহরণ দেওয়ার জন্য, জেনারেটর পুনরাবৃত্তিযোগ্য তবে সংগ্রহ নয়, এবং iter()স্ট্যান্ডার্ড সংগ্রহের ধরণে কল করে তৈরি করা পুনরুক্তিযোগ্য বস্তুগুলি পুনরুক্তিযোগ্য তবে সেগুলি নিজেই সংগ্রহ নয়।
মার্ক আমেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.