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

Jak zmienić wartość zmiennej za pomocą funkcji?

Object Storage Arubacloud
+1 głos
667 wizyt
pytanie zadane 10 września 2021 w Python przez Hajpa Użytkownik (880 p.)
Witam,

 

To pewno jest proste, ale może mi to ktoś jeszcze bardziej wyklarować?

Jak zrobić, żeby nie używać global?

Przykład:

 

hp = 10

 

def zdrowie():

  hp = hp -5

 

zdrowie(hp)

print(hp)

 

Wiem, że zmienna w funkcji jest widoczna tylko w funkcji, ale przecież jakoś można to zrobić?

pomóżcie!

4 odpowiedzi

+1 głos
odpowiedź 10 września 2021 przez TerryLocks Użytkownik (590 p.)

W funkcji musisz dać argument co chcesz zmienić, jeśli zmienną hp chcesz zmieniać to musisz "powiedzieć" tej funkcji "hej zmień wartość w tej zmiennej" czyli coś takiego:

hp = 50

def zdrowie(hp):
	hp = 10
	return hp

print(hp) # printuje pierwotna wartosc
print(zdrowie(hp)) # zwraca nowa nadpisana wartosc

żeby sprawdzić czy faktycznie zmieniasz wartosc w zmiennej hp odpal sobie to:

hp = 50

def zdrowie(hp):
	if hp == 50:
		print("Wartosc pierwotna")
	else:
		print("Nowa wartosc")
	return hp

#print(hp) # printuje pierwotna wartosc
print(zdrowie(hp)) # zwraca nowa nadpisana wartosc

zanim odpalisz ten kod zmien wartosc zmiennej hp u gowry na dowolna.

Mam nadzieje ze pomoglem ;)

0 głosów
odpowiedź 10 września 2021 przez adrian17 Ekspert (344,860 p.)

Wiem, że zmienna w funkcji jest widoczna tylko w funkcji, ale przecież jakoś można to zrobić?

Nie, nie da się tak robić. Zamiast tego, najlepiej zwróć nową wartość i przypisz ją do zmiennej.

def uderz(hp):
    return hp - 5

hp = 10
hp = uderz(hp)
print(hp) # 5

Albo owiń wszystko w obiekt i modyfikuj pole obiektu:

class Postac:
    def __init__(self):
        self.hp = 10

def uderz(postac):
    postac.hp = postac.hp - 5

postac = Postac()
uderz(postac)
print(postac.hp) # 5

lub

class Postac:
    def __init__(self):
        self.hp = 10
    def uderz(self):
        self.hp = self.hp - 5

postac = Postac()
postac.uderz()
print(postac.hp) # 5

 

komentarz 16 września 2021 przez manjaro Nałogowiec (37,390 p.)
No raczej tylko to na samym dole jest wzorcowo i tylko tą ścieżką powinien iść autor tematu. Inne drogi na skróty z omijaniem obiektówki nie są dobre.
2
komentarz 16 września 2021 przez adrian17 Ekspert (344,860 p.)

Inne drogi na skróty z omijaniem obiektówki nie są dobre.

Tutaj sugerujesz że obiektówka to jedyne słuszne podejście. Podejście funkcyjne (#1) ze zwróceniem nowej wartości też jest jak najbardziej sensowne, to po prostu inna filozofia. Podejście #2 z prostymi strukturami (Postac to może być dataclass, namedtuple etc) też jak jak najbardziej poprawne.

komentarz 16 września 2021 przez manjaro Nałogowiec (37,390 p.)
Sugerujesz że postaci w grach komputerowych są na namedtuplach a nie obiektach? ;)
1
komentarz 16 września 2021 przez adrian17 Ekspert (344,860 p.)
Jak chcesz iść tą drogą, to zazwyczaj nie są też pisane w Pythonie :V

Mówię tutaj bardziej o pisaniu Pythona, a nie gier (bo "hp" było w końcu tylko przykładem).
komentarz 16 września 2021 przez manjaro Nałogowiec (37,390 p.)
Jednak jest też sporo gier pisanych w Pythonie, może to nie są wielkie tytuły ale jednak są. I jakby nie było są robione na klasach ;)
0 głosów
odpowiedź 16 września 2021 przez Hajpa Użytkownik (880 p.)
Dziękuję za odpowiedzi. Teraz zaczyna to mieć sens :)

pozdrawiam
–3 głosów
odpowiedź 10 września 2021 przez Chess Szeryf (76,710 p.)
edycja 10 września 2021 przez Chess
func x(arg):
  return arg-5;
  
print x(30);

Poczytaj także o referencjach na zmienne.

<?php
        //Enter your code here, enjoy!

$a = 500;
function func1(&$a) {
  $a = 200;
    
}
func1($a);
echo $a;


$b = 500;
function func2($b) {
  $b = 200;
    
}
func2($b);
echo $b;
?>

live example

komentarz 10 września 2021 przez adrian17 Ekspert (344,860 p.)

Poczytaj także o referencjach na zmienne.

Nie ma czegoś takiego w Pythonie.

Podobne pytania

+1 głos
1 odpowiedź 304 wizyt
pytanie zadane 25 lutego 2020 w Python przez PIxEL Nowicjusz (180 p.)
+1 głos
1 odpowiedź 401 wizyt
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 9 lipca 2020 w JavaScript przez Bakkit Dyskutant (7,600 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 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!

...