জেনারেটর বোঝা কি করে? এটা কিভাবে কাজ করে? আমি এটি সম্পর্কে কোনও টিউটোরিয়াল খুঁজে পাইনি।
জেনারেটর বোঝা কি করে? এটা কিভাবে কাজ করে? আমি এটি সম্পর্কে কোনও টিউটোরিয়াল খুঁজে পাইনি।
উত্তর:
আপনি কি তালিকার বোধগম্যতা বোঝেন? যদি তা হয় তবে জেনারেটর এক্সপ্রেশনটি তালিকার বোঝার মতো, তবে আপনার আগ্রহী সমস্ত আইটেম সন্ধান করার এবং সেগুলিকে তালিকায় প্যাক করার পরিবর্তে এটি অপেক্ষা করে এবং প্রতিটি আইটেম একের পর এক করে দেয়।
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print(filtered_list)
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print(filtered_gen) # notice it's a generator object
<generator object <genexpr> at 0x7f2ad75f89e0>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> next(filtered_gen)
5
>>> next(filtered_gen)
9
>>> next(filtered_gen)
6
>>> next(filtered_gen) # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print(gen_to_list)
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
যেহেতু একটি জেনারেটরের এক্সপ্রেশনটিতে কেবল একবারে একটি আইটেম উপার্জন করতে হয়, এটি মেমরির ব্যবহারে বড় সঞ্চয় করতে পারে। জেনারেটর এক্সপ্রেশন পরিস্থিতিগুলিতে সর্বাধিক উপলব্ধি করে যেখানে আপনাকে একবারে একটি আইটেম নিতে হবে, সেই আইটেমটির উপর ভিত্তি করে প্রচুর গণনা করা হবে এবং তারপরে পরবর্তী আইটেমটিতে যেতে হবে। আপনার যদি একাধিক মান প্রয়োজন হয় তবে আপনি একটি জেনারেটর এক্সপ্রেশনও ব্যবহার করতে পারেন এবং একবারে কয়েকটি দখল করতে পারেন। আপনার প্রোগ্রামটি এগিয়ে যাওয়ার আগে যদি আপনার সমস্ত মান দরকার হয় তবে তার পরিবর্তে একটি তালিকা উপলব্ধি ব্যবহার করুন।
next(...).__next__()
If you need more than one value, you can also use a generator expression and grab a few at a time। আপনি দয়া করে এই ব্যবহার সম্পর্কে একটি উদাহরণ দিতে পারেন? ধন্যবাদ
একটি জেনারেটর উপলব্ধি একটি তালিকা বোধের অলস সংস্করণ।
এটি কেবলমাত্র তালিকার বোধগমনের মতো এটি বাদে এটি তালিকার পরিবর্তে একটি পুনরাবৃত্তির অর্থ ফেরৎ দেয় যেমন পরবর্তী () পদ্ধতিযুক্ত একটি বস্তু যা পরের উপাদানটি প্রদান করবে।
আপনি যদি তালিকা বোঝার সাথে পরিচিত না হন তবে এখানে এবং জেনারেটরের জন্য এখানে দেখুন ।
তালিকা / জেনারেটর উপলব্ধি একটি নির্মাণ যা আপনি ব্যবহার করতে পারেন একটি বিদ্যমান তালিকা থেকে একটি নতুন তালিকা / জেনারেটর তৈরি করতে।
ধরা যাক আপনি 1 থেকে 10 পর্যন্ত প্রতিটি সংখ্যার স্কোয়ারের তালিকা তৈরি করতে চান আপনি পাইথনে এটি করতে পারেন:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
এখানে range(1,11)তালিকা তৈরি করে [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]তবে rangeফাংশনটি পাইথন 3.0.০ এর আগে জেনারেটর নয় এবং অতএব আমি যে কনস্ট্রাক্টটি ব্যবহার করেছি তা হল একটি তালিকা বোধগম্যতা।
আমি যদি এমন কোনও জেনারেটর তৈরি করতে চাই যা একই কাজ করে তবে আমি এটি এটি করতে পারতাম:
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
পাইথন 3-তে তবে rangeএকটি জেনারেটর, সুতরাং ফলাফলটি কেবলমাত্র আপনার ব্যবহার করা সিনট্যাক্সের উপর নির্ভর করে (বর্গাকার বন্ধনী বা বৃত্তাকার বন্ধনী)।
জেনারেটর উপলব্ধি একটি নির্দিষ্ট কাঠামো সহ জেনারেটর তৈরি করার একটি সহজ উপায়। বলুন আপনি এমন একটি চান generatorযা একে একে সমস্ত সংখ্যাকে এক করে আউটপুট দেয় your_list। আপনি যদি ফাংশন শৈলী ব্যবহার করে এটি তৈরি করেন তবে এটি এমন হবে:
def allEvens( L ):
for number in L:
if number % 2 is 0:
yield number
evens = allEvens( yourList )
আপনি এই জেনারেটর বোঝাপড়া এক্সপ্রেশন দিয়ে একই ফলাফল অর্জন করতে পারেন:
evens = ( number for number in your_list if number % 2 == 0 )
উভয় ক্ষেত্রেই, আপনি কল next(evens)করার সময় পরবর্তী সমান নম্বরটি পান your_list।
জেনারেটর বোধগম্য হ'ল পুনরুক্তি তৈরির জন্য একটি কৌশল, যা কার্সারের মতো কিছু যা কোনও উত্সে চলে। আপনি যদি মাইএসকিএল কার্সার বা মঙ্গডব কার্সার জানেন তবে আপনি সচেতন হতে পারেন যে পুরো আসল তথ্যটি একবারে মেমরিটিতে একবারে লোড হয় না, তবে একবারে একটি করে। আপনার কার্সারটি পিছনে পিছনে সরে যায় তবে মেমরিতে সর্বদা একটি সারি / তালিকার উপাদান থাকে।
সংক্ষেপে, জেনারেটর উপলব্ধি ব্যবহার করে আপনি সহজেই পাইথনে কার্সার তৈরি করতে পারেন।
জেনারেটর বোঝার আরেকটি উদাহরণ:
print 'Generator comprehensions'
def sq_num(n):
for num in (x**2 for x in range(n)):
yield num
for x in sq_num(10):
print x
জেনারেটর কেবলমাত্র তালিকার মতো হয়, গৌণ পার্থক্যটি হ'ল তালিকাগুলিতে আমরা তালিকার সমস্ত প্রয়োজনীয় নম্বর বা আইটেমগুলি পাই তবে জেনারেটরে প্রয়োজনীয় সংখ্যাগুলি একবারে একটি করে উপার্জন করা হয়। সুতরাং প্রয়োজনীয় আইটেমগুলি পাওয়ার জন্য আমাদের প্রয়োজনীয় সমস্ত আইটেমগুলি পেতে লুপের জন্য ব্যবহার করতে হবে।
#to get all the even numbers in given range
def allevens(n):
for x in range(2,n):
if x%2==0:
yield x
for x in allevens(10)
print(x)
#output
2
4
6
8