LINUX.ORG.RU

[python] Неправильное использование yield?

 


0

1

Изначально нужен был код, чтобы начинать чтение с произвольной строки в файле. Родилось следующее:

def read_next_line(filename, start_line=0):
    with open(filename) as src:
        for line_number, line in enumerate(src):
            if line_number >= start_line:
                yield line

Затем в другом месте дергается так:

for word in read_next_line(filename, start_line):
    # so things

Однако как задумано не работает. Если вызывать .next() у получившегося генератора, заново итерируется весь for цикл. Почему так же?


У какого именно объекта вызывается next()? Можете привести кусок неработающего кода целиком?

lykk
()

А как задумано? Приведенный цикл for именно так и будет работать - выдавать строку начиная с заданной.

kir4
()

Действительно, ерунда какая-то. Изолировал якобы проблемный кусок — работает исправно. Буду искать тогда в другом месте ошибку, спасибо.

$ ls -1
populate_db.py
wordlist
$ cat wordlist
de
la
que
el
en
y
a
los
se
del
$ cat populate_db.py
# encoding: utf-8
import sys

def read_next_line(filename, start_line=0):
    with open(filename) as src:
        for line_number, line in enumerate(src):
            print 'start: %s, current: %s' % (start_line, line_number)
            if line_number >= start_line:
                yield line.strip()

filename = 'wordlist'
start_line = 5

for line in read_next_line(filename, start_line):
    print '> %s' % line
$ python populate_db.py
start: 5, current: 0
start: 5, current: 1
start: 5, current: 2
start: 5, current: 3
start: 5, current: 4
start: 5, current: 5
[quote] y[br][/quote]start: 5, current: 6
[quote] a[br][/quote]start: 5, current: 7
[quote] los[br][/quote]start: 5, current: 8
[quote] se[br][/quote]start: 5, current: 9
[quote] del[br][/quote]$
xio
() автор топика

Гм, в общем я задавал параметры аргументами из командной строки, а они все, в том числе числа, были строкового типа. А питон, негодная программа, молча сравнивал str с int потом.

xio
() автор топика

А хаскель тебе бы даже скомпилировать подобное сравнение не дал.

anonymous
()
Ответ на: комментарий от xio

молча сравнивал str с int потом.

Косяк второго питона :((. В третьем исправили.

true_admin ★★★★★
()
Ответ на: комментарий от one_more_hokum

Дык, типизации статической нет, ошибки прут косяками. :-)

тут не в этом дело. Кстати, в js тоже динамическая типизация, но они придумали как с ней «бороться»: какую-то приблуду для предсказания типов сделали. Посмотри на опеннете новости на счёт ion monkey. Я думаю это и к питону можно прикрутить.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.