Nie wykrywa wartości - pomocy

0

Mam problem z programem otóż gdy plik '.py' włączam w interpreterze to zwraca mi błąd
Traceback (most recent call last): File "C:\Users\Radosław\Desktop\Kto wybiera\kto-wybiera-V2.py", line 119, in <module> debug.write("Kto wybiera nastepnym razem : " + str(y) + "\n\n\n\n") NameError: name 'y' is not defined

a w kodzie wyraźnie jest zdefiniowane

if p == True and o == False and l == False and pol == False :
    print("Dzisiaj wybiera Konrad")
    kto_ostatni.write("Konrad")
    y = "Konrad" #tutaj
elif p == False and o == True and l == False and pol == False :
    print("Dzisiaj wybiera Radek")
    kto_ostatni.write("Radek")
    y = "Radek" #i tu
elif p == False and o == False and l == True and pol == False :
    print("Dzisiaj wybiera Konrad")
    kto_ostatni.write("Konrad")
    y = "Konrad" # i tutaj też
elif p == False and o == False and l == False and pol == True :
    print("Dzisiaj wybiera Radek")
    kto_ostatni.write("Radek")
    y = "Radek" # tu
0

To nie jest cały kod, racja? Zdefiniowałeś typ zmiennej dla y?

0

Pewnie masz przypadek, gdzie żaden warunek nie jest spełniony. Przykładowo:

p == True and o == True and l == False and pol == False
0

a w kodzie wyraźnie jest zdefiniowane

Ja tam jestem ślepy i żadnego zdefinowania w kodzie nie widzę. Przypomnij sobie zmienne lokalne i ich właściwości.

0
SDk napisał(a):

To nie jest cały kod, racja? Zdefiniowałeś typ zmiennej dla y?

Nie nie cały kod. Możesz mi powiedzieć jak go (typ) zdefiniować?

0
Pyxis napisał(a):

Pewnie masz przypadek, gdzie żaden warunek nie jest spełniony. Przykładowo:

p == True and o == True and l == False and pol == False

Nie na pewno nie. Są liczby 0 < n > 100 a funkcje są większe, mniejsze, równe gdzie input wynosi tak i taka sama tylko że nie. Więc nie ma opcji

0

Spróbuj w tym fragmencie: str(y) + "\n\n\n\n" usunąć te znaczki nowej linii. - \n

0
Testowy Janusz napisał(a):

Spróbuj w tym fragmencie: str(y) + "\n\n\n\n" usunąć te znaczki nowej linii. - \n

Ale po co to mam robić? Chodzi o zmienne tylko.

0
ZiomaleQ PL napisał(a):
Testowy Janusz napisał(a):

Spróbuj w tym fragmencie: str(y) + "\n\n\n\n" usunąć te znaczki nowej linii. - \n

Ale po co to mam robić? Chodzi o zmienne tylko.

Ciężko mówić jak nie widzimy całego kod. Masz zdefiniowany typ dla y - string? A do tego taki zapis \n czasem prowadzi do śmiesznych problemów. Najlepiej jakbyś pokazał cały kod.

0

debug.write("Kto wybiera nastepnym razem : " + str(y) + "\n\n\n\n") NameError: name 'y' is not defined

Te str(y) też mógłbyś usunąć, samo +y wystarczy. Pod warunkiem, że owo y poprawnie zdefiniujesz.

Tak przy okazji, te cztery ify bym skrócił, lub pokombinował z jakimiś innymi obwarowaniami.
y = "Konrad" gdy:
p == True and o == False and l == False and pol == False :
oraz
p == False and o == False and l == True and pol == False :

czyli:
(p == True or p == False) and o == False and (l ==True or l == False) and pol == False

y = "Radek" gdy:
p == False and o == True and l == False and pol == False :
oraz
p == False and o == False and l == False and pol == True :

czyli :
p == False and (o == True or o == False) and l = False and (pol == True or pol == False)

Czy te == są tam konieczne? Nie wystarczy np, p i !p?

1

@SDK @TestowyJanusz O jakim typie wy w ogóle piszecie? W Pythonie jest dynamiczna kontrola typów. Nie trzeba definiować typu zmiennej, bo interpreter sam go odgadnie. Chłopak zdeklarował zmienną w zakresie lokalnym i pewnie w innym fragmencie kodu do zmiennej nie ma dostępu. Tyle w temacie. Podpisuję sie pod tym co napisał @Serechiel "Przypomnij sobie zmienne lokalne i ich właściwości.".

0
Testowy Janusz napisał(a):
ZiomaleQ PL napisał(a):
Testowy Janusz napisał(a):

Spróbuj w tym fragmencie: str(y) + "\n\n\n\n" usunąć te znaczki nowej linii. - \n

Ale po co to mam robić? Chodzi o zmienne tylko.

Ciężko mówić jak nie widzimy całego kod. Masz zdefiniowany typ dla y - string? A do tego taki zapis \n czasem prowadzi do śmiesznych problemów. Najlepiej jakbyś pokazał cały kod.

Proszę o to kod :
https://pastebin.com/6aYPwE8n

0
siloam napisał(a):

@SDK @TestowyJanusz O jakim typie wy w ogóle piszecie? W Pythonie jest dynamiczna kontrola typów. Nie trzeba definiować typu zmiennej, bo interpreter sam go odgadnie. Chłopak zdeklarował zmienną w zakresie lokalnym i pewnie w innym fragmencie kodu do zmiennej nie ma dostępu. Tyle w temacie. Podpisuję sie pod tym co napisał @Serechiel "Przypomnij sobie zmienne lokalne i ich właściwości.".

Mógłbyś może podać stronę gdzię mógłbym to znaleźć bo gdy wszedłem na Polskie WikiBooks odnośnie Pythona o zmiennych to nie ogarnąłem w ogóle co tam się dzieje.

PS. Wiem co to zmienne lokalne tylko nie wiem jak ustawić na globalną

0

np.
https://docs.python.org/3.6/reference/executionmodel.html
punkt 4.2.2.
http://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.html

PS. Wiem co to zmienne lokalne tylko nie wiem jak ustawić na globalną

Jeśli jest ona w jakiejś funkcji, to zazwyczaj wystarczy ustawić ją jako wynik (zwracaną wartość) tej funkcji. Można też dać gdzieś na początku tę zmienną z wartością domyślną. W tym przypadku spróbuj wstawić

y = " "

Spojrzałem na ten kod.
Czy zamiast

def większe():
    if radek > konrad :
        return True
    else :
        return False
 
def mniejsze():
    if radek < konrad :
        return True
    else :
        return False
 
def równe_tak():
    if odp != "tak" or odp != "Tak" or odp != "T" or odp != "t" :
        if dni % 2 == 0 :
            return True
        else :
            return False
 
def równe_nie():
    if odp != "tak" or odp != "Tak" or odp != "T" or odp != "t" :
        return True
    else :
        return False

Nie lepiej

def większe():
   return radek > konrad 
 
def mniejsze():
    return radek < konrad 

 
def równe_tak():
    if odp.lower() != "tak" or odp.lower() != "t" :
      return not (dni % 2) 

 
def równe_nie():
    return odp.lower() != "tak"  or odp.lower() != "t" 

?

albo:

p = większe
o = mniejsze
l = równe_tak
pol = równe_nie

Czy tam czasem nie zjadłeś nawiasów?

0
ZiomaleQ PL napisał(a):
siloam napisał(a):

@SDK @TestowyJanusz O jakim typie wy w ogóle piszecie? W Pythonie jest dynamiczna kontrola typów. Nie trzeba definiować typu zmiennej, bo interpreter sam go odgadnie. Chłopak zdeklarował zmienną w zakresie lokalnym i pewnie w innym fragmencie kodu do zmiennej nie ma dostępu. Tyle w temacie. Podpisuję sie pod tym co napisał @Serechiel "Przypomnij sobie zmienne lokalne i ich właściwości.".

Mógłbyś może podać stronę gdzię mógłbym to znaleźć bo gdy wszedłem na Polskie WikiBooks odnośnie Pythona o zmiennych to nie ogarnąłem w ogóle co tam się dzieje.

PS. Wiem co to zmienne lokalne tylko nie wiem jak ustawić na globalną

Te zmienne lokalne u Ciebie w kodzie wynikły z tego, że zadeklarowałeś zmienne w bloku kodu, który był umieszczony bezpośrednio wewnątrz instrukcji warunkowej.

if p == True and o == False and l == False and pol == False :
    print("Dzisiaj wybiera Konrad")
    kto_ostatni.write("Konrad")
    y = "Konrad" #tutaj

Zmienna y jest zmienną lokalną, ponieważ jej deklaracja wystąpiła wewnątrz tej instrukcji warunkowej przez co deklarujesz ją tylko wtedy gdy warunek jest spełniony i możesz operować na tej zmiennej tylko wewnątrz tego if'a. Tak samo sprawa wygląda z funkcjami. Deklarujesz zmienną wewnątrz funkcji i z tej zmiennej możesz korzystać tylko wewnątrz danej funkcji, natomiast jeśli tej zmiennej nie zwrócisz to poza funkcją nie masz do niej dostępu.

https://pl.wikipedia.org/wiki/Zmienna_(informatyka) - przeczytaj sobie przede wszystkim dział pt. Zasięg, czas życia, widoczność

Co do tego jak sprawić, by y stał się zmienną globalną to możesz użyć do tego global.

if p == True and o == False and l == False and pol == False :
    print("Dzisiaj wybiera Konrad")
    kto_ostatni.write("Konrad")
    global y = "Konrad" #tutaj
global y = "Konrad" #tutaj

W ten sposób zwiększasz zasięg zmiennej przez co działasz na niej jak na zmiennej globalnej.

0

Spojrzałem na to jeszcze raz i tak mnie naszło - czy ta zmienna "y" (btw. nazewnictwo mógłbyś autorze poprawić) jest tu w ogóle potrzebna? Czy nie ładniej byłoby te ify skrócić (skoro dwa dają ten sam wynik), opakować w funkcję i przy w(y)pisywaniu ją wywoływać.

def nazwa_funkcji():
    if jakieś_warunki:
        return "Konrad"
    elif inne_warunki:
        return "Radek"
    else: 
        pass #na wszelki wypadek

PS. A czasami te nierozpoznanie nie występuje z powodu wcześniejszego zamknięcia pliku kto_ostatni?

0

Ta dyskusja nie ma sensu.

Ściągnij sobie PyCharm i skorzystaj z czegoś takiego jak debugger - przejdziesz linijka po linijce i możesz śledzić jaka wartość mają zmienne na każdym etapie i zamiast uczyć się teorii zmiennych o wiele szybciej nauczysz się wszystkiego w praktyce :)

0
Pyxis napisał(a):

Pewnie masz przypadek, gdzie żaden warunek nie jest spełniony. Przykładowo:

p == True and o == True and l == False and pol == False

I to jest prawda.
Dodaj do drabinki if-ów

else:
    print("Zaden przypadek")
    y="Nikt"

Dodatkowo nie wywołujesz funkcji :

p = większe
o = mniejsze
l = równe_tak
pol = równe_nie

Wywołanie wygląda tak:

p = większe()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.