Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 3
@Oake: nie znam się na pythonie, ale ogólnie jest zasada, że o ile nie operujesz na iteratorach to nie usuwasz z kolekcji po której iterujesz. Polecam zmienić ostatnie for w drugą stronę, czyli oferować po objects i usuwać z finlst
  • Odpowiedz
@Oake: ale syfiata funkcja... na początek: wykonujesz dwukrotnie split a efekt działania tej funkcji to lista. Następnie to dodajesz do elementów urlst i to już wygląda podejrzanie
  • Odpowiedz
@daszek21: @Igbt: @apo: docieniam chęć pomocy, ale serio zdaję sobie sprawę, że funkcja mogłaby być napisana lepiej, ale pytam o konkretną rzecz, a nie o opinię na temat całego kodu. Cały program służy wyłącznie do celów naukowych, nikt nie będzie z tego korzystał więc chodzi mi po prostu o osiągnięcie danego celu, a po drodze poznanie niektórych mechanizmów języka. Nie skupiam się na nadawaniu nazw zwmiennych, bo nikt tego
  • Odpowiedz
@apo: I urlstr jest nigdzie nie użyte z tego co widzę.

@Oake: Generalnie nigdy nie usuwaj elementów z listy gdy iterujesz po niej. Masz kilka sposobów jak sobie z tym poradzić:
- możesz iterować po kopii tej listy (for p in finlst[:])
- możesz skorzystać z list comprehension
itp.
Zrób sobie mały test. Wrzuć poniżej linijki:

for p in finlst:
linijkę:

print(p)
I zobaczysz, że to p nigdy
  • Odpowiedz
via Wykop Mobilny (Android)
  • 2
@Oake: dlatego napisałem Ci co jest źle. Iterujesz po kolekcji w locie ją modyfikując. Wydaje mi się, że gdybyś w pythonie iterował po kolekcji i w ciele pętli byś appendowal element do tej kolekcji to pętla będzie kręcić się w nieskończoność
  • Odpowiedz
Wydaje mi się, że gdybyś w pythonie iterował po kolekcji i w ciele pętli byś appendowal element do tej kolekcji to pętla będzie kręcić się w nieskończoność


@daszek21: Yep, tak dokładnie by się stało. Wiem to niestety z autopsji, jak wywaliłem kiedyś serwer od testów automatycznych niewinną wydawałoby się funkcją :D
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@venomik: dlatego fajnie jest pisać w Javie i dowiedzieć się o takim błędzie od razu :D a jak już jesteś szaleńcem i chcesz tak działać to musisz zrobić pętlę z iteratorami, a tego nikt nie pamięta, trzeba wygooglowac :D
  • Odpowiedz
@Oake: Dobre praktyki należy stosować od początku, zwłaszcza w kwestii nazewnictwa. Nie oceniam ilości kroków.
Sprawa jest prosta. Iterujesz po oryginalnej liście i usuwasz z niej elementy. Iterator może iść tylko do przodu.

0='https' <= tu jest terator
1='www'
2='wykop'
3='pl'

Iterator ustawia się na pierwszym elemencie, potem na drugim, a w między czasie kasujesz jeden z elementów i lista się przesuwa.

0='www'
1='wykop' <=tu teraz jest iterator.
2='pl'
  • Odpowiedz
@Oake: używasz czasem debugera? jeśli nie to zacznij ( ͡° ͜ʖ ͡°)

**from pudb import settrace

a potem w lini gdzie chcesz rozpocząć debugowanie:

set
trace()**
  • Odpowiedz
@venomik: w tym przypadku mógłbyś na początku kodu tej funkcji wywołać set_trace() i przejść w tryb "step by step" i w ten sposób mógłbyś obserwować jak się zmieniają wartości zmiennych w każdym kroku pętli i pewnie byś zauważył w którym miejscu dzieją się "dziwne rzeczy" :)
  • Odpowiedz