গণনা করা () - পাইথনে একটি জেনারেটর যুক্ত করা


90

আমি জেনারেটর ফাংশনের ফলাফল অজগরটির গণনা () এ পাস করার পরে কী হবে তা জানতে চাই। উদাহরণ:

def veryBigHello():
    i = 0
    while i < 10000000:
        i += 1
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word

গণনাটি কি অলসভাবে পুনরাবৃত্তি হয়, বা এটি সবকিছুকে প্রথমে স্লাপ করে? আমি 99.999% নিশ্চিত যে এটি অলস, তাই আমি কি এটিকে জেনারেটরের ফাংশনের মতোই আচরণ করতে পারি, বা আমার কিছুর জন্য নজর রাখা দরকার?


4
আমি ধারণা করছি আপনি খুব বড় হেলোতে আমি ইনক্রিমেন্ট করতে চাইছি।
— রবার্ট

@ আরবার্ট: আমি যদি ভুল না করি তবে আমি স্বয়ংক্রিয়ভাবে বৃদ্ধি
— পেয়েছি

@ এটি_ড্রো veryBigHelloনিজেই ফাংশনে নেই ।
— ম্যাককুটেন

4
@ উইল: ওহ, সঠিক তবে এটি কেবল নিটপিকিং। এটি একটি উদাহরণ। যাইহোক স্থির।
— the_drow

উত্তর:


108

এটা অলস। ঘটনাটি প্রমাণ করা মোটামুটি সহজ:

>>> def abc():
...     letters = ['a','b','c']
...     for letter in letters:
...         print letter
...         yield letter
...
>>> numbered = enumerate(abc())
>>> for i, word in numbered:
...     print i, word
...
a
0 a
b
1 b
c
2 c

এই পাইথন 2 বা 3 (বা উভয়)? দুটোতেই কি অলসতা আছে? আমি পাইথন 2 উপর পরীক্ষা এবং এটি হল অলস।
— বেকো

4
আমি এটি পাইথন ২.৩.২ এ পরীক্ষা করেছি এবং এটি অলসতার সাথে মূল্যায়ন করে।
— গোবারনাদর

42

পূর্বের যে কোনও একটির পরামর্শের চেয়ে এটি আরও সহজ:

$ python
Python 2.5.5 (r255:77872, Mar 15 2010, 00:43:13)
[GCC 4.3.4 20090804 (release) 1] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> abc = (letter for letter in 'abc')
>>> abc
<generator object at 0x7ff29d8c>
>>> numbered = enumerate(abc)
>>> numbered
<enumerate object at 0x7ff29e2c>

যদি গণনাটি অলস মূল্যায়ন না করে তবে এটি ফিরে আসবে [(0,'a'), (1,'b'), (2,'c')]বা কিছু (প্রায়) সমতুল্য।

অবশ্যই, গণনা করা কেবল একটি অভিনব জেনারেটর:

def myenumerate(iterable):
   count = 0
   for _ in iterable:
      yield (count, _)
      count += 1

for i, val in myenumerate((letter for letter in 'abc')):
    print i, val

4
এই ব্যাখ্যার জন্য ধন্যবাদ। গ্রহণযোগ্য উত্তরটি খুঁজে পেতে আমার বেশ কিছুটা কষ্ট হয়েছিল। কমপক্ষে আমি তোমার দেখা পর্যন্ত।
— ট্রেন্ডসেটর 37

13

যেহেতু আপনি এই ফাংশনটিকে মেমরির ব্যতিক্রম না পেয়ে কল করতে পারেন এটি অবশ্যই অলস

def veryBigHello():
    i = 0
    while i < 1000000000000000000000000000:
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word

0

পুরানো বিদ্যালয়ের বিকল্প যেহেতু আমি একটি জেনারেটর ব্যবহার করছিলাম যা অন্য কেউ (স্কালার্ন) লিখেছিলেন যা এখানে পদ্ধতির সাথে কাজ করে না।

i=(-1)
for x in some_generator:
    i+=1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.