kuidas teisest skriptist funktsiooni aktiveerida


Vastus 1:

Teie algne kood on:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b tagastage za = func2 (4,6)trükk (a)

Selleks on mitu võimalust:

# Kasutage tagastusväärtusi # Olge selge, et kõne func2-le tugineb tulemusele funktsiooni1 kõne numberdef func1 (): a = 8 b = 9 tagastage a, bdef func2 (x, y, args): a, b = * args # Pakkige argumentidest lahti z = x + y + a + b tagastage za = func2 (4,6, args = func1 ())trükk (a)# aga võiksite teha: a = func2 (4,6, args = (9,11)) # Andmete loomiseks pole funktsiooni vaja

või

# Pass funktsioonid: # Selles lahenduses olete helistades selgesõnaline # func2, mida ta peab kutsuma funktsiooniks func1: func1 on abifunktsioondef func1 (): a = 8 b = 9 tagastage a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b tagastage za = func2 (4,6, func1)trükk (a)# Kui teil on mõni muu funktsioon, mis genereerib väärtuste paari # sa võiksid selle ka läbida

Ma ütleksin, et ära kasuta globaale üldse - need näevad välja nagu kiire lahendus, kuid neil on väga halb harjumus.

Globaalid esindavad definitsiooni järgi teavet selle kohta, kuidas teie funktsioon töötab, mis on väljaspool teie funktsiooni argumente, mis võib teie funktsiooni testimise palju keerulisemaks muuta - kuna nüüd peate oma funktsioonile edastama argumendid ja määrama asjakohased globaalsed väärtused eraldi oma funktsiooni testimiseks (eks testite küll oma funktsioone). Mõnikord on võimatu globaalsetest andmetest (näiteks andmebaasidest, välistest veebisaitidest) eemale pääseda ja peate mõnikord hüppama ringi, et oma koodi testida, kui teil on väliseid andmeid, kuid ärge muutke elu enda jaoks veelgi keerulisemaks .


Vastus 2:

See sõltub iga faili koodist, kuid vastus on sisuliselt sama:

Sõltumata sellest, kas funktsioon on objekti meetod või on see lihtsalt moodulis alasti, saate selle importida kõikjalt, kuhu see deklareeriti, kuhu iganes soovite seda kasutada.

Teil võivad olla head põhjused, miks te oma funktsiooni objekti ei kinnita, kuid võiksite selle põhjuse kinnitada. Mõistlikke argumente on poolt ja vastu.

Nimetame Pythoni koodiga faili 'mooduliks'. Mugavalt annavad Pythoni moodulid meile "tasuta" nimeruumi, et hoida meie deklaratsioone globaalsest nimeruumist eemal, kus nad võivad põrkuda praeguste või tulevaste deklaratsioonidega mujal koodis.

Tihedalt seotud moodulite kataloogistruktuuri nimetatakse paketiks.

Seosetute moodulite kataloogistruktuuri nimetatakse ... segaduseks.

Igal juhul, kui üks moodul, mis on salvestatud faili nimega foo.py, sisaldab funktsiooni nimega riba:

def-riba (asi1, asi2): tagastama „{0}, {1}”. formaat (asi1, asi2)// ignoreeri seda hetkel def yoda_speak (asi1, asi2): tagastage "{0}, {1}". formaat (asi2, asi1)

... siis võite mõnes muus failis importida funktsiooniriba moodulist foo:

foo impordibaaristasi = riba ("imporditud", "see")

... või võite importida kogu mooduli, nii et pääsete kõikidele selle funktsioonidele korraga, kui olete kindel, et soovite neid kõiki ... nii kaua kui viitate neile nende nimeruumis (nt foo.function_name () )…

import fooboth_things = foo.bar ("Ettevaatust sellega", "kuid saate importida kõik selle mooduli funktsioonid") yoda_speak = foo.anti_bar ("see on", "tagurpidi")

Vastus 3:

On juhtum, mis teeb täpselt seda, mida kirjeldate oma küsimuses, ehkki see ei pruugi olla teie kasutusjuhtum. See on * sulgemine *.

def funktsioonihäire (a): b = 2 * a def minu muud funktsioonid (c): tagasipöördumine b * c tagastage mufunktsioon

myotherfunction hoiab tõhusalt koopia a-st, mida kasutatakse iga kord, kui seda kutsutakse

myother = müfunktsioon (5)tulemus = mu (5)print (tulemus)

mis prindib: 50

Lokaalne muutuja b on a * 2 tulemus, mis meie puhul oli 5. Seda peetakse viitena müotalitlusele, mis on tagasiväärtus

Iga kord, kui tagastatud funktsioon käivitatakse, korrutab see argument c kohaliku muutuja b väärtusega, mida on kasutatud viitena.


Vastus 4:

Pakun teisi võimalusi, kuigi klassi, meetodite ja atribuutide kasutamine on õige tee.

» selgesõnaline lahendus, teabe edastamine muutuva kaudu. Kasutan midagi sellist rekursiivsete programmide jaoks, millel on riigi teave.»impordi printdef f (d: dict) -> Puudub: print ('funktsioon f: argumendi täitmine kohalike muutujatega') a_local_variable = 'f lõi mind' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Puudub: print ('FUNKTSIOON g: ARGUMENDI KASUTAMINE MUJAL LOETUD KOHALIKE MUUTJATEGA') pprint.pprint (d)def main (): pass_variables_around = {} f (pass_variables_around) g (parameetrid_around)peamine ()

Vastus 5:
muutuja = 0def modify_global (): globaalne muutuja muutuja + = 1printimuutuja>>>> 1

Üldine märksõna võimaldab funktsiooni kohapeal modifitseerida globaalseid muutujaid.

Funktsiooni määratlemine teise sees ei edasta sama nimega muutujate väärtust. Kontrollige

9. Klassid - Pythoni 3.7.0 dokumentatsioon

Peatükkides 9.1 ja 9.2 on kena lühike selgitus selle kohta, kuidas nimed Pythonis toimivad.


Vastus 6:
def func1 (): globaalne a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b tagastage za = func2 (4, 6)trükk (a)#Ma olen pythonis uus, nii et ma pole kindel, kas see on parim lahendus. Kuid see on üks lahendusi.Sisuliselt peate muutujad a ja b muutma globaalseks, deklareerides need, kui soovite neid kasutada mõnes muus funktsioonis.

Vastus 7:

Ma pole kindel, et saan aru, mida te mõtlete. Kuid kui impordite funktsiooni ühest failist teise, võib importija funktsiooni väärtusi edastada ja funktsioon võib oma failis värskendada kõike.

Kui ma siiski õigesti aru saan (ja on üsna tõenäoline, et ma ei saa aru), on see, mida te proovite teha, paljudel juhtudel väga halb programmeerimistava, tuginedes moodulite globaalidele.


Vastus 8:

Kuigi on kindlasti viise, ärge tehke seda. Kui soovite funktsiooni sees mõningaid väärtusi muuta ja kasutada neid muudetud väärtusi mõnes teises funktsioonis, edastage muudetavad väärtused kutsumisparameetrite kaudu esimesele funktsioonile ja aktsepteerige muudetud väärtusi funktsiooni tagastusväärtusena. Andke muudetud väärtused teisele funktsioonile ja aktsepteerige selle tagastusväärtused.

See on funktsionaalse programmeerimise paradigma üldtunnustatud parim tava, mis püüab funktsiooni kutsumise minimeerida (ootamatut, mitte ilmset) kõrvalmõju.


Vastus 9:

Teie sisestatud kood viskab vigu.

Miks? Sellepärast, kuidas Pythoni muutlikud ulatused töötavad. Funktsioonides func () deklareeritud a ja b mõjutavad lihtsalt seda funktsiooni, see on nende ulatus.

Kui soovite funktsiooni globaalse muutuja väärtusi muuta, peate kasutama üldist märksõna:

globaalne xx = 123printige xfunc ()printige xdef func (): x = 124

tl; dr Teie kood, nagu see on, ei tööta.


Vastus 10:

Jah, see on see, mida otsite. Loodan, et see aitab.

def c (): r = raw_input ("Kas küsida midagi?") ... tagasitulek rdef p (x): ... tee midagi ....r = c ()p (r)