cara mengaktifkan fungsi dari skrip lain


Jawapan 1:

Kod asal anda ialah:

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

Terdapat beberapa cara untuk melakukan ini:

# Gunakan nilai pulangan # Jelaskan bahawa panggilan ke func2 bergantung pada hasilnya # panggilan ke func1def func1 (): a = 8 b = 9 mengembalikan a, bdef func2 (x, y, args): a, b = * args # Bongkar dari argumen z = x + y + a + b kembali za = func2 (4,6, args = func1 ())mencetak (a)# tetapi anda boleh lakukan: a = func2 (4,6, args = (9,11)) # Anda tidak memerlukan fungsi untuk membuat data anda

atau

# Fungsi lulus: # Dalam penyelesaian ini, anda bersikap tegas semasa menelefon # func2 yang perlu dipanggil func1: func1 adalah fungsi pembantudef func1 (): a = 8 b = 9 mengembalikan a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b kembali za = func2 (4,6, func1)mencetak (a)# Sekiranya anda mempunyai fungsi lain yang menghasilkan sepasang nilai # anda boleh lulus juga

Saya katakan tidak menggunakan Globals sama sekali - ia kelihatan seperti penyelesaian cepat tetapi mereka adalah kebiasaan yang sangat buruk untuk masuk.

Secara global, definisi mewakili maklumat tentang bagaimana fungsi anda berfungsi yang berada di luar argumen untuk fungsi anda, yang boleh menjadikan fungsi anda lebih sukar untuk diuji - kerana anda sekarang harus menyampaikan argumen ke fungsi anda dan secara terpisah menetapkan nilai global yang relevan agar untuk menguji fungsi anda (anda menguji fungsi anda, bukan). Kadang-kadang mustahil untuk menjauhkan diri dari data Global (misalnya pangkalan data, laman web luaran), dan anda perlu melewati gelung kadang-kadang untuk menguji kod anda apabila anda mempunyai data luaran - tetapi jangan membuat hidup lebih sukar bagi diri anda .


Jawapan 2:

Itu bergantung pada kod di setiap fail, tetapi jawapannya pada dasarnya sama:

Sama ada fungsinya adalah kaedah objek, atau hanya telanjang dalam modul, anda boleh mengimportnya dari mana sahaja ia dinyatakan, ke mana sahaja anda mahu menggunakannya.

Anda mungkin mempunyai alasan yang baik untuk tidak memasukkan fungsi anda ke dalam objek, tetapi anda mungkin ingin mengesahkan alasan tersebut. Terdapat hujah yang masuk akal untuk menentang dan menentang.

Mari kita panggil fail kod Python sebagai 'modul'. Dengan mudahnya, modul Python memberi kita ruang nama "percuma" untuk menjaga pernyataan kita keluar dari ruang nama global, di mana mereka mungkin bertembung dengan pernyataan semasa atau masa depan di tempat lain dalam kod.

Struktur direktori modul yang berkait rapat disebut pakej.

Struktur direktori modul yang tidak berkaitan disebut… berantakan.

Walau bagaimanapun, jika satu modul, disimpan dalam fail bernama foo.py, mengandungi fungsi bernama bar:

bar def (perkara1, perkara2): kembali "{0}, {1}". format (perkara1, perkara2)// abaikan perkara ini buat masa ini def yoda_speak (perkara1, perkara2): kembali "{0}, {1}". format (benda2, perkara1)

... kemudian, dalam fail lain, anda boleh mengimport bar fungsi dari modul foo:

dari bar import foothing = bar ("diimport", "ini")

… Atau, anda boleh mengimport seluruh modul foo, semuanya dapat mengakses semua fungsinya sekaligus, jika anda pasti anda mahukan semuanya… selagi anda merujuknya dengan ruang nama mereka (mis. Foo.function_name () ) ...

import fooboth_things = foo.bar ("Berhati-hati dengan ini", "tetapi anda boleh mengimport semua fungsi dalam modul ini") yoda_speak = foo.anti_bar ("ini adalah", "Ke belakang")

Jawapan 3:

Ada kes yang sesuai dengan apa yang anda jelaskan dalam soalan anda, walaupun mungkin ini bukan kes penggunaan anda. Ia adalah * penutupan *.

def fungsi (a): b = 2 * a def myotherfungsi (c): pulangan b * c mengembalikan fungsi myother

myotherfunction secara berkesan menyimpan salinan a, yang akan digunakan setiap kali dipanggil

myother = myfungsi (5)hasil = myother (5)cetak (hasil)

yang akan dicetak: 50

Pemboleh ubah tempatan b adalah hasil dari * 2, yang dalam kes kami adalah 5. Ini disimpan sebagai rujukan untuk myotherfungsi yang merupakan nilai kembali

Setiap kali fungsi yang dikembalikan dipanggil, ia akan menggandakan argumen c dengan nilai pemboleh ubah tempatan b yang telah disimpan sebagai rujukan.


Jawapan 4:

Saya akan menawarkan cara lain, walaupun menggunakan kelas dan kaedah serta atribut adalah cara yang sesuai.

'' ' penyelesaian eksplisit, menyampaikan maklumat melalui perubahan. Saya menggunakan sesuatu seperti ini untuk program rekursif dengan maklumat negeri.'' 'import kertasdef f (d: dict) -> Tiada: cetak ('fungsi f: mengisi argumen dengan pemboleh ubah tempatan') a_local_variable = 'f mencipta saya' d ['a_local_variable_from_elswhere'] = a_local_variabledef g (d: dict) -> Tiada: cetak ('FUNGSI g: MENGGUNAKAN ARGUMEN DENGAN VARIABEL TEMPATAN YANG DIBUAT DI MANA-MANA') pprint.pprint (d)def utama (): pass_variables_around = {} f (lulus_variables_around) g (lulus_variables_around)utama ()

Jawapan 5:
pemboleh ubah = 0def modify_global (): pemboleh ubah global pemboleh ubah + = 1pemboleh ubah cetak>>>> 1

Kata kunci global membolehkan pengubahsuaian pemboleh ubah global secara tempatan dalam fungsi.

Mendefinisikan fungsi di dalam yang lain tidak melewati nilai pemboleh ubah bernama yang sama. Lihatlah

9. Kelas - Python 3.7.0 dokumentasi

bahagian 9.1 dan 9.2 untuk penjelasan ringkas bagaimana kerja penamaan di Python.


Jawapan 6:
def func1 (): global a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b kembali za = func2 (4, 6)mencetak (a)#Saya baru menggunakan python jadi saya tidak pasti apakah ini adalah penyelesaian terbaik. Tetapi ini adalah salah satu penyelesaiannya.Anda pada dasarnya harus membuat pemboleh ubah a dan b global sambil menyatakannya jika anda ingin menggunakannya dalam fungsi lain.

Jawapan 7:

Saya tidak pasti bahawa saya faham maksud anda. Tetapi jika anda mengimport fungsi dari satu fail ke file lain, pengimport dapat menyampaikan nilai ke fungsi tersebut dan fungsi tersebut dapat mengemas kini apa pun dalam failnya sendiri.

Walau bagaimanapun, jika saya faham dengan betul (dan kemungkinan besar saya tidak), apa yang anda cuba lakukan adalah, dalam banyak kes, amalan pengaturcaraan yang sangat buruk, bergantung pada modul global.


Jawapan 8:

Walaupun ada cara yang pasti, jangan lakukannya. Sekiranya anda ingin mengubah beberapa nilai di dalam fungsi dan menggunakan nilai-nilai yang diubah dalam fungsi lain, sampaikan nilai yang akan diubah ke fungsi pertama melalui parameter permintaan dan terima nilai yang diubah sebagai nilai kembali fungsi. Lulus nilai yang diubah ke fungsi kedua dan terima nilai kembali.

Ini adalah amalan terbaik yang diterima umum dari paradigma Pengaturcaraan Fungsional yang cuba mengurangkan kesan sampingan (tidak dijangka tidak jelas) apabila memanggil fungsi.


Jawapan 9:

Kod yang anda berikan akan menyebabkan kesalahan.

Kenapa? Kerana bagaimana skop pemboleh ubah di Python berfungsi. a dan b, dinyatakan dalam func (), hanya mempengaruhi fungsi itu, itulah skop mereka.

Sekiranya anda ingin mengubah nilai pemboleh ubah global di dalam fungsi, anda mesti menggunakan kata kunci global:

global xx = 123mencetak xfunc ()mencetak xdef func (): x = 124

tl; dr Kod anda, sebagaimana adanya, tidak akan berfungsi.


Jawapan 10:

Ya, Inilah yang anda cari. Semoga ia membantu.

def c (): r = raw_input ("Tanya Sesuatu?") ... pulangan rdef p (x): ... lakukan sesuatu ….r = c ()p (r)