Функция Python становится генератором [duplicate]

Главный ответ отличный. Вот что я должен был на обычной установке debian / php / mysql:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

, которая была всем!

34
задан Martijn Pieters 27 May 2013 в 21:33
поделиться

2 ответа

Это новая функция в Python 3.3 (как отмечает комментарий, она даже не работает в 3.2). Подобно return в генераторе уже давно эквивалентен raise StopIteration(), return <something> в генераторе теперь эквивалентен raise StopIteration(<something>). По этой причине исключение, которое вы видите, должно быть напечатано как StopIteration: 3, и это значение доступно через атрибут value для объекта исключения. Если генератор делегирован использовать синтаксис (также новый) yield from, это результат. Подробнее см. PEP 380 .

def f():
    return 1
    yield 2

def g():
    x = yield from f()
    print(x)

# g is still a generator so we need to iterate to run it:
for _ in g():
    pass

Отправляет 1, но не 2.

39
ответ дан Mark Amery 31 August 2018 в 20:34
поделиться

Возвращаемое значение не игнорируется, но только генераторы дают значения , а return просто заканчивает генератор, в этом случае раньше. Продвижение генератора никогда не достигает инструкции yield в этом случае.

Всякий раз, когда итератор достигает «конца» значений для выхода, появляется StopIteration . Генераторы не являются исключением. Однако с Python 3.3 любое выражение return становится значением исключения:

>>> def gen():
...     return 3
...     yield 2
... 
>>> try:
...     next(gen())
... except StopIteration as ex:
...     e = ex
... 
>>> e
StopIteration(3,)
>>> e.value
3

Используйте функцию next() для продвижения итераторов вместо прямого вызова .__next__():

print(next(x))
19
ответ дан Martijn Pieters 31 August 2018 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: