ระบุ () - สร้างเครื่องกำเนิดไฟฟ้าใน Python


90

ฉันต้องการทราบว่าจะเกิดอะไรขึ้นเมื่อฉันส่งผลลัพธ์ของฟังก์ชันเครื่องกำเนิดไฟฟ้าไปยัง python's enumerate () ตัวอย่าง:

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

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

การแจงนับวนซ้ำอย่างเฉื่อยชาหรือไม่ก็ทำให้ทุกอย่างกลายเป็นเรื่องแรก? ฉัน 99.999% แน่ใจว่ามันขี้เกียจดังนั้นฉันจะปฏิบัติเหมือนกับฟังก์ชั่นเครื่องกำเนิดไฟฟ้าได้หรือไม่หรือฉันต้องระวังอะไร


1
ฉันคิดว่าคุณหมายถึงการเพิ่มฉันใน veryBigHello
robert

@robert: ถ้าฉันไม่เข้าใจผิดฉันจะเพิ่มขึ้นโดยอัตโนมัติ
the_drow

@the_drow ไม่ได้อยู่ในveryBigHelloฟังก์ชันตัวเอง
Will McCutchen

1
@ วิล: อ๋อถูกต้อง แต่นั่นเป็นเพียงการกัด มันเป็นตัวอย่าง คงที่แล้วล่ะ
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

Python 2 หรือ 3 (หรือทั้งสองอย่าง) มันขี้เกียจทั้งสองอย่าง? ผมทดสอบบนหลาม 2 และมันคือขี้เกียจ
becko

2
ฉันทดสอบสิ่งนี้กับ Python 3.5.2 และประเมินผลอย่างเฉื่อยชา
gobernador

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

2
ขอบคุณสำหรับคำอธิบายนี้ ฉันมีช่วงเวลาที่ยากลำบากในการหาคำตอบที่ยอมรับได้ อย่างน้อยก็จนกว่าฉันจะเห็นคุณ
Trendsetter37

13

เนื่องจากคุณสามารถเรียกใช้ฟังก์ชันนี้ได้โดยไม่ต้องออกจากหน่วยความจำยกเว้นมันขี้เกียจอย่างแน่นอน

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

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

0

ทางเลือกของโรงเรียนเก่าเนื่องจากฉันใช้เครื่องกำเนิดไฟฟ้าที่คนอื่น (sklearn) เขียนซึ่งไม่ได้ผลกับแนวทางที่นี่

i=(-1)
for x in some_generator:
    i+=1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.