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

Zmienne globalne ale w Pythonie

+2 głosów
728 wizyt
pytanie zadane 24 maja 2024 w Python przez HUBSON2912 Obywatel (1,560 p.)

Witam,

uczę się Pythona po tym jak już znam C++. W C++ można było tworzyć zmienne globalne - zmienne dostępne w każdym fragmencie kodu. Czasem się przydawało. Czy w Pythonie też jest coś takiego? Próbuję użyć zmiennej utworzonej przed funkcją wewnątrz tej funkcji, ale nie zawsze działa.

Przykład (swoją drogą: kto normalny zlicza liczby parzyste rekurencyjnie):

liczby=[1,5,6,3,8,7,9,6,4,5,2,3,0]
licznik=0
def ileParzystych(i):
    if i>=len(liczby):
        return licznik
    if liczby[i]%2==0:
        licznik+=1
        ileParzystych(i+1)
print(ileParzystych(0))

PyCharm podkreśla mi oba wywołania zmiennej licznik jako błąd, a wyświetla mi w odpowiedzi None.

Z góry dzięki

3 odpowiedzi

+1 głos
odpowiedź 24 maja 2024 przez toko Dyskutant (8,370 p.)
wybrane 25 maja 2024 przez HUBSON2912
 
Najlepsza

Jeśli się nie mylę, musisz dopisać na poczatku funkcji:

global liczby, licznik

(nie jestem pewny) (sprawdzę jak wroce do domu)

komentarz 24 maja 2024 przez HUBSON2912 Obywatel (1,560 p.)
Wciąż odpowiedź None, ale dzięki za chęci
1
komentarz 24 maja 2024 przez toko Dyskutant (8,370 p.)
bruh, masz o jedno wcięcie za dużo przy rekurencyjnym wywołaniu
komentarz 25 maja 2024 przez HUBSON2912 Obywatel (1,560 p.)
Faktycznie, teraz działa poprawnie, dzięki
+3 głosów
odpowiedź 24 maja 2024 przez Wiciorny Ekspert (283,300 p.)

Wydaje mi się, chociaż w pyhtonie

liczby = [1, 5, 6, 3, 8, 7, 9, 6, 4, 5, 2, 3, 0]

def ileParzystych(i, licznik=0):
    if i >= len(liczby):
        return licznik
    if liczby[i] % 2 == 0:
        licznik += 1
    return ileParzystych(i + 1, licznik)

print(ileParzystych(0))

nie pisze, że brakuje return w wywołaniu rekurencyjnym. Oraz wcięcie było nieco za daleko, ale wtedy byłby inny błąd. 
Testowane tu https://www.online-python.com/

Wersja z zachowaniem globalnej zmiennej  

liczby = [1, 5, 6, 3, 8, 7, 9, 6, 4, 5, 2, 3, 0]
licznik = 0

def ileParzystych(i):
    global licznik
    if i >= len(liczby):
        return licznik
    if liczby[i] % 2 == 0:
        licznik += 1
    return ileParzystych(i + 1)

print(ileParzystych(0))
  •  global licznik wewnątrz funkcji, aby wskazać, że funkcja będzie korzystać z globalnej zmiennej licznik.

 

+2 głosów
odpowiedź 25 maja 2024 przez VBService Ekspert (256,580 p.)

Jest jeszcze możliwy zapis bez użycia licznika

def ileParzystych(i=0):
    if i >= len(liczby):
        return 0
    if liczby[i] % 2 == 0:
        return 1 + ileParzystych(i + 1)
    else:
        return ileParzystych(i + 1)

choć jest on nieznacznie wolniejszy** od wersji, którą zaproponował @Wiciorny

def ileParzystych(i, licznik=0):
    if i >= len(liczby):
        return licznik
    if liczby[i] % 2 == 0:
        licznik += 1
    return ileParzystych(i + 1, licznik)

 

 

 

** Test
- Procesor: Intel i7-9750H @ 2.60GHz
- Pamięć: 16GB @ 2400MHz
- Python 3.11.5

 

 

import time

liczby = [1, 5, 6, 3, 8, 7, 9, 6, 4, 5, 2, 3, 0] * 50

# Wersja z licznikiem
def ileParzystych_z_licznikiem(i=0, licznik=0):
    if i >= len(liczby):
        return licznik
    if liczby[i] % 2 == 0:
        licznik += 1
    return ileParzystych_z_licznikiem(i + 1, licznik)

# Wersja bez licznika
def ileParzystych_bez_licznika(i=0):
    if i >= len(liczby):
        return 0
    if liczby[i] % 2 == 0:
        return 1 + ileParzystych_bez_licznika(i + 1)
    else:
        return ileParzystych_bez_licznika(i + 1)

# Wersji z licznikiem
start_time = time.time()
ileParzystych_z_licznikiem()
time_z_licznikiem = time.time() - start_time

# Wersji bez licznika
start_time = time.time()
ileParzystych_bez_licznika()
time_bez_licznika = time.time() - start_time

print(f"Czas wykonania wersji z licznikiem: {time_z_licznikiem:.10f} sekundy")
print(f"Czas wykonania wersji bez licznika: {time_bez_licznika:.10f} sekundy")

 

Podobne pytania

+1 głos
1 odpowiedź 717 wizyt
pytanie zadane 26 czerwca 2020 w C i C++ przez Kacperek_code Obywatel (1,690 p.)
0 głosów
3 odpowiedzi 1,081 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)
0 głosów
0 odpowiedzi 304 wizyt
pytanie zadane 21 listopada 2020 w Systemy operacyjne, programy przez Nikto0 Użytkownik (500 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...