• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kod w pythonie nie kompiluje się

Object Storage Arubacloud
0 głosów
161 wizyt
pytanie zadane 30 grudnia 2023 w Python przez GodNorth Nowicjusz (150 p.)

 

def poczta_polska(lista_klientow):
    kolejka = []
    lista_wyjscia = []

    for klient in lista_klientow:
        kolejka.append(klient)

    while kolejka:
        osoba = kolejka.pop(0)

        if osoba[1] == True:
            kolejka.append(osoba)
        else:
            lista_wyjscia.append(osoba[0])

    return lista_wyjscia

lista_klientow = [("Anna", False), ("Bartek", True), ("Cezary", False), ("Dorota", True), ("Ewa", False)]

wynik = poczta_polska(lista_klientow)
print(wynik)

 

Dlaczego wynik się nie wyświetla po kompilacji?

2 odpowiedzi

+2 głosów
odpowiedź 30 grudnia 2023 przez adrian17 Ekspert (344,860 p.)
 
Najlepsza
Nie rozumiem co ten kod ma robić, ale no - masz pętlę która nigdy się nie kończy. Pętla czeka aż kolejka będzie pusta, ale ciągle wyciągasz i wstawiasz z powrotem te same osoby (z True).

EDIT: btw, tutaj nie ma co mówić o kompilacji, po prostu mówisz o odpaleniu programu/skryptu ;)
–1 głos
odpowiedź 30 grudnia 2023 przez VBService Ekspert (253,400 p.)
edycja 30 grudnia 2023 przez VBService

Python "zawiera" dużo "fajnych" i bardzo przydatnych funkcji w swojej składni, może rozważ użycie jednej z nich jak np. map i jak drugi parametr użyj filter, wtedy możemy zapisać np. tak:

[ działający kod on-line ]

def poczta_polska(lista_klientow):
    # Używamy filter, aby wybrać klientów z drugim parametrem równym False
    lista_wyjscia = list(map(lambda x: x[0], filter(lambda x: not x[1], lista_klientow)))
    
    return lista_wyjscia

lista_klientow = [("Anna", False), ("Bartek", True), ("Cezary", False), ("Dorota", True), ("Ewa", False)]

wynik = poczta_polska(lista_klientow)
print(wynik)

 

BTW, 

Dlaczego wynik się nie wyświetla po kompilacji?

python jest językiem interpretowanym, więc nie ma mowy o kompilacji jako takiej, choćby znanej z np. C++, przy uruchamianiu kodu. wink

2
komentarz 30 grudnia 2023 przez adrian17 Ekspert (344,860 p.)

Ja wciąż nie wiem co ten oryginalny kod nawet miał robić, więc nie chciałem proponować przepisywania na cokolwiek. Twój strzał jest... może i dobry, ale wciąż strzał ;)

A inna sprawa ze to

lista_wyjscia = list(map(lambda x: x[0], filter(lambda x: not x[1], lista_klientow)))

to jest jakiś potworek który prędzej by ktoś napisał specjalnie żeby sparodiować Pythona i zniechęcić ludzi do używania map/filter :P Normalnie by się to zapisało jako po prostu

lista_wyjscia = [klient[0] for klient in lista_klientow if not klient[1]]

 

 

1
komentarz 30 grudnia 2023 przez VBService Ekspert (253,400 p.)
edycja 30 grudnia 2023 przez VBService

IMO, Ja, osobiście wolę w dużej większości przypadków używać map.

When should I use a Map instead of a For Loop?

Może i ten przykład był za prosty, i masz rację, że może "nadużyłem" map, i z przyzwyczajenia "pojechałem" z mapwink, ale zawsze mam "z tyłu głowy", że python to język interpretowany, więc wbudowane funkcje są skompilowane i powinny działać szybciej z definicji, a pętla for w kodzie jest interpretowana, ale nie będę się upierał. smiley

1
komentarz 30 grudnia 2023 przez adrian17 Ekspert (344,860 p.)
edycja 30 grudnia 2023 przez adrian17

When should I use a Map instead of a For Loop?

Pierwsza odpowiedź: "map is useful when you want to apply the function to every item of an iterable". Ale tutaj nie miałeś z góry gotowej funkcji jak `int`, tylko musiałeś zadeklarować lambdę, nawet dwie.

Druga odpowiedź: benchmark, comprehension najszybszy (a od 3.12 jeszcze szybszy, bo dodali comprehension inlining, PEP 709)

Trzecia odpowiedź: "Just use list comprehensions: they're more pythonic". No i ten punkt że można trywialnie je konwertować między listami i generatorami też słuszny.

;)

PS:

więc wbudowane funkcje są skompilowane i powinny działać szybciej z definicji, a pętla for w kodzie jest interpretowana, ale nie będę się upierał

Różnica polega na tym, że z map() masz lambdę `lambda x: x[0]`, którą trzeba wywołać hipotetycznie 100000 razy - a overhead wołania Pythonowych funkcji jest nietrywialny. "x[0]" to w końcu wciąż kod, który trzeba zinterpretować. (byłoby odrobinę lżej z itemgetter(0)) A przy comprehension kompilator od razu tworzy pętlę z ciałem wykonującą append x[0] 100000 razy, bez wołania żadnych pośrednich funkcji.

 

Podobne pytania

0 głosów
3 odpowiedzi 519 wizyt
0 głosów
2 odpowiedzi 152 wizyt
pytanie zadane 17 stycznia 2017 w Python przez DillingerJ0nny Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 347 wizyt
pytanie zadane 15 listopada 2021 w Python przez DaXari Początkujący (280 p.)

92,579 zapytań

141,430 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...