функцияны басқа сценарийден қалай іске қосуға болады


жауап 1:

Сіздің түпнұсқа кодыңыз:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b қайтару za = func2 (4,6)басып шығару (а)

Мұны істеудің бірнеше әдісі бар:

# Қайтаратын мәндерді қолданыңыз # Функция2-ге шақыру нәтижеге тәуелді болатындығын анық көрсетіңіз # функция1-ге қоңырауdef func1 (): a = 8 b = 9 қайтару а, bdef func2 (x, y, args): a, b = * args # аргументтерден шығарыңыз z = x + y + a + b қайтару za = func2 (4,6, args = func1 ())басып шығару (а)# бірақ сіз: a = func2 (4,6, args = (9,11)) # Деректер жасау үшін сізге функция қажет емес

немесе

# Pass функциялары: # Бұл шешімде сіз қоңырау шалған кезде айқын көрінесіз Функция1 деп аталуы керек # func2: func1 - көмекші функцияdef func1 (): a = 8 b = 9 қайтару а, bdef func2 (x, y, func): a, b = func () z = x + y + a + b қайтару za = func2 (4,6, func1)басып шығару (а)# Егер сізде мәндер жұбын тудыратын басқа функция болса # сіз де солай ете алар едіңіз

Мен Globals-ті мүлдем пайдаланбаңыз дер едім - олар тез шешімге ұқсайды, бірақ олар өте жаман әдеттер.

Анықтама бойынша глобалдар сіздің функцияңыздың қалай жұмыс істейтіні туралы ақпаратты ұсынады, бұл сіздің функцияңыздың аргументтерінен тыс, бұл сіздің функцияны тексеруді едәуір қиындатуы мүмкін, өйткені сіз енді өз функцияңызға аргументтер беріп, сәйкес глобалды мәндерді бөлек орнатыңыз функцияны тексеру үшін (сіз өз функцияларыңызды тексересіз, солай емес пе). Кейде ғаламдық деректерден (мысалы, мәліметтер базасынан, сыртқы веб-сайттардан) аулақ болу мүмкін емес, кейде сыртқы деректер болған кезде кодты тексеру үшін құрсаулардан өту керек - бірақ өмірді өзіңіз үшін қиындатпаңыз .


жауап 2:

Бұл әр файлдағы кодқа байланысты, бірақ жауап мәні бірдей:

Функция объект әдісі бола ма, әлде модульде жай жалаңаш бола ма, оны қай жерде жарияланған болса да, оны қолданғыңыз келетін жерге импорттай аласыз.

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

Python кодының файлын 'модуль' деп атайық. Ыңғайлы, Python модульдері біздің декларацияларымызды жаһандық аттар кеңістігінен тыс қалдыру үшін «еркін» ат кеңістігін ұсынады, олар кодтың басқа жерлеріндегі ағымдағы немесе болашақ декларациялармен соқтығысуы мүмкін.

Өзара тығыз байланысты модульдердің каталогтық құрылымы пакет деп аталады.

Байланысты емес модульдердің каталогтық құрылымы ... тәртіпсіздік деп аталады.

Кез-келген жағдайда, егер foo.py деп аталатын файлда сақталған бір модульде бар деп аталатын функция болса:

def bar (thing1, thing2): «{0}, {1}» қайтару. формат (нәрсе1, нәрсе2)// мұны бір сәтке елемеңіз def yoda_speak (нәрсе1, нәрсе2): «{0}, {1}» қайтару. формат (нәрсе2, нәрсе1)

… Содан кейін басқа файлда функциялар жолағын модульден импорттауға болады:

foo импорт жолағынаннәрсе = бар («импортталған», «бұл»)

… Немесе сіз бүкіл модульді импорттай аласыз, егер сіз олардың барлығын қалайтындығыңызға сенімді болсаңыз, онда оның барлық функцияларына бірден қол жеткізе аласыз ... егер сіз олардың аттарын олардың кеңістігіне сілтеме жасасаңыз (мысалы, foo.function_name () ) ...

foo импорттауboth_things = foo.bar («Мұны мұқият», «бірақ сіз осы функциядағы барлық функцияларды импорттай аласыз») yoda_speak = foo.anti_bar («бұл», «артқа»)

жауап 3:

Сіздің сұрағыңызда дәл сипаттайтын нәрсені орындайтын жағдай бар, бірақ ол сіздің пайдалану жағдайыңыз болмауы мүмкін. Бұл * жабылу *.

def myfunction (a): b = 2 * a миотерфункцияны бұзу (c): b * c қайтару миотерфункцияны қайтару

миотерфункция а-ның көшірмесін сақтау болып табылады, ол әр шақырылған сайын қолданылады

myother = myfunction (5)нәтиже = басқа (5)басып шығару (нәтиже)

ол басылатын болады: 50

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

Қайтарылған функция шақырылған сайын, ол c аргументін сілтеме ретінде сақталған жергілікті b айнымалысының мәніне көбейтеді.


жауап 4:

Мен басқа жолдарды ұсынамын, дегенмен сыныпты қолдану мен әдістер мен атрибуттар - бұл барған жол.

'' ' ақпаратты өзгертуге болатын нақты шешім. Мен осындай ақпаратты мемлекеттік ақпараты бар рекурсивті бағдарламаларға қолданамын.'' 'pprint импортыdef f (d: dict) -> Ешқайсысы: print ('функция f: аргументті жергілікті айнымалылармен толтыру') a_local_variable = 'f мені құрды' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Ешқайсысы: print ('ФУНКЦИЯ g: ЖЕРГІЛІКТЕГІ ӨЗГЕРІМДІЛЕРДІҢ ДӘЛЕЛДЕРІН ҚОЛДАНУ') pprint.pprint (d)def main (): pass_variables_around = {} f (айнымалылар_аралас) g (айнымалылар_аралас)негізгі ()

жауап 5:
айнымалы = 0def modify_global (): ғаламдық айнымалы айнымалы + = 1айнымалы басып шығару>>>> 1

Жаһандық кілт сөз функционалды түрде жергілікті айнымалыларды өзгертуге мүмкіндік береді.

Функцияны басқа ішіне анықтау бірдей атаулы айнымалылардың мәнін бермейді. Шығу

9. Сыныптар - Python 3.7.0 құжаттамасы

9.1 және 9.2 бөлімдері Python-да атаудың қалай жұмыс істейтіні туралы қысқаша түсініктеме береді.


жауап 6:
def func1 (): жаһандық а, б a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b қайтару za = func2 (4, 6)басып шығару (а)# Мен питонға жаңадан келдім, сондықтан бұл ең жақсы шешім екеніне сенімді емеспін. Бірақ бұл шешімдердің бірі.Сіз а және b айнымалыларын басқа функцияда қолданғыңыз келсе, оларды жариялау кезінде жаһандық жасауыңыз керек.

жауап 7:

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

Алайда, егер мен дұрыс түсінсем (және мүмкін емес болса), сіз не істеуге тырысасыз, бұл көбінесе модуль глобалдарына сүйене отырып, өте нашар бағдарламалау практикасы.


жауап 8:

Әрине, жолдар бар, оны жасамаңыз. Егер сіз функцияның ішіндегі кейбір мәндерді өзгерткіңіз келсе және осы өзгертілген мәндерді басқа функцияда қолданғыңыз келсе, өзгертілетін мәндерді бірінші функцияға шақыру параметрлері арқылы жіберіңіз және өзгертілген мәндерді функцияның қайтару мәні ретінде қабылдаңыз. Өзгертілген мәндерді екінші функцияға жіберіп, оның қайтарылатын мәндерін қабылдаңыз.

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


жауап 9:

Сіз берген код қателіктер жібереді.

Неліктен? Python-дағы айнымалы ауқымдар қалай жұмыс істейтініне байланысты. a (b) функциясы () -де жарияланған функцияларға әсер етеді, бұл олардың қолданылу аясы.

Егер сіз функцияның ішіндегі жаһандық айнымалының мәндерін өзгерткіңіз келсе, онда сіз ғаламдық кілт сөзін қолдануыңыз керек:

жаһандық хx = 123x басып шығаруfunc ()x басып шығаруdef func (): x = 124

tl; dr Сіздің кодыңыз сол күйінде жұмыс істемейді.


жауап 10:

Ия, бұл сіз іздеген нәрсе. Бұл көмектеседі деп үміттенемін.

def c (): r = raw_input («Бірдеңе сұраңыз?») ... қайтару рdef p (x): ... бірдеңе жаса ....r = c ()p (r)