kako aktivirati funkciju iz druge skripte


Odgovor 1:

Izvorni kod je:

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

To možete učiniti na nekoliko načina:

# Koristite povratne vrijednosti # Budite eksplicitni da se poziv na func2 oslanja na rezultat # poziva na funkc1def func1 (): a = 8 b = 9 vratiti a, bdef func2 (x, y, args): a, b = * args # Raspakirajte se iz argumenata z = x + y + a + b povratak za = func2 (4,6, args = func1 ())ispis (a)# ali mogli biste učiniti: a = func2 (4,6, args = (9,11)) # Za stvaranje podataka ne treba vam funkcija

ili

# Pass funkcije: # U ovom rješenju eksplicitni ste kada zovete # func2 koji treba nazvati func1: func1 je pomoćna funkcijadef func1 (): a = 8 b = 9 vratiti a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b povratak za = func2 (4,6, func1)ispis (a)# Ako imate drugu funkciju koja generira par vrijednosti # i to biste mogli proći

Rekao bih da uopće ne koristite Globale - izgledaju kao brzo rješenje, ali vrlo su loša navika u koje se treba naviknuti.

Globali po definiciji predstavljaju informacije o tome kako funkcionira vaša funkcija, a koja je izvan argumenata vaše funkcije, što može znatno otežati testiranje vaše funkcije - jer sada svojoj funkciji morate proslijediti argumente i zasebno postaviti relevantne globalne vrijednosti kako bi kako biste testirali svoju funkciju (vi testirate svoje funkcije, zar ne). Ponekad je nemoguće pobjeći od globalnih podataka (na primjer, baze podataka, vanjske web stranice), a ponekad morate preskočiti obruče da biste testirali svoj kod kada imate vanjske podatke - ali nemojte sebi dodatno otežavati život .


Odgovor 2:

To ovisi o kodu u svakoj datoteci, ali odgovor je u osnovi isti:

Bez obzira je li funkcija metoda objekta ili je ona gola u modulu, možete je uvesti odakle god je deklarirana do mjesta gdje je želite koristiti.

Možda imate dobre razloge zbog kojih niste ugradili svoju funkciju u objekt, ali možda biste željeli potvrditi taj razlog. Postoje razumni argumenti za i protiv.

Nazovimo datoteku Python koda 'modulom'. Povoljno, Python moduli daju nam „besplatni“ prostor imena kako bismo spriječili da naše deklaracije budu izvan globalnog prostora imena, gdje se mogu sudarati s trenutnim ili budućim deklaracijama negdje drugdje u kodu.

Struktura direktorija usko povezanih modula naziva se paket.

Struktura direktorija nepovezanih modula naziva se ... nered.

U svakom slučaju, ako jedan modul, pohranjen u datoteci koja se naziva foo.py, sadrži funkciju nazvanu bar:

def bar (stvar1, stvar2): vrati "{0}, {1}". format (stvar1, stvar2)// ovo trenutno zanemarimo def yoda_speak (stvar1, stvar2): vrati "{0}, {1}". format (stvar2, stvar1)

... onda u drugu datoteku možete uvesti funkcijsku traku iz modula foo:

s trake za uvoz foothing = bar ("uvezeno", "ovo")

... ili možete uvesti cijeli modul foo, svi dobiti pristup svim njegovim funkcijama odjednom, ako ste sigurni da ćete ih sve htjeti ... sve dok ih pozivate prema njihovom imenskom prostoru (npr. Foo.function_name () ) ...

import fooboth_things = foo.bar ("Pazite s ovim", "ali možete uvesti sve funkcije u ovom modulu") yoda_speak = foo.anti_bar ("ovo je", "Natrag")

Odgovor 3:

Postoji slučaj koji radi točno ono što opisujete u svom pitanju, iako to možda nije vaš slučaj upotrebe. To je * zatvaranje *.

def moja funkcija (a): b = 2 * a def miofunkcija (c): povratak b * c vrati mioterfunkciju

myotherfunction učinkovito čuva kopiju a, koja će se koristiti svaki put kad se pozove

myother = moja funkcija (5)rezultat = myother (5)ispis (rezultat)

koji će ispisati: 50

Lokalna varijabla b rezultat je a * 2, koji je u našem slučaju bio 5. To se čuva kao referenca za mioterfunkciju koja je povratna vrijednost

Svaki put kad se pozove vraćena funkcija, pomnožit će argument c s vrijednošću lokalne varijable b koja je zadržana kao referenca.


Odgovor 4:

Ponudit ću druge načine, iako je upotreba klase i metoda i atributa pravi put.

"" eksplicitno rješenje, propuštanje informacija kroz promjenjivi. Ovako nešto koristim za rekurzivne programe s informacijama o stanju.""uvozni otisakdef f (d: dict) -> Ništa: print ('funkcija f: popunjavanje argumenta s lokalnim varijablama') a_local_variable = 'f me stvorio' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Ništa: ispis ('FUNKCIJA g: KORIŠTENJE ARGUMENTA S LOKALNIM PROMJENJIMA KREIRANIMA DRUGJE') pprint.pprint (d)def glavni (): pass_variables_around = {} f (pass_variables_around) g (propusne_varijable_ okolo)glavni()

Odgovor 5:
varijabla = 0def modify_global (): globalna varijabla varijabla + = 1varijabla ispisa>>>> 1

Globalna ključna riječ omogućuje lokalnu izmjenu globalnih varijabli u funkciji.

Definiranje funkcije unutar druge ne prolazi vrijednost istoimenovanih varijabli. Provjeri

9. Predavanja - Python 3.7.0 dokumentacija

odjeljci 9.1 i 9.2 za lijepo kratko objašnjenje kako imenovanje funkcionira u Pythonu.


Odgovor 6:
def func1 (): globalno a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b povratak za = func2 (4, 6)ispis (a)# Novi sam u pythonu, pa nisam siguran je li ovo najbolje rješenje. Ali ovo je jedno od rješenja.U osnovi morate napraviti varijable a i b globalnim dok ih deklarirate ako ih želite koristiti u drugoj funkciji.

Odgovor 7:

Nisam sigurna da razumijem što mislite. Ali ako uvezite funkciju iz jedne datoteke u drugu, uvoznik može funkciji proslijediti vrijednosti i funkcija može ažurirati bilo što u svojoj datoteci.

Međutim, ako dobro razumijem (a vrlo je vjerojatno da ne razumijem), ono što pokušavate učiniti je, u mnogim slučajevima, vrlo loša programska praksa, oslanjajući se na globalne module.


Odgovor 8:

Iako sigurno postoje načini, nemojte to činiti. Ako želite izmijeniti neke vrijednosti unutar funkcije i koristiti te izmijenjene vrijednosti u drugoj funkciji, proslijedite vrijednosti koje treba izmijeniti prvoj funkciji putem parametara poziva i prihvatite izmijenjene vrijednosti kao povratnu vrijednost funkcije. Proslijedite modificirane vrijednosti drugoj funkciji i prihvatite njihove povratne vrijednosti.

Ovo je općenito prihvaćena najbolja praksa iz paradigme funkcionalnog programiranja koja pokušava minimizirati (neočekivano neočekivano) nuspojave pozivanja funkcije.


Odgovor 9:

Kôd koji ste naveli ispisat će pogreške.

Zašto? Zbog načina na koji funkcioniraju promjenjivi opsezi u Pythonu. a i b, deklarirani u func (), samo utječu na tu funkciju, to je njihov opseg.

Ako želite izmijeniti vrijednosti globalne varijable unutar funkcije, morate upotrijebiti globalnu ključnu riječ:

globalni xx = 123ispis xfunc ()ispis xdef func (): x = 124

tl; dr Vaš kôd takav kakav jest neće raditi.


Odgovor 10:

Da, ovo je ono što tražite. Nadam se da pomaže.

def c (): r = raw_input ("Pitati nešto?") ... povratak rdef p (x): ... učini nešto ....r = c ()p (r)