পাইথন তালিকার পুনরাবৃত্তি আচরণ এবং পরবর্তী (পুনরাবৃত্তকারী)


147

বিবেচনা:

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

সুতরাং, পুনরাবৃত্তিকে অগ্রসর করা, যেমনটি প্রত্যাশা করা হয়েছিল, একই জিনিসটিকে রূপান্তরিত করে পরিচালনা করা হবে।

এটি হ'ল, আমি আশা করব:

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

প্রতি দ্বিতীয় উপাদানটি এড়াতে: কলটি nextএকবারে পুনরুত্থককে অগ্রসর করা উচিত, তারপরে লুপের দ্বারা প্রেরিত কলটি এটি দ্বিতীয়বারের সাথে অগ্রসর হওয়া উচিত - এবং এই দ্বিতীয় কলটির ফলাফল নির্ধারিত হবে i

এটা হয় না। লুপ তালিকায় থাকা সমস্ত আইটেম মুদ্রণ করে, কোনও কিছু বাদ না দিয়ে।

আমার প্রথম চিন্তা ছিল যে এটি ঘটতে পারে কারণ লুপটি iterযা পাস তা কল করে এবং এটি একটি স্বতন্ত্র পুনরাবৃত্তি দিতে পারে - এটি আমাদের ক্ষেত্রে যেমন হয় না iter(a) is a

সুতরাং, কেন nextএই ক্ষেত্রে পুনরুক্তিকারীর অগ্রসর হতে দেখা যায় না?

উত্তর:


197

আপনি যা দেখতে পান তা হ'ল দোভাষী প্রতিটি পুনরাবৃত্তিকে মুদ্রিত করা next()ছাড়াও তার ফেরতের মানটিও প্রতিধ্বনিত করে i:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0
1
2
3
4
5
6
7
8
9

সুতরাং 0আউটপুট হয় print(i), 1থেকে ফেরত মান next()ইত্যাদি, ইন্টারেক্টিভ দোভাষীর মধ্য প্রতিধ্বনিত, প্রতিটি 2 লাইন ফলে পুনরাবৃত্তির টার্মিনালে লিখিত হচ্ছে, মাত্র 5 পুনরাবৃত্তিও আছে।

যদি আপনি next()প্রত্যাশা অনুযায়ী কাজগুলির আউটপুট নির্ধারণ করেন :

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    _ = next(a)
... 
0
2
4
6
8

বা ইন্টারেক্টিভ ইন্টারপ্রিটার ইকো থেকে আউটপুট আলাদা করতে অতিরিক্ত তথ্য মুদ্রণ করুন print():

>>> a = iter(list(range(10)))
>>> for i in a:
...    print('Printing: {}'.format(i))
...    next(a)
... 
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9

অন্য কথায়, next()প্রত্যাশিত হিসাবে কাজ করছে, তবে এটি ইন্টারেক্টিভ ইন্টারপ্রিটার দ্বারা প্রতিধ্বনিত ইটারেটর থেকে পরবর্তী মানটি ফেরত দেওয়ার কারণে আপনি বিশ্বাস করতে পরিচালিত হবেন যে কোনওভাবে লুপটির নিজস্ব পুনরায় ইটারেটর অনুলিপি রয়েছে।


13
দোভাষীর কাছ থেকে আমি এই আচরণ সম্পর্কে অবগত ছিলাম না। আমি আনন্দিত যে আমি আবিষ্কার করেছি যে সত্যিকারের সমস্যা সমাধানের সময় অনেক সময় হারাবার আগে এটি নিয়ে ভাবছিলাম।
ব্র্যান্ডিজি

5
... * মারা যায় *। এর মধ্যে সবচেয়ে খারাপটি, আমি সম্ভবত এক সপ্তাহ আগে কারও কাছে এই দোভাষী আচরণের উল্লেখ উল্লেখ করতে পারি।
lvc

মজাদার. আমি এর জন্য একটি চেষ্টা করেছি: পরের (ক); প্রিন্ট আই এবং ভেবেছিলাম আমি 1 এ চলে যাব এবং 1,3,5,7,9 মুদ্রণ করব। তবে এখনও এটি 0,2,4,6,8। কেন?
ব্যবহারকারী 2290820

3
iইতিমধ্যে নিযুক্ত করা হয়েছিল । next(a)এর মানে হল যে পরবর্তী পুনরাবৃত্তিটি 2নির্ধারিত হয়েছে i, তারপরে আপনি aআবার মুদ্রণ করুন i, ইত্যাদি চালিয়ে যাবেন
মারটিজন পিটার

1
N বিজোড় হলে এটি কাজ করে না - StopIterationতালিকাটি অস্থির next(a)হওয়ার পরে যখন ডাকা হয় তখন তা উত্থাপিত হয়।
রাফ

13

যা ঘটছে next(a)তা হ'ল এটির পরবর্তী মানটি, যা কনসোলে মুদ্রিত হয় কারণ এটি প্রভাবিত হয় না।

আপনি যা করতে পারেন তা এই মান সহ একটি পরিবর্তনশীলকে প্রভাবিত করে:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    b=next(a)
...
0
2
4
6
8

8

কারণ তারা শুধুমাত্র পরোক্ষভাবে কোড উদাহরণে অপরিহার্য mystifying জিনিস ইঙ্গিত আমি, একটু বিভ্রান্তিকর বিদ্যমান উত্তর খুঁজে: উভয় * "মুদ্রণ আমি" এবং "পরবর্তী (ক)" ছাপা হবে তাদের ফলাফল ঘটাচ্ছে করছে।

যেহেতু তারা মূল অনুক্রমের বিকল্প উপাদানগুলি মুদ্রণ করছে এবং এটি অপ্রত্যাশিত যে "পরবর্তী (ক)" বিবৃতিটি মুদ্রণ করছে, এটি "প্রিন্ট আই" বিবৃতিটি সমস্ত মান মুদ্রণ করছে বলে মনে হচ্ছে।

সেই আলোকে, এটি আরও স্পষ্ট হয়ে ওঠে যে "পরের (ক)" এর ফলাফলটি একটি চলককে নির্ধারণ করা তার 'ফলাফলের মুদ্রণকে বাধা দেয়, যাতে "i" লুপ ভেরিয়েবলটি কেবলমাত্র বিকল্প মানগুলি মুদ্রণ করে। একইভাবে, "মুদ্রণ" বিবৃতিটি আরও কিছু স্বতন্ত্র কিছু নির্গত করে যা এটিকে বিস্মৃত করে।

(বিদ্যমান উত্তরের মধ্যে একটি অন্যকে খণ্ডন করে কারণ সেই উত্তরটিতে একটি ব্লক হিসাবে উদাহরণ কোডটি মূল্যায়ন করা হয়, যাতে অনুবাদক "পরবর্তী (ক)" এর মধ্যবর্তী মানেরগুলি রিপোর্ট না করে reporting)

সাধারণভাবে প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে ছলনাময় বিষয়টি যখন আপনি উত্তরটি জানেন তখন যা স্পষ্ট তা সম্পর্কে স্পষ্ট করে দেওয়া হচ্ছে। এটি অধরা হতে পারে। অনুরূপ সমালোচনা উত্তরগুলি আপনি একবার বুঝতে পারলে। এটা মজার...


2

আপনার পাইথন / কম্পিউটারে কিছু ভুল।

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

>>> 
0
2
4
6
8

প্রত্যাশার মতো কাজ করে।

পাইথন ২.7 এবং পাইথন 3+ তে পরীক্ষা করা হয়েছে। দুজনেরই ঠিক মতো কাজ করে


5
আমি @ এলভিসি এর মতো একই ফলাফল পেয়েছি (কেবল আইডিএল-তে তবে, স্ক্রিপ্ট হিসাবে এটি কার্যকর করার সময় আমি
পেয়েছি

3
@ ইনবার গোলাপ কেবলমাত্র আপনি স্ক্রিপ্ট হিসাবে চালাবেন।
কুইন্টেক

1
এটি ইন্টারেক্টিভ শেলের মাধ্যমে কোড রাখার আচরণ। যদি ফাংশনটি ব্যবহার না করেই মান ফিরে আসে, দোভাষী এটি ডিবাগ আউটপুট হিসাবে শেলের জন্য মুদ্রণ করবেন
রিশিন

2

যারা এখনও বোঝেন না তাদের জন্য।

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0 # print(i) printed this
1 # next(a) printed this
2 # print(i) printed this
3 # next(a) printed this
4 # print(i) printed this
5 # next(a) printed this
6 # print(i) printed this
7 # next(a) printed this
8 # print(i) printed this
9 # next(a) printed this

অন্যরা ইতিমধ্যে বলেছে, nextপ্রত্যাশাকে প্রত্যাশা অনুযায়ী 1 দ্বারা বৃদ্ধি করে। তার ফেরত মানটি একটি ভেরিয়েবলে অর্পণ করা যাদুতে তার আচরণের পরিবর্তন করে না।


1

এটি আপনার পছন্দ মতো আচরণ করে যদি কোনও ফাংশন হিসাবে ডাকা হয়:

>>> def test():
...     a = iter(list(range(10)))
...     for i in a:
...         print(i)
...         next(a)
... 
>>> test()
0
2
4
6
8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.