পাইথন ৩.৩-এ রেঞ্জ () যদি কোনও জেনারেটর হয় তবে আমি কেন একটি পরিসরে পরবর্তী () কল করতে পারি না?


87

সম্ভবত আমি ওয়েবে ভুল তথ্যের শিকার হয়ে পড়েছি, তবে আমি মনে করি এটি সম্ভবত আমি কিছু ভুল বুঝেছি। আমি এ পর্যন্ত যা শিখেছি তার উপর ভিত্তি করে, পরিসর () হ'ল একটি জেনারেটর এবং জেনারেটর পুনরুক্তি হিসাবে ব্যবহার করা যেতে পারে। তবে, এই কোড:

myrange = range(10)
print(next(myrange))

আমাকে এই ত্রুটি দেয়:

TypeError: 'range' object is not an iterator

আমি এখানে কি মিস করছি? আমি এটি 0 টি মুদ্রণ এবং পরবর্তী মানটিতে অগ্রণী হওয়ার প্রত্যাশা করছিলাম myrange। আমি পাইথনে নতুন, সুতরাং দয়া করে বরং মূল প্রশ্নটির জন্য আমার ক্ষমা প্রার্থনা করুন, তবে আমি আর কোথাও এর ভাল ব্যাখ্যা খুঁজে পাইনি।


4
পুনরাবৃত্তি এবং এমন জিনিসগুলির মধ্যে পার্থক্য জন্য stackoverflow.com/q/13054057/395760 দেখুন যা আপনি একটি forলুপে পুনরাবৃত্তি করতে পারেন ।

4
জেনারেটর পুনরাবৃত্তিযোগ্য, তবে পুনরাবৃত্তকারী নয় তা কি সঠিক হবে?
জেফ

4
@ জেফ ইটারেবলস হ'ল এমন বস্তু যা iterকোনও পুনরুক্তি প্রাপ্ত করতে ব্যবহার করা যেতে পারে। আইট্রেটারগুলি এমন বস্তু যা ব্যবহারের মাধ্যমে পুনরাবৃত্তি হতে পারে next। জেনারেটর একটি শ্রেনীর পুনরাবৃত্তি (জেনারেটর ফাংশন এবং জেনারেটর এক্সপ্রেশন)। কমপক্ষে আমি যা ভাবি
সেটাই

উত্তর:


115

rangeঅপরিবর্তনীয় পুনরাবৃত্তযোগ্য বস্তুর একটি শ্রেণি। তাদের পুনরাবৃত্তি আচরণের সাথে listএস এর তুলনা করা যেতে পারে : আপনি nextসরাসরি তাদের সাথে কল করতে পারবেন না ; আপনি ব্যবহার করে একটি পুনরাবৃত্তি পেতে হবে iter

সুতরাং না, কোনও rangeজেনারেটর নয়।

আপনি ভাবতে পারেন, "তারা কেন এটিকে সরাসরি পুনরাবৃত্ত করতে পারে না"? ভাল, rangeএর কিছু দরকারী বৈশিষ্ট্য রয়েছে যা সেভাবে সম্ভব হবে না:

  • এগুলি পরিবর্তনযোগ্য, তাই এগুলি অভিধান কী হিসাবে ব্যবহার করা যেতে পারে।
  • তারা আছে start, stopএবং stepবৈশিষ্ট্যাবলী (পাইথন 3.3 থেকে), countএবং indexপদ্ধতি এবং তারা সমর্থন in, lenএবং __getitem__অপারেশন।
  • আপনি একই rangeবহুবার পুনরাবৃত্তি করতে পারেন ।

>>> myrange = range(1, 21, 2)
>>> myrange.start
1
>>> myrange.step
2
>>> myrange.index(17)
8
>>> myrange.index(18)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 18 is not in range
>>> it = iter(myrange)
>>> it
<range_iterator object at 0x7f504a9be960>
>>> next(it)
1
>>> next(it)
3
>>> next(it)
5

12
rangeঅবজেক্টগুলির আরও একটি দুর্দান্ত বৈশিষ্ট্য হ'ল তাদের একটি __contains__পদ্ধতি রয়েছে যা মানটি একটি সীমার মধ্যে রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে:5 in range(10) => True
প্রেরণ করুন

উত্তর করার জন্য ধন্যবাদ; এটি এখন বোধগম্য হয়। আপনার উত্তরটি গ্রহণ করার আগে আমি কেবল যে বিষয়টি পরিষ্কার করতে চাই তা হ'ল এই পৃষ্ঠার নীচের অংশের এক তৃতীয়াংশ পথ সম্পর্কে ইটালিকের নোট , এতে বলা হয়েছে যে "পাইথন 3 রেঞ্জ () একটি জেনারেটর"। এটি কি কেবল ভুল?
জেফ

4
@ জেফ কড়া কথা বলছেন, হ্যাঁ, এটি ভুল। নোটটির লেখক সম্ভবত বোঝাতে চেয়েছিলেন যে পাইথন 3 rangeঅলস (পাইথন 2 এর সাথে তুলনা করা যেখানে এটি কেবল একটি ফাংশন যা একটি তালিকা ফিরিয়ে দেয়)।
ওলেহ প্রিপিন

6
এছাড়াও: range(0,10,3)[3]এবং 9 in range(0,10,3)। পরিসীমা বেশ অলস তালিকা is
লেনার্ট রেজেব্রো

4
@ ব্যবহারকারী 3079275 "সরাসরি পুনরাবৃত্তিযোগ্য" হ'ল একটি মিসনোমার, আসলে "পুনরুক্তি" অর্থ। আইট্রেটারগুলির অভ্যন্তরীণ অবস্থা থাকে এবং তাই সংজ্ঞা অনুসারে পরিবর্তনযোগ্য। "পরিবেশনযোগ্য" হ'ল একটি অবজেক্ট, তা পরিবর্তনযোগ্য বা না হোক, এটি একটি পুনরুক্তি তৈরি করতে পারে। এমনকি পরিবর্তনীয় বস্তুগুলি সাধারণত নিজেরাই পুনরুক্তি হয় না, পরিবর্তে তারা পুনরায় ব্যবহারযোগ্য পদ্ধতিতে পুনরুক্তি উত্পাদন করে (উদাহরণস্বরূপ, আপনি একই তালিকার মাধ্যমে দুটি পৃথক স্থানে দুটি পুনরুক্তি ব্যবহার করে স্বাধীনভাবে পুনরুক্ত করতে পারেন)।
ওলেহ প্রিপিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.