Python'un aşırı yükleme yöntemi yapıp yapamayacağını sorarsanız: hayır. Bu nedenle, bu gibi çok-yöntemlerin yapılması, bir yöntemi tanımlamak için oldukça Pythonic olmayan bir yoldur. Ayrıca, adlandırma kuralı genellikle büyük harf sınıf adları ve küçük harf işlevleri/yöntemleri. Eğer fantezi hissediyorsanız, herhangi işleve yapar bir dekoratör yapabilir,
def Factorial(arg):
if getattr(arg, '__iter__', False): # checks if arg is iterable
return [Factorial(x) for x in arg]
else:
# ...
Veya: zaten önde gitmek isterseniz
, basit yolu sadece bir dal oluşturmak için olacaktır:
def autoMap(f):
def mapped(arg):
if getattr(arg, '__iter__', False):
return [mapped(x) for x in arg]
else:
return f(arg)
return mapped
@autoMap
def fact(x):
if x == 1 or x == 0:
return 1
else:
return fact(x-1) + fact(x-2)
>>> fact(3)
3
>>> fact(4)
5
>>> fact(5)
8
>>> fact(6)
13
>>> fact([3,4,5,6])
[3, 5, 8, 13]
daha Pythonic bir şekilde değişken bağımsız değişken uzunluklarının kullanmak da:
def autoMap2(f):
def mapped(*arg):
if len(arg) != 1:
return [f(x) for x in arg]
else:
return f(arg[0])
return mapped
@autoMap2
def fact(n):
# ...
>>> fact(3,4,5,6)
[3, 5, 8, 13]
P Derin bir haritalama dekoratör bir araya ikisini Utting: Bu iterable ise
def autoDeepMap(f):
def mapped(*args):
if len(args) != 1:
return [mapped(x) for x in args]
elif getattr(args[0], '__iter__', False):
return [mapped(x) for x in args[0]]
else:
return f(args[0])
return mapped
@autoDeepMap
def fact(n):
# ...
>>> fact(0)
1
>>> fact(0,1,2,3,4,5,6)
[1, 1, 2, 3, 5, 8, 13]
>>> fact([0,1,2,3,4,5,6])
[1, 1, 2, 3, 5, 8, 13]
>>> fact([0,1,2],[3,4,5,6])
[[1, 1, 2], [3, 5, 8, 13]]
>>> fact([0,1,2],[3,(4,5),6])
[[1, 1, 2], [3, [5, 8], 13]]
Skalerlerle ve başka vektörlerle bir şey yapan böyle büyülü bir işlev için kullanım durumu hakkında biraz bilgi verebilir misiniz? –
Elbette. Tek bir değer çok kullanışlı görünmese de, Sum veya Ortalama veya benzeri işlevler için iyidir. Böyle kullanılabilecek birçok fonksiyon var. –
Hayır, sadece tek bir değeriniz varsa, bu tek değeri içeren bir liste kullanın. Nesneler benzer davrandığında farklı türler döndürülür. Ama buradaki sınırın çok üzerinde. –