hvernig á að virkja aðgerð úr öðru handriti


svara 1:

Upprunalegi kóðinn þinn er:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b skila za = func2 (4,6)prenta (a)

Það eru nokkrar leiðir til að gera þetta:

# Notaðu skilagildi # Vertu skýr að kallið til func2 byggist á niðurstöðunni # símtalið til func1def func1 (): a = 8 b = 9 skila a, bdef func2 (x, y, args): a, b = * args # Pakkaðu frá rökunum z = x + y + a + b skila za = func2 (4,6, args = func1 ())prenta (a)# en þú gætir gert: a = func2 (4,6, args = (9,11)) # Þú þarft ekki aðgerð til að búa til gögnin þín

eða

# Pass aðgerðir: # Í þessari lausn ertu að vera skýr þegar þú hringir # func2 sem það þarf að kalla func1: func1 er hjálparaðgerðdef func1 (): a = 8 b = 9 skila a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b skila za = func2 (4,6, func1)prenta (a)# Ef þú ert með aðra aðgerð sem býr til par af gildum # þú gætir staðist það líka

Ég myndi segja að nota alls ekki Globals - þau líta út eins og skjót lausn en þau eru mjög slæm venja að komast í.

Globals samkvæmt skilgreiningu tákna upplýsingar um hvernig aðgerð þín virkar sem er utan við rökin fyrir aðgerðinni þinni, sem getur gert aðgerðina þína miklu erfiðari að prófa - þar sem þú verður nú að færa rök fyrir aðgerðina þína og stilla viðeigandi alþjóðleg gildi sérstaklega í röð til að prófa virkni þína (þú prófar aðgerðir þínar, er það ekki). Stundum er ómögulegt að komast frá alheimsgögnum (til dæmis gagnagrunnum, utanaðkomandi vefsíðum) og þú verður að hoppa í gegnum hindranir stundum til að prófa kóðann þinn þegar þú hefur utanaðkomandi gögn - en ekki gera þér lífið enn erfiðara .


svara 2:

Það fer eftir kóðanum í hverri skrá, en svarið er í meginatriðum það sama:

Hvort sem aðgerðin er aðferð hlutar, eða einfaldlega nakin í einingu, þá geturðu flutt hana inn hvert sem henni var lýst, þangað sem þú vilt nota hana.

Þú gætir haft góðar ástæður fyrir því að fella hlutverk þitt ekki í hlut, en þú gætir viljað staðfesta þá ástæðu. Það eru skynsamleg rök með og á móti.

Köllum skrá af Python-kóða „einingu“. Þægilegt er að Python einingar gefa okkur „ókeypis“ nafnrými til að halda yfirlýsingum okkar frá alheimsheitasvæðinu, þar sem þær geta rekist á núverandi eða framtíðaryfirlýsingar annars staðar í kóðanum.

Safnaskipulag náskyldra eininga er kallað pakki.

Skráarsamsetning ótengdra eininga er kölluð ... rugl.

Í öllum tilvikum, ef ein eining, geymd í skrá sem kallast foo.py, inniheldur aðgerð sem heitir bar:

def bar (thing1, thing2): skila „{0}, {1}“. sniði (hlutur1, hlutur2)// hunsa þetta í bili def yoda_speak (hlutur1, hlutur2): skila „{0}, {1}“. sniði (thing2, thing1)

... þá geturðu í annarri skrá flutt inn aðgerðastikuna frá einingunni foo:

frá foo import barhlutur = bar („innfluttur“, „þetta“)

... eða þú getur flutt inn alla eininguna foo, allir fá aðgang að öllum aðgerðum hennar í einu, ef þú ert viss um að þú viljir hafa þá alla ... svo framarlega sem þú vísar til þeirra eftir nafnsvæði þeirra (td foo.function_name () ) ...

flytja inn fooboth_things = foo.bar („Varlega með þetta“, „en þú getur flutt inn allar aðgerðir í þessari einingu“) yoda_speak = foo.anti_bar ("þetta er", "afturábak")

svara 3:

Það er tilfelli sem gerir nákvæmlega það sem þú lýsir í spurningunni þinni, þó það sé kannski ekki þitt mál. Það er * lokun *.

óvirkni (a): b = 2 * a vanvirkni (c): skila b * c skila annarri virkni minni

myotherfunction er í raun að halda afrit af a, sem mun nota í hvert skipti sem kallað er á

myother = virkni mín (5)útkoma = önnur (5)prenta (niðurstaða)

sem mun prenta: 50

Staðarbreytan b er afleiðing a * 2, sem í okkar tilviki var 5. Þetta er haft sem viðmiðun fyrir mýrarvirkni sem er skilagildið

Í hvert skipti sem kallað er aftur til skilaðrar aðgerðar mun það margfalda rökin c með gildi staðbundnu breytunnar b sem hefur verið haldið til viðmiðunar.


svara 4:

Ég mun bjóða upp á aðrar leiðir, þó að nota bekk og aðferðir og eiginleika sé leiðin.

'' ' skýr lausn, miðla upplýsingum í gegnum breytanlegt. Ég nota eitthvað svona fyrir endurkvæma forrit með upplýsingum um ríkið.'' 'flytja inn pprintdef f (d: dict) -> Ekkert: prenta ('fall f: fylla rök með staðbundnum breytum') a_local_variable = 'f skapaði mig' d ['a_local_variable_from_elswhere'] = a_local_variabledef g (d: dict) -> Ekkert: prenta ('FUNCTION g: USING ARGUMENT WITH LOCAL VARIABLES CREATED ELEREWERE') pprint.pprint (d)def aðal (): pass_variables_around = {} f (pass_variables_around) g (pass_variables_around)aðal()

svara 5:
breytu = 0def breyta_global (): alþjóðleg breyta breytu + = 1prentbreytu>>>> 1

Alheimsorðið leyfir að breyta alþjóðlegum breytum á staðnum í aðgerð.

Að skilgreina fall innan annars fer ekki framhjá gildi sömu nafngreindra breytna. Athuga

9. Flokkar - Python 3.7.0 skjöl

kafla 9.1 og 9.2 fyrir fallega stutta skýringu á því hvernig nafngiftir virka í Python.


svara 6:
def func1 (): alþjóðlegt a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b skila za = func2 (4, 6)prenta (a)# Ég er nýr í python svo ég er ekki viss um hvort þetta sé besta lausnin. En þetta er ein af lausnunum.Þú verður í grundvallaratriðum að gera breytur a og b alþjóðlegar meðan þú lýsir þeim yfir ef þú vilt nota þær í annarri aðgerð.

svara 7:

Ég er ekki viss um að ég skilji hvað þú ert að meina. En ef þú flytur aðgerð úr einni skrá yfir í aðra getur innflytjandinn sent gildi yfir í aðgerðina og aðgerðin getur uppfært hvað sem er í sinni eigin skrá.

Hins vegar, ef ég skil rétt (og það er alveg líklegt að ég geri það ekki), þá er það sem þú ert að reyna að gera, í mörgum tilfellum, mjög slæm forritunarvenja, að treysta á hnattræna einingu.


svara 8:

Þó að það séu vissulega leiðir, ekki gera það. Ef þú vilt breyta sumum gildum inni í aðgerð og nota þessi breyttu gildi í annarri aðgerð skaltu láta gildin sem á að breyta yfir í fyrstu aðgerðina með ákallunarstærðum og samþykkja breyttu gildin sem skilagildi virkninnar. Sendu breytt gildi yfir í aðra aðgerðina og samþykkðu skilagildin.

Þetta er almennt viðurkennt besta starfshættir frá hugmyndafræðilegu forritunarhugtaki sem reynir að lágmarka (óvænt, það er ekki augljóst) aukaverkanir þess að kalla aðgerð.


svara 9:

Kóðinn sem þú gafst upp mun henda villum.

Af hverju? Vegna þess hvernig breytileg umfang í Python virka. a og b, lýst yfir í func (), hafa bara áhrif á þá aðgerð, það er umfang þeirra.

Ef þú vilt breyta gildum alþjóðlegrar breytu inni í aðgerð þarftu að nota lykilorðið:

alheims xx = 123prenta xfunc ()prenta xdef func (): x = 124

tl; dr Kóðinn þinn, eins og hann er, gengur ekki.


svara 10:

Já, þetta er það sem þú ert að leita að. Vona að það hjálpi.

def c (): r = raw_input („Spurðu eitthvað?“) ... skila rdef p (x): ... gera eitthvað ....r = c ()p (r)