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


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.