Используя для … еще в генераторах Python

Для сравнения объекта String используйте = вместо == (double equals). Двойное равенство будет сравнивать ссылки, а не их значения.

Обновите код сравнения, как показано ниже:

private void checkFriendRequestStatus(final ButtonStatus buttonsCallback, final String strSignedInUID, final String visitedUsername, final String strVisitedUID) {
        final DatabaseReference checkFriendRequestsRef = database.getReference("friend_requests/test/" + strSignedInUID);
        checkFriendRequestsRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                // choice is 1 to show buttons, then select which buttons to show with second params
                if (dataSnapshot.child("friends/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
                    buttonsCallback.setButtonStatus(1, 1);
                }
                else if (dataSnapshot.child("sentFriendRequest/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
                    buttonsCallback.setButtonStatus(1, 2);
                }
                else if (dataSnapshot.child("receivedFriendRequests/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
                    buttonsCallback.setButtonStatus(1, 3);
                }
                else {
                    buttonsCallback.setButtonStatus(1, 4);;
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
7
задан martineau 18 June 2011 в 14:08
поделиться

6 ответов

Вы повреждаете определение генератора, который должен выдать исключение StopIteration, когда повторение завершено (который автоматически обрабатывается оператором возврата в функции генератора),

Так:

def iterate(i):
    for value in i:
        yield value
    return

Лучше всего позволять коду вызова обработать случай пустого итератора:

count = 0
for value in iterate(range([])):
    print value
    count += 1
else:
    if count == 0:
        print "list was empty"

Мог бы быть более чистый способ сделать вышеупомянутое, но это должно хорошо работать и не попадает ни в одну общую 'обработку итератора как список' прерывания ниже.

11
ответ дан 6 December 2019 в 09:22
поделиться

Существует пара способов сделать это. Вы могли всегда использовать Iterator непосредственно:

def iterate(i):
    try:
        i_iter = iter(i)
        next = i_iter.next()
    except StopIteration:
        print 'i is empty'
        return

    while True:
        yield next
        next = i_iter.next()

Но если Вы знаете больше о том, что ожидать от аргумента i, можно быть более краткими:

def iterate(i):
    if i:  # or if len(i) == 0
        for next in i:
            yield next
    else:
        print 'i is empty'
        raise StopIteration()
5
ответ дан 6 December 2019 в 09:22
поделиться

Если невозможно использовать для... еще таким образом, что лучший подход к этому так, чтобы оператор печати был только выполнен, когда ни к чему не приводят?

Максимум я могу думать:


>>> empty = True
>>> for i in [1,2]:
...     empty = False
... if empty:
...     print 'empty'
...
>>>
>>>
>>> empty = True
>>> for i in []:
...     empty = False
... if empty:
...    print 'empty'
...
empty
>>>

0
ответ дан 6 December 2019 в 09:22
поделиться

Подводя итог некоторых более ранних ответов, это могло быть решено как это:

def iterate(i):
    empty = True
    for value in i:
        yield value
        empty = False

    if empty:
        print "empty"

таким образом, действительно не "еще" существует включенный пункт.

3
ответ дан 6 December 2019 в 09:22
поделиться

Что относительно простого, если еще?

def iterate(i):
    if len(i) == 0: print 'i is empty'
    else:
        for value in i:
            yield value
-2
ответ дан 6 December 2019 в 09:22
поделиться

Как вы заметили, для...иначе обнаруживает только перерыв . Так что это применимо только когда вы ищете что-то и затем stop.

Это не применимо к вашей цели не потому что это генератор, а потому что вы хотите обработать все элементы, без остановки (потому что вы хотите получить их все, но дело не в этом).

Так генератор или нет, но вам действительно нужен булев, как в решении Бера.

.
3
ответ дан 6 December 2019 в 09:22
поделиться
Другие вопросы по тегам:

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