як активувати функцію з іншого сценарію


Відповідь 1:

Оригінальний код:

def func1 (): a = 8 b = 9def func2 (x, y): z = x + y + a + b повернути za = func2 (4,6)друк (а)

Є кілька способів зробити це:

# Використовуйте повернені значення # Будьте явними, що виклик func2 залежить від результату № виклику func1def func1 (): a = 8 b = 9 повернути a, bdef func2 (x, y, args): a, b = * args # Розпакувати з аргументів z = x + y + a + b повернути za = func2 (4,6, args = func1 ())друк (а)# але ви можете зробити: a = func2 (4,6, args = (9,11)) # Вам не потрібна функція для створення ваших даних

або

# Пропуск функції: # У цьому рішенні ви чітко говорите, коли телефонуєте # func2, який йому потрібно викликати func1: func1 - допоміжна функціяdef func1 (): a = 8 b = 9 повернути a, bdef func2 (x, y, func): a, b = func () z = x + y + a + b повернути za = func2 (4,6, func1)друк (а)# Якщо у вас є інша функція, яка генерує пару значень # Ви могли б і це передати

Я б сказав, що взагалі не використовуйте Globals - вони виглядають як швидке рішення, але це дуже погана звичка.

Глобальні слова за визначенням представляють інформацію про те, як працює ваша функція, яка знаходиться поза аргументами вашої функції, що може значно ускладнити перевірку вашої функції - адже тепер вам потрібно передавати аргументи своїй функції та окремо встановлювати відповідні глобальні значення в порядку щоб перевірити свою функцію (ви перевіряєте свої функції, чи не так). Іноді неможливо відійти від глобальних даних (наприклад, баз даних, зовнішніх веб-сайтів), і вам іноді доводиться перебирати обручі, щоб перевірити свій код, коли у вас є зовнішні дані - але не ускладнюйте собі життя ще більше .


Відповідь 2:

Це залежить від коду в кожному файлі, але відповідь по суті однакова:

Незалежно від того, чи є функція методом об'єкта, чи просто оголеною в модулі, ви можете імпортувати її звідки вона була оголошена, туди, де ви хочете її використовувати.

Можливо, у вас є вагомі причини для того, щоб не вбудовувати свою функцію в об’єкт, але ви можете перевірити цю причину. Є обґрунтовані аргументи за і проти.

Давайте назвемо файл коду Python "модулем". Зручно, модулі Python надають нам „вільний” простір імен, щоб тримати наші декларації поза глобальним простором імен, де вони можуть стикатися з поточними або майбутніми деклараціями в інших місцях коду.

Структура каталогів тісно пов'язаних модулів називається пакетом.

Структуру каталогів не пов’язаних між собою модулів називають… безладом.

У будь-якому випадку, якщо один модуль, що зберігається у файлі foo.py, містить функцію з іменем bar:

def bar (thing1, thing2): повернути “{0}, {1}”. format (thing1, thing2)// ігноруємо це на даний момент def yoda_speak (thing1, thing2): повернути "{0}, {1}". format (thing2, thing1)

… Тоді в іншому файлі ви можете імпортувати функціональну панель з модуля foo:

з панелі імпорту foothing = bar ("імпортовано", "це")

... або, ви можете імпортувати весь модуль foo, всі отримаєте доступ до всіх його функцій одночасно, якщо ви впевнені, що захочете їх усі ... до тих пір, поки ви будете посилатися на них за їхнім простором імен (наприклад, foo.function_name () ) ...

імпорт fooboth_things = foo.bar ("Обережно з цим", "але ви можете імпортувати всі функції цього модуля") yoda_speak = foo.anti_bar ("це", "Назад")

Відповідь 3:

Є випадок, який робить саме те, що ви описуєте у своєму запитанні, хоча це може бути не ваш варіант використання. Це * закриття *.

def my function (a): b = 2 * a def myother function (c): повернення b * c повернути міофункцію

myotherfunction ефективно зберігає копію a, яка використовуватиметься кожного разу, коли буде викликано

myother = моя функція (5)результат = міотер (5)друк (результат)

який надрукує: 50

Локальна змінна b є результатом a * 2, який у нашому випадку дорівнював 5. Це зберігається як посилання на функцію myother, яка є повернутим значенням

Кожного разу, коли повертається функція, вона помножує аргумент c на значення локальної змінної b, яка зберігалася як посилання.


Відповідь 4:

Я запропоную інші шляхи, хоча використання класу, методів та атрибутів - це шлях.

'' явне рішення, передача інформації через мутабельний. Я використовую щось подібне для рекурсивних програм із інформацією про стан.''імпортний відбитокdef f (d: dict) -> Немає: print ('функція f: заповнення аргументу локальними змінними') a_local_variable = 'f мене створив' d ['a_local_variable_from_elsewhere'] = a_local_variabledef g (d: dict) -> Немає: print ('ФУНКЦІЯ g: ВИКОРИСТАННЯ АРГУМЕНТУ З МІСЦЕВИМИ ЗМІННИМИ, СТВОРЕНИМИ В іншому місці') pprint.pprint (d)def main (): pass_variables_around = {} f (pass_variables_around) g (pass_variables_around)основний ()

Відповідь 5:
змінна = 0def modify_global (): глобальна змінна змінна + = 1змінна друку>>>> 1

Глобальне ключове слово дозволяє локально змінювати глобальні змінні у функції.

Визначення функції всередині іншої не передає значення тих самих іменних змінних. Перевіряти

9. Класи - документація на Python 3.7.0

розділи 9.1 та 9.2 для короткого короткого пояснення того, як іменування працює в Python.


Відповідь 6:
def func1 (): глобальний a, b a = 8 b = 9def func2 (x, y): func1 () z = x + y + a + b повернути za = func2 (4, 6)друк (а)# Я новачок у python, тому я не впевнений, що це найкраще рішення. Але це одне з рішень.Вам по суті потрібно зробити змінні a та b глобальними, одночасно оголошуючи їх, якщо ви хочете використовувати їх в іншій функції.

Відповідь 7:

Я не впевнений, що розумію, що ти маєш на увазі. Але якщо ви імпортуєте функцію з одного файлу в інший, імпортер може передавати значення функції, і функція може оновлювати будь-що у своєму власному файлі.

Однак, якщо я правильно розумію (і цілком імовірно, що ні), то, що ви намагаєтеся зробити, у багатьох випадках є дуже поганою практикою програмування, покладаючись на глобальні модулі.


Відповідь 8:

Хоча, звичайно, є способи, не робіть цього. Якщо ви хочете змінити деякі значення всередині функції та використовувати ці змінені значення в іншій функції, передайте значення, які потрібно змінити, першій функції за допомогою параметрів виклику та прийміть змінені значення як повернене значення функції. Передайте змінені значення другій функції та прийміть її повернені значення.

Це загальновизнана найкраща практика з парадигми функціонального програмування, яка намагається мінімізувати (несподівано неочевидні) побічні ефекти виклику функції.


Відповідь 9:

Код, який ви надали, видасть помилки.

Чому? Через те, як працюють змінні області в Python. a та b, оголошені у func (), просто впливають на цю функцію, це їх сфера дії.

Якщо ви хочете змінити значення глобальної змінної всередині функції, ви повинні використовувати глобальне ключове слово:

глобальний хx = 123друк xfunc ()друк xdef func (): x = 124

tl; dr Ваш код, як він є, не буде працювати.


Відповідь 10:

Так, це те, що ви шукаєте. Сподіваюся, це допоможе.

def c (): r = raw_input ("Запитати щось?") ... повернути rdef p (x): ... робити щось ....r = c ()p (r)