Nie wykrywa wartości - pomocy

Nie wykrywa wartości - pomocy
ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
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

Kopiuj
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?

Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:17 minut
0

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

Kopiuj
p == True and o == True and l == False and pol == False
SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
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.

ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
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ć?

ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
0
Pyxis napisał(a):

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

Kopiuj
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

ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
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.

SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
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?

edytowany 5x, ostatnio: Serechiel
siloam
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 2 lata
  • Postów:99
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.".


edytowany 3x, ostatnio: siloam
enedil
if nie tworzy własnej przestrzeni nazw, w przeciwieństwie do (przykładowo) ciała funkcji.
siloam
@enedil nie wiem czy zauważyłeś, ale to jest tylko fragment kodu (zakładam, że funkcji)
enedil
Autor wątku podał link do pełnego kodu, na nim się bazowałem. https://4programmers.net/Forum/1440620
enedil
Niemniej, nie zmienia to faktu, że to jest bez znaczenia, bo wedle Twojego wyjaśnienia, taki kod by nie zadziałał: def foo(): if True: y = 3 return y
siloam
Pardon. Nie zaglądałem do całego kodu. Według mojego wyjaśnienia np. kod def foo(): a=1 if a==1: return a def bar(): b=1 c=a+b return c by nie działał.
ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
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

ZP
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:38
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ą

SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
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ć

Kopiuj
y = " "

Spojrzałem na ten kod.
Czy zamiast

Kopiuj
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

Kopiuj
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:

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

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

edytowany 3x, ostatnio: Serechiel
Shizzer
  • Rejestracja:prawie 8 lat
  • Ostatnio:4 miesiące
  • Postów:231
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.

Kopiuj
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.

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

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


enedil
nie, nie masz racji, Python to nie C++, if nie tworzy własnego zakresu nazw (w przeciwieństwie do ciał funkcji) Mogłeś to chociaż sprawdzić. Wiesz, najlepiej usuń tego posta, bo wszystko w nim jest błędne, a przynajmniej zwodnicze.
siloam
Co go global to mam mieszane uczucia. Niewłaściwe jej stosowanie tylko zaśmieca globalną przestrzeń nazw.
Shizzer
Nie mam możliwości usunięcia posta. Dzięki za zwrócenie uwagi
SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
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ć.

Kopiuj
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 :)

MD
  • Rejestracja:około 8 lat
  • Ostatnio:około 14 godzin
  • Lokalizacja:Wrocław
  • Postów:45
0
Pyxis napisał(a):

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

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

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

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

Dodatkowo nie wywołujesz funkcji :

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

Wywołanie wygląda tak:

Kopiuj
p = większe()
edytowany 1x, ostatnio: mdolata
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)