başqa bir skriptdən bir funksiyanı necə aktivləşdirmək olar


cavab 1:

Orijinal kodunuz:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b qayıt za = func2 (4,6)çap (a)

Bunun bir neçə yolu var:

# Qaytarma dəyərlərindən istifadə edin # Func2 çağırışının nəticəyə söykəndiyini açıq şəkildə bildirin Func1 çağırışının #def func1 (): a = 8 b = 9 qayıt a, bdef func2 (x, y, args): a, b = * args # Arqumentlərdən paketdən çıxarın z = x + y + a + b qayıt za = func2 (4,6, args = func1 ())çap (a)# ancaq edə bilərdin: a = func2 (4,6, args = (9,11)) # Məlumatlarınızı yaratmaq üçün bir funksiyaya ehtiyacınız yoxdur

və ya

# Pass funksiyaları: # Bu həlldə zəng etdiyiniz zaman açıq şəkildə bildirilirsiniz Func1 çağırması lazım olan # func2: func1 köməkçi bir funksiyadırdef func1 (): a = 8 b = 9 qayıt a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b qayıt za = func2 (4,6, func1)çap (a)# Bir cüt dəyər yaradan başqa bir işiniz varsa # bunu da keçə bilərsən

Globalları ümumiyyətlə istifadə etməyin deyərdim - onlar tez bir həll kimi görünürlər, amma daxil olmaq çox pis bir vərdişdirlər.

Tərifinə görə qlobal maddələr funksiyanızın necə işləməsi barədə məlumatları əks etdirir, bu funksiyanızın arqumentləri xaricindədir və bu, funksiyanızı sınamağı daha da çətinləşdirə bilər - çünki artıq funksiyanıza arqumentlər ötürməli və müvafiq qlobal dəyərləri ayrıca olaraq təyin etməlisiniz. funksiyanızı yoxlamaq üçün (funksiyalarınızı yoxlayırsınız, yoxsa yox). Bəzən Qlobal məlumatlardan (məsələn, verilənlər bazaları, xarici veb saytlar) qaçmaq mümkün olmur və xarici məlumatlar olduqda kodunuzu yoxlamaq üçün bəzən halqalardan keçməlisiniz - ancaq həyatı özünüz üçün daha da çətinləşdirməyin. .


cavab 2:

Bu, hər bir sənəddəki koddan asılıdır, lakin cavab mahiyyətcə eynidir:

Funksiya bir obyektin bir metodu olsun, ya da sadəcə bir modulda çılpaq olsun, elan olunduğu yerdən istifadə etmək istədiyiniz yerə idxal edə bilərsiniz.

İşinizi bir obyektə yerləşdirməməyiniz üçün yaxşı səbəblər ola bilər, ancaq bu səbəbi təsdiqləmək istəyə bilərsiniz. Əleyhinə və əleyhinə ağlabatan dəlillər var.

Python kodunun bir sənədini 'modul' adlandıraq. Rahat şəkildə, Python modulları, bəyannamələrimizi kodun başqa yerlərində mövcud və ya gələcək bəyannamələrlə toqquşa biləcəkləri qlobal ad məkanından kənarda saxlamağımız üçün bizə "pulsuz" ad sahəsi verir.

Yaxından əlaqəli modulların bir qovluq quruluşuna paket deyilir.

İlgili olmayan modulların bir qovluq quruluşuna ... qarışıqlıq deyilir.

Hər halda, foo.py adlı bir sənəddə saxlanılan bir modulda bar adlı bir funksiya varsa:

def bar (şey1, şey2): "{0}, {1}" qayıt. format (şey1, şey2)// bu an üçün bunu görməməzlikdən gəlin def yoda_speak (şey1, şey2): "{0}, {1}" qayıdın. format (thing2, thing1)

... sonra başqa bir faylda, funksiya çubuğunu moduldan ala bilərsiniz:

foo idxal çubuğundanşey = bar ("idxal", "bu")

… Və ya bütün modulları idxal edə bilərsiniz, hamısı birdən-birə bütün funksiyalarına giriş əldə edə bilərsiniz, əgər hamısını istədiyinizə əminsinizsə ... ad sahəsi ilə müraciət etdikdə (məsələn foo.function_name () ) ...

idxal fooboth_things = foo.bar ("Bununla diqqətlə", "ancaq bu moduldakı bütün funksiyaları idxal edə bilərsiniz") yoda_speak = foo.anti_bar ("bu", "Geri")

cavab 3:

Sualınızda təsvir etdiyinizi tam yerinə yetirən bir iş var, baxmayaraq ki bu sizin işiniz olmaya bilər. Bu * bağlanma *.

def myfunction (a): b = 2 * a myotherfunction def (c): qayıt b * c myotherfunction qayıt

myotherfunction effektiv olaraq hər dəfə istifadə ediləcək bir nüsxəsini saxlayır

myother = myfunction (5)nəticə = başqa (5)çap (nəticə)

çap edəcək: 50

Yerli b dəyişən, bizim vəziyyətimizdə 5 olan bir * 2-nin nəticəsidir.

Hər dəfə qaytarılan funksiya çağırıldıqda, c arqumentini istinad olaraq saxlanılan yerli dəyişən b dəyərinə vuracaqdır.


cavab 4:

Başqa yollar təklif edəcəm, baxmayaraq ki, bir sinifdən istifadə etmək və metodlardan və atributlardan istifadə etmək yolu.

'' ' açıq bir həll, dəyişdirilə bilən bir məlumat ötürmək. Dövlət məlumatları olan rekursiv proqramlar üçün belə bir şeydən istifadə edirəm.'' 'idxal pprintdef f (d: dict) -> Heç biri: print ('funksiya f: yerli dəyişənlərlə doldurulan arqument') a_local_variable = 'f məni yaratdı' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Heç biri: çap ('FUNKSİYA g: YERLİ DƏYİŞƏNLƏR İLƏ ARGÜSTÜN İSTİFADƏSİ') pprint.pprint (d)def main (): pass_variables_around = {} f (dəyişmə_variables_around) g (dəyişmə_variables_around)əsas ()

cavab 5:
dəyişən = 0def modify_global (): qlobal dəyişən dəyişən + = 1çap dəyişən>>>> 1

Qlobal açar söz bir funksiyada qlobal dəyişənlərin lokal olaraq dəyişdirilməsinə imkan verir.

Başqa bir funksiyanın müəyyən edilməsi eyni adlanan dəyişənlərin dəyərini keçmir. Yoxla

9. Dərslər - Python 3.7.0 sənədləri

9.1 və 9.2 bölmələri, adın Python-da necə işlədiyini izah edən qısa bir açıqlama üçün.


cavab 6:
def func1 (): qlobal a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b qayıt za = func2 (4, 6)çap (a)# Python üçün yeniyəm, buna görə bunun ən yaxşı həlli olub-olmadığına əmin deyiləm. Ancaq bu həll yollarından biridir.Əsasən a və b dəyişənlərini başqa bir funksiyada istifadə etmək istəyirsinizsə, elan edərkən qlobal etməlisiniz.

cavab 7:

Nə demək istədiyinizi başa düşdüyümə əmin deyiləm. Ancaq bir funksiyanı başqa bir fayla idxal edirsinizsə, idxalçı funksiyaya dəyərlər ötürə bilər və funksiya öz sənədindəki hər hansı bir şeyi yeniləyə bilər.

Lakin, düzgün başa düşsəm (və çox güman ki, anlamamışam), etməyə çalışdığınız şey bir çox hallarda modul qloballarına güvənərək çox pis bir proqramlaşdırma təcrübəsidir.


cavab 8:

Əlbətdə yollar olsa da, bunu etmə. Bir funksiyanın içərisindəki bəzi dəyərləri dəyişdirmək və bu dəyişdirilmiş dəyərləri başqa bir funksiyada istifadə etmək istəyirsinizsə, dəyişdiriləcək dəyərləri çağırış parametrləri vasitəsilə birinci funksiyaya keçirin və dəyişdirilmiş dəyərləri funksiyanın qaytarma dəyəri kimi qəbul edin. Dəyişdirilən dəyərləri ikinci funksiyaya keçirin və qaytarma dəyərlərini qəbul edin.

Bu, bir funksiyanı çağırmanın yan təsirlərini minimuma endirməyə (gözlənilməz, aşkar olmayan) cəhd göstərən İşlevsel Proqramlaşdırma paradiqmasından ümumiyyətlə qəbul edilmiş ən yaxşı təcrübədir.


cavab 9:

Təqdim etdiyiniz kod səhv atacaq.

Niyə? Pythondakı dəyişən sahələrin necə işlədiyinə görə. a (a) və b (b), function () ilə elan olunan funksiyanı təsir edir, bu onların əhatə dairəsidir.

Bir funksiyanın içərisində bir qlobal dəyişənin dəyərlərini dəyişdirmək istəyirsinizsə, qlobal açar sözdən istifadə etməlisiniz:

qlobal xx = 123çap xFunc ()çap xdef func (): x = 124

tl; dr Kodunuz olduğu kimi işləməyəcək.


cavab 10:

Bəli, axtardığın budur. Ümid edirəm kömək edir.

def c (): r = raw_input ("Bir şey soruşun?") ... qayıt rdef p (x): ... nəsə et ....r = c ()p (r)