Я согласен с ответом от zacherates.
Но вы можете сделать вызов intern () в ваших нелиберальных строках.
Из примера zacherates:
// ... but they are not the same object
new String("test") == "test" ==> false
Если вы ставите нелитеральное равенство строки, это правда
new String("test").intern() == "test" ==> true
НЕТ, yield не подразумевает продолжения, он просто начинается со следующей строки в следующий раз. Простой пример демонстрирует, что
def f():
for i in range(3):
yield i
print i,
list(f())
Это печатает 0,1,2, но если yield продолжается, он не будет
Если что-то является простым значением, а условия проверяют равенство, я бы предпочел выполнить поиск по словарю "структура дела":
ii_dict={'a':('somethinga1','somethinga2','somethinga3'),'b':('somethingb1',)}
ii_default = ('somethingdefault',)
aa='abeabbacd'
def function():
return (value
for ii in aa
for value in (ii_dict[ii] if ii in ii_dict else ii_default))
for something in function(): print something
yield
в Python останавливает выполнение и возвращает значение. Когда итератор вызывается снова, он продолжает выполнение непосредственно после оператора yield
. Например, генератор, определенный как:
def function():
yield 1
yield 2
будет последовательно возвращать 1
, затем 2
. Другими словами, требуется continue
. Однако в данном случае elif
и else
, как описал flashk, определенно являются правильными инструментами.
continue
пропускает оставшийся кодовый блок, но кодовый блок после yield
выполняется, когда next ()
снова вызывается в генераторе . yield
действует как приостановка выполнения в определенный момент.
Вместо использования оператора continue
я бы предложил использовать параметры elif
и else
:
def function():
for ii in aa:
if condition1(ii):
yield something1
yield something2
yield something3
elif condition2(ii):
yield something4
else: #default
yield something5
Это кажется слишком большим более читаемый для меня