দ্রুত উত্তর:
এরকম list()জেনারেটরের অভিব্যক্তি কাছাকাছি (প্রায়) ঠিক থাকার সমতূল্য []এটি প্রায় বন্ধনী। হ্যাঁ, আপনি করতে পারেন
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
তবে আপনি ঠিক পাশাপাশি করতে পারেন
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
হ্যাঁ, এটি জেনারেটর এক্সপ্রেশনটিকে তালিকা বোধে পরিণত করবে। এটিতে একই জিনিস এবং কলিং তালিকা ()। সুতরাং একটি জেনারেটরকে একটি তালিকার সাথে প্রকাশ করার উপায়টি এর চারপাশে বন্ধনী স্থাপন করা।
বিস্তারিত ব্যাখ্যা:
একটি জেনারেটর এক্সপ্রেশন একটি "নগ্ন" forএক্সপ্রেশন। তাই ভালো:
x*x for x in range(10)
এখন, আপনি নিজেই এটি একটি লাইনে আটকে রাখতে পারবেন না, আপনি একটি বাক্য গঠন ত্রুটি পাবেন। তবে আপনি এটির চারপাশে প্রথম বন্ধনী রাখতে পারেন।
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
এটিকে কখনও কখনও জেনারেটর অনুধাবন বলা হয়, যদিও আমি মনে করি যে সরকারী নামটি এখনও জেনারেটর এক্সপ্রেশন, সত্যিকার অর্থে কোনও পার্থক্য নেই, সিন্থেক্সটি বৈধ করার জন্য প্রথম বন্ধনী রয়েছে। যদি আপনি এটি কোনও ফাংশনের একমাত্র পরামিতি হিসাবে পাস করে থাকেন তবে আপনার সেগুলির দরকার নেই:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
মূলত পাইথন 3 এবং পাইথন 2.7 এ উপলব্ধ অন্যান্য সমস্ত বোধগম্যতা একটি জেনারেটর এক্সপ্রেশনকে ঘিরে কেবল সিনট্যাকটিক চিনি। বোধগম্য সেট করুন:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
ডিক্ট বোধগম্যতা:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
এবং পাইথন 3 এর অধীনে উপলব্ধি তালিকাভুক্ত করুন:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
পাইথন 2 এর অধীনে, তালিকা বোধগম্যতা কেবল সিনট্যাকটিক চিনি নয়। তবে পার্থক্যটি হ'ল এক্সটি পাইথন 2 এর নিচে নেমস্পেসে ফাঁস হবে।
>>> x
9
পাইথন 3 এর অধীনে আপনি পাবেন
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
এর অর্থ হল পাইথনে আপনার জেনারেটর এক্সপ্রেশনটির সামগ্রীটির একটি দুর্দান্ত প্রিন্টআউট পাওয়ার সর্বোত্তম উপায় হ'ল এটির একটি তালিকা বোঝা তৈরি করা! তবে আপনার যদি ইতিমধ্যে জেনারেটরের কোনও জিনিস থাকে তবে এটি অবশ্যই কাজ করবে না। এটি করা কেবল একটি জেনারেটরের একটি তালিকা তৈরি করবে:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
সেক্ষেত্রে আপনাকে কল করতে হবে list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
যদিও এটি কাজ করে তবে মূর্খতাপূর্ণ:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]