Python: Аргументтердің ұзын тізбесі бар функциялармен жұмыс істеудің ең жақсы жолы?

Мен аргументтердің ұзын тізімдерін функцияға қалай беру керектігі туралы әр түрлі түсініктемелерді таптым, бірақ мен мұны дұрыс жолмен істеп жатқанына күмәнданбаудамын.

Басқаша айтқанда, мен күдікті деп ойлаймын, бұл дұрыс емес, бірақ оны құқық ретінде көре алмаймын.

Мәселе: Мен айнымалылардың көп мөлшерін қолдана отырып және олардың кем дегенде кейбірінде кейбір мазмұнды өзгертуге тура келетін қайталанатын функцияны (өте ұзақ емес).

Мен аяқтаған нәрсе мына сияқты:

def myFunction(alpha, beta, gamma, zeta, alphaList, betaList, gammaList, zetaList):
    
    myFunction(alpha, beta, modGamma, zeta, modAlphaList, betaList, gammaList, modZetaList)

... және мен өзім айнымалы өзгерістерге қатысты өзгерістерді көргім келеді (C-ге сілтеме жасай аламын, бірақ Python-да бұл әрқашан көшірме екендігін естідім).

Кешіріңіз, егер noob, мен бұл сұрақты қалай білдіруді білмеймін, сондықтан тиісті жауаптар таба аламын.

1
Бұл жауап сізге сілтемелерге қатысты параметрлердің қалай әрекет ететінін түсінуге көмектеседі -> stackoverflow.com/a/986145/15931
қосылды автор E.Z., көзі
Питонда бұл ешқашан көшірмесі
қосылды автор John La Rooy, көзі
Сіз нақты мысал келтіре аласыз ба?
қосылды автор Markus Unterwaditzer, көзі

7 жауаптар

Бұл әдетте matplotlib ішінде пайдаланылады, мысалы. Олар: * немесе ** арқылы аргументтердің ұзын тізімін береді:

def function(*args, **kwargs):
    do something

Қоңырау шалу функциясы:

function(1,2,3,4,5, a=1, b=2, b=3)

Мұнда 1,2,3,4,5 args және a = 1, b = 2, c = 3 kwargs , сөздік ретінде. Олар сіздің функцияңызға келіп, келесідей:

args = [1,2,3,4,5]
kwargs = {a:1, b:2, c:3}

Сіз оларды өзіңіз қалаған жолмен көре аласыз.

2
қосылды

Сіз барлық параметрлерді сыныпта орындай аласыз:

class FooParameters:
    alpha = 1.0
    beta = 1.0
    gamma = 1.0
    zeta = 1.0
    alphaList = []
    betaList = []
    gammaList = []
    zetaList = []

және сіздің функцияңыз бір параметр данасын алады:

def myFunction(params):
    omega = params.alpha * params.beta + exp(params.gamma)
    # more magic...

қоңырау шалу:

testParams = FooParameters()
testParams.gamma = 2.3
myFunction(testParams)
print params.zetaList

Params данасы сілтемесі арқылы берілсе, функциядағы өзгертулер сақталады.

2
қосылды

Python функциясына өту кезінде мәндерді көшіретіні туралы идеяның қайда екенін білмеймін. Бұл мүлдем шын емес.

Керісінше: функциядағы әрбір параметр бастапқы нысанға қатысты қосымша атау болып табылады. Егер сол нысанды мәнін өзгерткен болсаңыз, мысалы, егер ол тізім болса және оның мүшелерінің бірін өзгерткен болсаңыз, түпнұсқа да сол өзгерісті көреді. Егер сіз rebind атауды тағы бір нәрсеге айналдырсаңыз - alpha = my_completely_new_value арқылы жасаңыз - онда түпнұсқа өзгеріссіз қалады.

1
қосылды
«әр параметрді функциядағы» «деп атайтын қосымша атау деп айтуға техникалық тұрғыдан дұрыс болса да, өзгермейтін түрлерге арналған мінез-құлық біреудің ауыспалы деп күтуге болмайды» сілтеме бойынша «(C сияқты). Егер функция ішінде int параметрі өзгертілсе (айталық, alpha + = 1 ), бастапқы айнымалыға әсер етпейді.
қосылды автор E.Z., көзі
Техникалық тұрғыдан алғанда, python (кез-келген басқа негізгі бағдарламалау тілі сияқты әдепкі бойынша) «сандық мәнді өту» семантикасын қолданады. бұл идеяны ол жерден алды. Иә, бұл шатастырады.
қосылды автор Elazar, көзі

Сізге мына нәрсеге қызығушылық тудыруы мүмкін:

def myFunction(*args):
    var_names = ['alpha','beta','gamma','zeta']
    locals().update(zip(var_names,args))
    myFunction(alpha,beta,gamma,zeta)

Алайда бұл «жиі» жұмыс істемейді. Мен басқа аттар кеңістігін енгізуді ұсынамын:

from collections import OrderedDict
def myFunction(*args):
    var_names = ['alpha','beta','gamma','zeta']
    vars = OrderedDict(zip(var_names,args))

    #get them all via vars[var_name]

    myFunction(*vars.values()) #since we used an orderedDict we can simply do *.values()
1
қосылды

сіз жабық мәнде емес мәнді мәндерді ұстай аласыз:

def myFunction(alpha, beta, gamma, zeta, alphaList, betaList, gammaList, zetaList):
    def myInner(g=gamma, al, zl):
        
        myInner(modGamma, modAlphaList, modZetaList)
    myInner(al=alphaList, zl=zetaList)

(BTW, Python-да шын мәнінде рекурсивті функция жазудың жалғыз жолы туралы.)

1
қосылды

Сөздікке өтуге және жаңа сөздікті қайтаруға болады. Немесе әдісіңізді классқа қойыңыз және альфа, бета және т.б. қасиеттерге ие болыңыз.

0
қосылды

Сіз сыныпта myFunction кодын қоюыңыз керек. Класс тиісті атрибуттармен орнатыңыз және сәйкес функцияларды шақырыңыз. Содан кейін мемлекет сыныпта жақсы көрінеді.

0
қосылды