Python fonksiyon'un içinde olan variable için "Name is not defined" hatası

Katılım
26 Haziran 2019
Mesajlar
6.081
Makaleler
5
Çözümler
59
Merhaba. Başlık

Python fonksiyonun içinde olan variable için "NameError: Name is not defined" hatası​

olacaktı ama yanlış yazmışım.

İlk önce yazdıklarımı paylaşayım:

[CODE lang="python" title="Fonksiyon'um"]

def elo_sor():
rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

flag = 1
while (flag):
try:
rapid = int(rapid)
print("Güzel.")
flag = 0
except ValueError:
print("Bir sayı girmelisiniz!!!")
rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")


blitz = input("Blitz ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")


flag = 1
while (flag):
try:
blitz = int(blitz)
print("Güzel.")
flag = 0
except ValueError:
print("Bir sayı girmelisiniz!!!")
blitz = input("Blitz ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

bullet = input("Bullet ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")


flag = 1
while (flag):
try:
bullet = int(bullet)
print("Güzel.")
flag = 0
except ValueError:
print("Bir sayı girmelisiniz!!!")
bullet = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

classic = input("Classic ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")


flag = 1
while (flag):
try:
classic = int(classic)
print("ELO ölçümü tamamlandı")
flag = 0
except ValueError:
print("Bir sayı girmelisiniz!!!")
classic = input("Classic ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")
break

[/CODE]


Fonksiyon ile aldığım girdiyi ana projemde kullanmak istediğimde "NameError: name 'blitz' is not defined" hatası alıyorum her bir variable için (blitz, bullet, classical, rapid). Bunu nasıl çözebilirim? Bunları fonksiyonun içinde global yapmayı denedim ama işe yaramadı.

Teşekkürler.
 
Son düzenleyen: Moderatör:
Siz fonksiyon olayını yanlış anlamışsınız.

Değişkenlerin scope'ları vardır. Fonksiyon scopu içerisinde tanımlanmış değişken tanımlandığı fonksiyon dışında tanımsızdır. Bunu aşmanın 2 yolu var;
  1. return ile değer döndürmek.
  2. global değişken kullanmak. (Önerilmez. Son çare olarak kullanılmalı.)
Ayrıca fonksiyonlar atomik iş yapan küçük yapılar olmalı. 50 küsür satırlık bir birinden ayrılabilir yapıları sarmalayan yapılar olmamalıdır. Bkz. Kullanıcıdan değer alma işlemi ayrı bir fonksiyon olursa farklı ELO'lar için tekrar tekrar flag tanımlayıp while içerisinde kontrol etmek zorunda kalmazsınız.
 
Tüm kod bu mu?
Ben bunda bir hata göremiyorum. Tek sorun classic içinde break olması gibi duruyor.
Ana projem vardı, şu şekilde ama konu düzenlenirken silmişler sanırım.

[CODE lang="python" title="Ana projem"]from define import site_sor
from elo import elo_sor
import sys

onay = ""
while onay != "BAŞLA":

onay = input("Satranç anketine hoş geldiniz. Başlamak için BAŞLA yazınız: ")

if onay != "BAŞLA":

print("Bir daha deneyin, yazım hatası yapmış olmalısınız")

if onay == "BAŞLA":

site_sor()

elo_sor()

print(blitz, rapid, classic, bullet)
[/CODE]
  1. return ile değer döndürmek.
Bunu yaptığımda da attirbution hatası aldım. Şu şekilde kullandım return'ü:

Python:
 blitz = int(blitz)
            print("Güzel.")
            return blitz
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            blitz = input("Blitz ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")
 
Koddan da yapmaya çalıştığınızdan da bir şey anlamıyorum ben. Elo ölçümünden sonra tüm değerleri return edebilirsiniz.

Sadece birini döndürecekseniz de döndürebilirsiniz.

Kod:
def elo_sor():
    rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            rapid = int(rapid)
            print("Güzel.")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    blitz = input("Blitz ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            blitz = int(blitz)
            print("Güzel.")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            blitz = input("Blitz ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    bullet = input("Bullet ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            bullet = int(bullet)
            print("Güzel.")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            bullet = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    classic = input("Classic ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            classic = int(classic)
            print("ELO ölçümü tamamlandı")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            classic = input("Classic ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    return rapid, blitz, bullet, classic

a = list(elo_sor())
print(a)
Kod:
def elo_sor():
    rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            rapid = int(rapid)
            print("Güzel.")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            rapid = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    blitz = input("Blitz ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            blitz = int(blitz)
            print("Güzel.")
            flag = 0
            return blitz
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            blitz = input("Blitz ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    bullet = input("Bullet ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            bullet = int(bullet)
            print("Güzel.")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            bullet = input("Rapid ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    classic = input("Classic ELO'nuz kaç? Oyamıyorsanız '0' yazınız: ")

    flag = 1
    while (flag):
        try:
            classic = int(classic)
            print("ELO ölçümü tamamlandı")
            flag = 0
        except ValueError:
            print("Bir sayı girmelisiniz!!!")
            classic = input("Classic ELO'nuz kaç? Oynamıyorsanız '0' yazınız: ")

    return rapid, blitz, bullet, classic

print("fffff", elo_sor())
 
Koddan da yapmaya çalıştığınızdan da bir şey anlamıyorum ben.
Amacım kullanıcıya oyun türlerindeki puanları sorup bunları kullanmaktı. Kullanacaktım fakat bu sorunda takıldığım için daha yapamadım. Gelen puanlara göre kullanıcıya bir şeyler söyleyecekti yazılım.

Yazdığınız kod işe yaradı, sağ olun.
 
Python:
def getIntInputFromUser(msg):
  response = input(msg)
  return safeCast(response, int, 0)

def safeCast(val, toType, default=None):
  try:
    return toType(val)
  except:
    return default

def askELO():
  rapid = getIntInputFromUser("Enter your RAPID ELO =>")
  blitz = getIntInputFromUser("Enter your BLITZ ELO =>")
  bullet = getIntInputFromUser("Enter your BULLET ELO =>")
  classic = getIntInputFromUser("Enter your CLASSIC ELO =>")
  return {'rapid': rapid, 'blitz' : blitz, 'bullet' : bullet, 'classic': classic}

# DEMO
if __name__ == "__main__":
  elo = askELO()
  print("Classic ELO = ", elo['classic'])
  print("Blitz ELO = ", elo['blitz'])

Aslında her ELO tipi için ayrı fonksiyonların yazılması gerek ancak sizin durumunuz için hepsinin tek seferde alınması çok da fark etmiyor.
 
Son düzenleme:
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı