Def ile ilgili sorunum var

Merhaba benim sorunum şu
def elma():
elma=3
pass

print(elma)

yani biliyorum saçma bir örnek oldu ancak bunun sonucunda elma öğesinin bulunmadığını söylüyor. Projemde ilerlemeye başladım yavaş yavaş ama bu sorun benim veritabanı oluşturmamı engelliyor. Aslında kesin cevabı biliyorum ama gece geç olmaya başlayınca duruyor beynim maalesef lütfen yardımcı olun

elma = 3 deften önce olmalı bu tür konular hakkında yazbel istihza belgelerinden araştırma yapabilirsiniz

link https://python-istihza.yazbel.com/

Fonksiyonda tanımlanan değişkenlere o fonksiyonların dışında erişilemez. Fonksiyonlar konusunu tekrar gözden geçirin:

1 Beğeni

elma = 3 kodunu yazmadan önce elma değişkenini global yapmalısınız.Örnek :

def elma():
    global elma
    elma = 3
    pass

elma()
print(elma)
1 Beğeni

global ne oluyor abi

Merhabalar,

def elma():
    global elma
    elma = 3
    pass
elma()
print(elma)

Sanırım fonksiyonu çağırmayı unuttunuz.

1 Beğeni

@yusuftahabudak
öncelikle kullandığınız boşluklara dikkat ediniz.

yazdığınız kodda elma fonksiyonunu çağırırken parantez de kullanmanız gerekirdi.
Fonkisyonları çağırma işlemini yaparken parantez kullanmalısınız.

Fonksiyon içindeki değişkeni nasıl terminale yansıtacağınıza gelirsek :

def elma():
    elma = 3
    return elma
    
    
print(elma()) #Gördüğünüz gibi "elma()" şeklinde fonksiyonumuzu çağırdım.

return kullanırsanız ve sonrasına fonksiyonu çağırırsanız 3 sonucunun terminale basıldığını görürsünüz.
Return kullanmanız gerekiyordu.
Yanıtım işe yaradıysa çözüldü olarak işaretleyebilirsiniz. Kolay gelsin.

Her yerde kullanılmasını sağlıyor.

Evet,unutmuşum.Kusuruma bakmayın.Düzelttiğiniz için teşekkür ederim <3

aslında ben burda basit bir örnek verdim elma kısmı aslında kullanıcıya sorulan soru örnek amaçlı böyle yazdım ancak global yapmam sorunu çözecektir

Bir fonksiyonda tanımlanan değişkenlere fonksiyonun dışından erişebilmek aşağıdaki yolla mümkün:

def get_local_variables(func):
    return {
        identifier: value
        for identifier, value in zip(
            func.__code__.co_varnames,
            func.__code__.co_consts[1:]
        )
    }


def f():
    x = "hello"
    y = "world"
    
    
assert get_local_variables(f) == {'x': 'hello', 'y': 'world'}
2 Beğeni

Python’un fonksiyon bytecode’larını yorumlarken kullandığı sabitlerden faydalanacaksak en baştan bir yorumlayıcı yazmamız lazım, bu hali ile kodu kandırmak çok kolay:

def get_local_variables(func):
    return {
        identifier: value
        for identifier, value in zip(
            func.__code__.co_varnames,
            func.__code__.co_consts[1:]
        )
    }


def f():
    x = "hello"
    x += "a"
    y = "world"
    
    
assert get_local_variables(f) == {'x': 'hello', 'y': 'world'}

Zaten değişkenin alacağı son değeri fonksiyonu çalıştırmadan bilemeyiz.

1 Beğeni

Evet değişken üzerinde yapılan bir değişiklik algılanmıyor.

1 Beğeni

Şöyle bir değişiklik yaptım:

def get_local_variables(func):
    load_const = []
    store_fast = []
    for instr in __import__("dis").Bytecode(func):
        if instr.opname == "LOAD_CONST":
            load_const += [eval(instr.argrepr)]
        elif instr.opname == "STORE_FAST":
            store_fast += [instr.argrepr]
    load_const = load_const[:-1]
    result = {}
    for i, j in zip(load_const, store_fast):
        if j in result:
            if type(i) == type(result[j]):
                result[j] += i
            else:
                result[j] = i
        else:
            result[j] = i
    return result
    
    
def f():
    x = "hello"
    x += "a"
    y = "world"
    

def g():
    x = "hello"
    x = 1
    y = "world"    
    

assert get_local_variables(f) == {"x": "helloa", "y": "world"}
assert get_local_variables(g) == {"x": 1, "y": "world"}

Edit: Kod biraz aceleye geldi aslında, aşağıdaki kısmı değiştirmek ve ilk başta instr.opname == "INPLACE_ADD" koşuluna göre bir değişiklik yapmak lazım.

            if type(i) == type(result[j]):
                result[j] += i
            else:
                result[j] = i

Edit: Aslında bir çok instr.opname'e göre değişiklikler yapılması gerekiyor olabilir. Benim yaptığım sadece basit bir girişim.

1 Beğeni

Aynen öyle, her farklı işlem tipine göre özel işlemlerin tanımlanması gerekiyor.

1 Beğeni

Estağfirullah, insanlık hali olabilir bazen.

1 Beğeni