przekształcić a na chwilę, ale zachować te same właściwości? [duplikować]

Dec 06 2020
def p(l):
    x = True
    y = len(l)

    for z in range(y):
        if (sum(l[z+1:]) == sum(l[:z])):
            x = False
            return z

    if x:
        return -1

Więc chciałbym przekształcić forw moim kodzie a, whileale zachować wszystkie te same właściwości. Czy istnieje sposób, aby to zrobić bez zakłócania kodu?

Odpowiedzi

2 JohnGordon Dec 06 2020 at 03:41

Jeśli chcesz po prostu przekonwertować forpętlę na whilepętlę, te dwie pętle są równoważne:

for x in range(y):
    # do stuff

x = 0
while x < y:
    # do stuff
    x += 1
1 DanielLee Dec 06 2020 at 03:33

Będziesz musiał utworzyć wystąpienie zmiennej z na 0, a następnie możesz użyć pętli while do przerwania, gdy wszystkie elementy l zostaną sprawdzone.

Chociaż w twoim przypadku myślę, że wyrzuci on błąd indexError, gdy spróbuje wykonać l [z + 1], więc będziesz potrzebować y - 1 jako warunku zakończenia.

z = 0
while z < y:
    if (sum(l[z+1:]) == sum(l[:z])):
        x = False
        return z
    z += 1
1 МаксимФомин Dec 06 2020 at 03:34

Twój kod nie ma wcięć, ale wygląda na to, że tak powinno być. Przedział (y) oznacza od 0 do Y-1, tak, że zaczyna się od 0: z = 0i o jeden przyrost z każdej iteracji: z += 1. Ostatnia wartość to y-1, więc musi się zatrzymać, gdy z = y, więc gdy warunki sąz < y

    x = True
    y = len(l)

    # for z in range(y):
    z = 0
    while z < y:
        if (sum(l[z+1:]) == sum(l[:z])):
            x = False
            return z
        z += 1  # increase z value

    if x:
        return -1