Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Petla for czy while ?

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Caporeira



Dołączył: 26 Lis 2015
Posty: 45

PostWysłany: Pią Kwi 07, 2017 11:18 am  OP    Temat postu: Petla for czy while ? Odpowiedz z cytatem Pisownia

Witam,

chce wykonać pętle. Wpisuje ile razy ta pętla ma się wykonać, ale w niej usuwam elementy i wtedy ilość wykonania się tej pętli się zmienia i dostaję błąd że range się nie zgadza.

pierwszy wariant z pętlą for:
Kod:
    def not_need(self):
        for l in range(len(result)):                                            
            if 'string' in str(result[l]):
                del result[l]



i drugi wariant z petłą while:
Kod:
    def not_need(self):
        l = 0
        range = len(result)
        while range > l:                                              
            if 'string' in str(result[l]):
                del result[l]
                l -= 1
            l += 1


Ale niestety oba warianty nie działają. Pytanie, gdzie tutaj jest błąd ? Jak to zrobić poprawnie ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hurgadion



Dołączył: 06 Kwi 2011
Posty: 776
Skąd: Web :)

PostWysłany: Pią Kwi 07, 2017 2:25 pm      Temat postu: Odpowiedz z cytatem Pisownia

Hej,
może wystarczy taka linijka:
Kod:

result = list(filter(lambda x: not 'string' in x, result))


Pozdrawiam :)

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
nowator



Dołączył: 16 Sty 2010
Posty: 212
Skąd: Częstochowa

PostWysłany: Pią Kwi 07, 2017 5:06 pm      Temat postu: Odpowiedz z cytatem Pisownia

@hurgadion

Nawet lepiej pozbyć się funkcji filter i załatwić to list comprehension( jeśli to Python 3+ ). Natomiast w przypadku starszej wersji Pythona raczej wolałbym użyć filter z racji tego, iż zwracany typ to lista, a nie iterator jak w przypadku wyższej wersji Pythona.

@Caporeira

Na pierwszy rzut oka widać, iż jesteś nowy w Pythonie, z racji konstrukcji pętli jakie robisz( for i while ). Warto spojrzeć na jakiś tutorial by skorzystać z możliwości tego języka. Co do while to rzadko, kiedy mam sposobność, użyć tej pętli. Zazwyczaj jeśli mam zrobić pętle zadaje sobie pytanie czy jestem w stanie określić ile razy pętla powinna się wykonać. Jeśli odpowiedź brzmi tak, to używam for, natomiast, kiedy nie jestem w stanie tego określić, wtedy używam while. Chodź czasem są wyjątki i inne rozwiązania.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
hurgadion



Dołączył: 06 Kwi 2011
Posty: 776
Skąd: Web :)

PostWysłany: Pią Kwi 07, 2017 5:20 pm      Temat postu: Odpowiedz z cytatem Pisownia

chyba masz rację, zwykłe comprehension powinno wystarczyć... ale nie wiem czy wymaganie 3+ jest konieczne... dla 3- nie będzie pracować to rozwiązanie ??
_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
nowator



Dołączył: 16 Sty 2010
Posty: 212
Skąd: Częstochowa

PostWysłany: Sob Kwi 08, 2017 10:47 am      Temat postu: Odpowiedz z cytatem Pisownia

Funkcja filter w Pythonie < 3 zwraca listę, ale nic się nie stanie jak listę rzutuję się na listę.

List comprehension działa dla Pythona > 3 w tym przypadku szybciej, ponieważ nie musisz tworzyć listy z iteratora. Natomiast jeśli taka lista w dalszej części programu była by iterowana, wtedy można by zapisać sobie tylko iterator i to jego używać, bez rzutowania go na listę. To są naprawdę groszowe sprawy, ale jeśli dotyczy to jakiegoś bardzo dużego skrytpu dla którego prowadzisz continous integration, gdzie zbierasz różnego rodzaju metryki. Da się zauważyć, poprawę wydajności, kiedy cały team wykorzystuje z głową to co ma Python najlepszego.

Mała porcja kodu do przeanalizowania( Python 3.6):
Kod:
>>> import timeit
>>> list1 = [x for x in range(int(1e3))]
>>> list2 = [x for x in range(int(1e3))]
>>> timeit.timeit("list(filter(lambda x: x % 3, list1))", globals=globals(), number=int(1e3))
0.128839389296445
>>> timeit.timeit("[x for x in list2 if x % 3]", globals=globals(), number=int(1e3))
0.06439451648464001

Ale
Kod:
>>> import timeit
>>> list1 = [x for x in range(int(1e3))]
>>> list2 = [x for x in range(int(1e3))]
>>> list1_it = filter(lambda x: x % 3, list1)
>>> list2_lc = [x for x in list2 if x % 3]
>>> code1 = """\
for item in list1_it:
    item += 1
    """
>>> timeit.timeit(code1, globals=globals(), number=int(1e3))
0.0001956519718078198
>>> code2 = """\
for item in list2_lc:
    item += 1
    """
>>> timeit.timeit(code2, globals=globals(), number=int(1e3))
0.032042661110608606


Także, w Pythonie < 3 list comprehension i filter działało tak samo. Natomiast w Pythonie > 3 mamy o wiele większą gamę możliwości do różnych zastosowań.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
hurgadion



Dołączył: 06 Kwi 2011
Posty: 776
Skąd: Web :)

PostWysłany: Sob Kwi 08, 2017 12:00 pm      Temat postu: Odpowiedz z cytatem Pisownia

hmmm,
ciekawe spostrzeżenie... nawet bardzo... swoją drogą trochę to dziwne, że nie wykorzystują przy implementacji funkcji filter zwykłego comprehension... bo w tym przypadku narzuca się takie rozwiązanie... może warto zrobić poprawkę w kodzie źródłowym ? nie wiem... :)

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
nowator



Dołączył: 16 Sty 2010
Posty: 212
Skąd: Częstochowa

PostWysłany: Sob Kwi 08, 2017 12:19 pm      Temat postu: Odpowiedz z cytatem Pisownia

To jest celowe usprawnienie w Pythonie > 3. Jestem pewien, że w jakimś PEP'ie znajdziesz dokładne usprawiedliwienie. W starszej wersji Pythona miałeś funkcje filter działającą jak list comprehension, było okej. Ale filtrowanie jest na tyle prostą sprawą, że można samemu to zrobić bez wbudowanej funkcji. A tą wbudowaną funkcję, zostawić i przeznaczyć do bardziej zaawansowanych rzeczy. Jak jeszcze raz spojrzysz na ten drugi kod co podałem we wcześniejszym poście - zobaczysz, że jest zastosowanie w którym zwracanie iteratora jest o wiele bardziej wydajne. Tak, więc nowa implementacja funkcji jest jak najbardziej na miejscu. Jak chciałbyś więcej zrozumieć, to warto zapoznać się z generatorami w Pythonie.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
hurgadion



Dołączył: 06 Kwi 2011
Posty: 776
Skąd: Web :)

PostWysłany: Sob Kwi 08, 2017 12:33 pm      Temat postu: Odpowiedz z cytatem Pisownia

dzięki... to dość istotne... jeżeli coś działa 16 razy szybciej, to na pewno jest warte uwagi... u mnie działa kilkadziesiąt razy szybciej... a dla 1e5... nawet 150 razy szybciej... jak dla mnie to jest zaskakująca dysproporcja...
_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Caporeira



Dołączył: 26 Lis 2015
Posty: 45

PostWysłany: Sob Kwi 08, 2017 8:31 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzięki Panowie!
W poniedziałek będę to testował i znam relacje.

PS. Może polecicie jakiś dobry kurs Python ? I sposób nauki ? Aby nie nabrać złych nawyków.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
nowator



Dołączył: 16 Sty 2010
Posty: 212
Skąd: Częstochowa

PostWysłany: Sob Kwi 08, 2017 11:35 pm      Temat postu: Odpowiedz z cytatem Pisownia

Również dziękuje. Mam nadzieje, że zostawisz feedback, co jest bardzo przydatne dla nowych użytkownicmów.

Polecane ?
Stackoverflow zapewnia duzo wiedzy, ale to nie jest grzechem zapytac sie o wiedze. Ja polecam czytać "PEPY".
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Python Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.03137 sekund, zapytan = 12
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |