Bu soruyu stackoverflow’da da sordum ama henüz cevap gelmedi. Belki buradaki arkadaşlar cevap verebilir.
Çalışan kod hakkında
Aşağıdaki kodları çalıştırdığımda, beklendiği gibi çalıştıklarını görüyorum.
def modify_string(n):
str1 = ", ".join([f"arg{i}" for i in range(n)])
str2 = f"func{len(str1.split(', ')) - 1}"\
f"({', '.join(str1.split(', ')[:-1])})"
return f"lambda {str1}: list(map(lambda i: list({str2})," \
f" range({str1.split(', ')[-1]})))"
def create_globals(n):
global func1
func1 = lambda x: list(map(lambda j: 0, range(x)))
for i in range(2, n + 1):
globals()[f"func{i}"] = eval(modify_string(i))
create_globals(3)
print(func3(3, 2, 4))
Çıktı:
[[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]
create_globals (n)
işlevi çağrıldığında, n
farklı fonksiyon tanımlanır. Fonksiyonların isimleri i
numarasına göre değişmektedir. Oluşturulan her fonksiyon, bir sonraki adımda oluşturulacak fonksiyonun argümanı olur:
for
döngüsünün ilk aşamasında, aşağıdaki fonksiyon tanımlanır:
func2 = lambda arg0, arg1: list(map(lambda i: list(func1(arg0)), range(arg1)))
for
döngüsünün ikinci aşamasında, aşağıdaki fonksiyon tanımlanır:
func3 = lambda arg0, arg1, arg2: list(map(lambda i: list(func2(arg0, arg1)), range(arg2)))
Yani bu, n
boyutlu matrisler oluşturan bir fonksiyondur.
Soru hakkında
Yapmaya çalıştığım şey, her adımda fonksiyonun aynı global
adını kullanarak yeni fonksiyonlar tanımlamaktı. Ve nihayet oluşturulan son fonksiyonu kullanmak istemiştim. Bu yüzden kodları aşağıdaki gibi değiştirdim:
def modify_string(n):
str1 = ", ".join([f"arg{i}" for i in range(n)])
str2 = f"func({', '.join(str1.split(', ')[:-1])})"
return f"lambda {str1}: list(map(lambda i: list({str2})," \
f" range({str1.split(', ')[-1]})))"
def create_globals(n):
global func
func = lambda x: list(map(lambda j: 0, range(x)))
for i in range(2, n + 1):
globals()["func"] = eval(modify_string(i))
print("func =", modify_string(i))
create_globals(3)
Çıktı:
func = lambda arg0, arg1: list(map(lambda i: list(func(arg0)), range(arg1)))
func = lambda arg0, arg1, arg2: list(map(lambda i: list(func(arg0, arg1)), range(arg2)))
Çıktı beklendiği gibi görünüyor. Ancak func(3, 2, 4)
gibi bir fonksiyon çağırdığımda, bir TypeError
alıyorum.
func = lambda arg0, arg1: list(map(lambda i: list(func(arg0)), range(arg1)))
func = lambda arg0, arg1, arg2: list(map(lambda i: list(func(arg0, arg1)), range(arg2)))
Traceback (most recent call last):
File "./a.py", line 21, in <module>
func(2, 3, 4)
File "<string>", line 1, in <lambda>
File "<string>", line 1, in <lambda>
TypeError: <lambda>() missing 1 required positional argument: 'arg2'
arg2
yazmış olmama rağmen, yorumlayıcı arg2
eksikmiş gibi tepki veriyor. Bunun neden olduğunu açıklayabilir misiniz?
Şimdiden teşekkür ederim.