Передать значение переменной из одной функции в другую
Есть две функции func1 и func2 . В func1 происходит определение нескольких переменных и присвоение им значений. Функция func2 должна работать с одной из переменных функции func1 . Такой код не работает.
class C(object): def func1(self): a = "test" b = "test2" def func2(self): if a == "test": print(a) d = C() d.func1() d.func2()
Вкладывать func2 в func1 нельзя. Но, если сделать переменную а глобальной, то все прекрасно работает.
class C(object): def func1(self): global a a = "test" b = "test2" def func2(self): if a == "test": print(a) d = C() d.func1() d.func2()
Делать переммые глобальными — это неправильно, не так ли? Как передать значение переменной из одной фукции в другую, не делая её глобальной?
Передача переменной из одной функции в другую
совет начинающему программисту: всегда пишите такие функции, которые возвращают результат при помощи return . и никогда не используйте глобальные переменные (пока точно не будете знать что вы делаете) 😉 PS с опытом прийдет понимание когда данные правила можно нарушать.
20 июл 2019 в 11:37
Использование global в Python — советую внимательно прочитать ответы.
20 июл 2019 в 12:00
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Для этого Вы можете воспользоваться инструкцией global , например:
global name name = fruits[rand]
Возьмите на заметку!
Использовать глобальные переменные — ужасное архитектурное решение.
Если есть возможность избегать их — это обязательно нужно сделать.
Лучше сделать так:
import random def get_rand_fruit(fruits: list) -> str: rand_fruit = random.choice(fruits) return rand_fruit fruits = ('яблоко', 'абрикос', 'авокадо', 'банан', 'кокос', 'инжир') name = get_rand_fruit(fruits) print(name)
Как в Python передать значение переменной из функции одного файла в другой файл?
Интересует вопрос передачи значения переменной из функции в другой файл. То есть у меня есть файл 1.py и 2.py. Например в файле 1.py есть функция:
def fun(): d1=0.5 subprocess.Popen(2.py,shell=True) # Из этой функции запускается второй файл
В другом файле например может быть:
print(d1)
То есть я пробовал через import, но в целом понятно почему не работает. Как мне передать эту переменную?
Отслеживать
задан 1 янв 2019 в 19:09
The person with the question The person with the question
124 2 2 серебряных знака 11 11 бронзовых знаков
Выглядит как проблема XY? Какова цель всего этого?
1 янв 2019 в 19:16
d1 у вас — локальная переменная функции fun . Вы её в том же файле вне функции то достать не сможете, не говоря уже о передаче в другой файл.
1 янв 2019 в 19:23
Уж простите, но вам бы почитать основы языка. Сразу отпадут многие тривиальные вопросы.
1 янв 2019 в 19:48
Я всё понимаю на счёт основ языка. Просто возникла такая проблема. Вдруг есть какая-то библиотека или ещё что-то что могло мне помочь, поэтому и спросил. Спасибо за ответы.
Как передать переменную из одной функции в другую python
Передача функции в качестве аргумента другой функции в Python
Один из самых волнующих фактов, которые мы узнаем в этой статье, заключается в том, что вы можете передавать функции в другие функции. Вы можете передавать функции, потому что в Python функции являются объектами.
Скорее всего, вам не нужно знать об этом на первой неделе использования Python, но, углубившись в Python, вы обнаружите, что очень удобно понимать, как передавать функцию в другую функцию.
На функции можно ссылаться
Если вы попытаетесь использовать функцию без круглых скобок после нее, Python не будет жаловаться, но он также не сделает ничего полезного:
Это относится и к методам (методы — это функции, которые живут на объектах):
Python позволяет нам ссылаться на эти функциональные объекты так же, как мы можем ссылаться на строку, число или объект range :
Поскольку мы можем ссылаться на функции как любой другой объект, мы можем указать переменной ссылку на функцию:
Переменная gimme теперь указывает на метод pop в нашем списке numbers . Поэтому, если мы вызовем gimme , то сделаем то же самое, что и вызов numbers.pop :
Обратите внимание, что мы не сделали новую функцию. Мы только что указали переменной gimme ссылку на функцию numbers.pop :
Вы даже можете хранить функции внутри структур данных и затем ссылаться на них позже:
Нередко возникает необходимость взять функцию и дать ей другое имя или сохранить ее внутри структуры данных, но Python позволяет нам делать это, потому что функции можно передавать, как и любой другой объект.
Функции могут быть переданы в другие функции
Функции, как и любой другой объект, могут быть переданы в качестве аргумента другой функции.
Например, мы могли бы определить функцию:
А затем передайте ее во встроенную функцию help , чтобы посмотреть, что она делает:
И мы можем передать функцию самой себе (да, это странно), которая преобразует ее в строку:
На самом деле в Python встроено довольно много функций, которые специально предназначены для принятия других функций в качестве аргументов.
Встроенная функция filter принимает в качестве аргумента две вещи: function и iterable .
Данная итерация (список, кортеж, строка и т.д.) Зацикливается, и данная функция вызывается для каждого элемента в этой итерации: всякий раз, когда функция возвращает True (или другое истинное значение), элемент включается в вывод filter .
Так что, если мы передадим filter функцию is_odd (которая возвращает True , если заданное число нечетное) и список чисел, нам вернутся все числа, которые не кратны 2-ум.
Возвращаемый filter объект — это ленивый итератор, поэтому нам нужно было преобразовать его в list , чтобы реально увидеть его вывод.
Поскольку функции могут быть переданы в функции, это также означает, что функции могут принимать другую функцию в качестве аргумента. Функция filter принимает первым аргументом функцию. Вы можете представить filter так же, как функцию приведенную ниже:
Эта функция ожидает, что аргумент predicate будет функцией (технически это может быть любой вызываемый объект). Когда мы вызываем эту функцию (с predicate(item) ), мы передаем ей один аргумент, а затем проверяем возвращаемое значение.
Лямбда-функции являются примером этого
Лямбда-выражение — это специальный синтаксис в Python для создания анонимной функции. Когда вы создаете лямбда-выражение, возвращаемый объект называется лямбда-функцией.
Лямбда-функции во многом похожи на обычные функции Python, с некоторыми оговорками.
В отличие от других функций, лямбда-функции не имеют имени (их имя отображается как lambda ). У них также не может быть строк документации, и они могут содержать только одно выражение Python.
Вы можете думать о лямбда-выражении как о ярлыке для создания функции, которая будет оценивать одно выражение Python и возвращать результат этого выражения.
Таким образом, определение лямбда-выражения на самом деле не оценивает это выражение: оно возвращает функцию, которая может вычислить это выражение позже.
Я хотел бы отметить, что все три из приведенных выше примеров являются плохими примерами lambda . Если вы хотите, чтобы имя переменной указывало на объект функции, который вы можете использовать позже, вы должны использовать def для ее определения: это обычный способ определения функции.
Лямбда-выражения предназначены для случаев, когда мы хотим определить функцию и сразу передать ее в другую функцию.
Например, здесь мы используем filter для получения четных чисел, но мы используем лямбда-выражения, поэтому нам не нужно определять функцию is_even перед ее использованием:
Это наиболее подходящее использование лямбда-выражений: передача функции в другую функцию при определении этой переданной функции в одной строке кода.
Нравится ли вам этот синтаксис или нет, вы должны знать, что этот синтаксис является просто ярлыком для создания функции.
Всякий раз, когда вы видите lambda выражения, имейте в виду, что:
- Лямбда-выражение — это специальный синтаксис для создания функции и передачи ее другой функции в одной строке кода.
- Лямбда-функции аналогичны всем другим функциональным объектам: ни один не является более особенным, чем другие, и оба могут быть переданы
Все функции в Python могут быть переданы в качестве аргумента другой функции (это единственное назначение лямбда-функций).
Типичный пример: функции key
Помимо встроенной функции filter , где вы когда-нибудь увидите функцию, переданную в другую функцию? Вероятно, наиболее распространенное место, где вы увидите это в самом Python, — это функция key .
Это общее соглашение для функций, которые принимают итерируемые для сортировки / упорядочения, чтобы также принимать именованный аргумент с именем key . Аргумент key должен быть функцией или другим вызываемым объектом.
Функции sorted , min и max следуют этому соглашению принятия функции key :
Эта key функция вызывается для каждого значения в итерируемом объекте, а возвращаемое значение используется для упорядочения / сортировки каждого из итерируемых элементов. Вы можете думать об этой функции как о вычислении ключа сравнения для каждого элемента итерируемого объекта.
В приведенном выше примере наш ключ сравнения возвращает строку в нижнем регистре, поэтому каждая строка сравнивается по версии в нижнем регистре (что приводит к регистронезависимому порядку).
Для этого мы использовали функцию normalize_case , но то же самое можно сделать, используя str.casefold :
Примечание: этот трюк немного странный, если вы не знакомы с тем, как работают классы. Классы хранят несвязанные методы, которые при вызове будут принимать экземпляр этого класса. Обычно мы печатаем my_string.casefold() , но Python переводит это в str.casefold(my_string) .
Здесь мы находим строку с наибольшим количеством букв в ней:
Если есть несколько максимумов или минимумов, выигрывает самый ранний (вот как min / max работа):
Вот функция, которая будет возвращать кортеж из 2 элементов, содержащий длину заданной строки и нормализованную по регистру версию этой строки:
Мы могли бы передать функцию length_and_alphabetical в качестве аргумента key , чтобы сначала отсортировать наши строки по их длине sorted , а затем по их нормализованному регистру:
Это основывается на том факте, что операторы Python для упорядочивания выполняют глубокие сравнения.
Другие примеры передачи функции в качестве аргумента
Аргумент key принимаемый sorted , min и max это только один общий пример передачи функций в функцию.
Еще две встроенные функции Python — map и filter .
Мы уже видели, что filter будет фильтровать наш список на основе возвращаемого значения данной функции.
Функция map будет вызывать данную функцию по каждому пункту в данный итерации и использовать результат этой функции вызова в качестве нового пункта:
Например, здесь мы конвертируем числа в строки и возводим в квадрат:
Аналогично map , и filter , также есть TakeWhile и dropwhile от модуля itertools . Первый аналогичен filter , за исключением того, что останавливается, когда находит значение, для которого предикатная функция имеет значение false . Второй делает противоположное: он включает значения только после того, как функция предиката стала ложной.
И есть functools.reduce и itertools.accumulate, которые оба вызывают 2-аргумент (функцию) для значений взвешенного суммирования:
Класс defaultdict в модуле collections является еще одним примером. Класс defaultdict создает словарь, как объекты, которые никогда не бросит KeyError , когда отсутствует ключ, но вместо этого будет автоматически добавлено новое значение в словаре.
Этот класс defaultdict принимает вызываемую функцию (функцию или класс), которая будет вызываться для создания значения по умолчанию при каждом обращении к отсутствующему ключу.
Приведенный выше код работал, потому что int возвращает 0 при вызове без аргументов:
Здесь используется значением по умолчанию list , которое возвращает новый список при вызове без аргументов.
Функция partial в модуле functools является еще одним примером. partial принимает функцию и любое количество аргументов и возвращает новую функцию (технически она возвращает вызываемый объект).
Вот пример partial , используемый для «привязки» аргумента ключевого слова sep к функции print :
Возвращенная функция print_each теперь делает то же самое, как если бы она была вызвана print с sep=’\n’ :
Как передать переменную из одной функции в другую python
В Python функция фактически представляет отдельный тип. Так мы можем присвоить переменной какую-нибудь функцию и затем, используя переменную, вызывать данную функцию. Например:
В данном случае переменной message присваивается одна из функций. Сначала ей передается функция say_hello() :
После этого переменная message будет указывать на данную функцию, то есть фактически представлять функцию say_hello. А это значит, что мы можем вызывать переменную message как обычную функцию:
Фактически это приведет к выполнению функции say_hello, и на консоль будет выведена строка «Hello». Затем подобным образом мы можем передать переменной message другую функцию и вызвать ее.
Подобным образом можно через переменную вызывать функцию с параметрами и возвращать ее результат:
Функция как параметр функции
Поскольку функция в Python может представлять такое же значение как строка или число, соответственно мы можем передать ее в качестве параметра в другую функцию. Например, определим функцию, которая выводит на консоль результат некоторой операции:
В данном случае функция do_operation имеет три параметра, причем третий параметр, как предполагается, будет представлять функцию, которая принимает два параметра и возвращает некоторый результат. Иными словами третий параметр — operation представляет некоторую операцию, но на момент определения функции do_operation мы точно не знаем, что это будет за операция. Мы только знаем, что она принимает два параметр и возвращает какой-то результат, который потом выводится на консоль.
При вызове функции do_operation мы сможем передать в качестве третьего параметра другую функцию, например, функцию sum:
То есть в данном случае параметр operation фактически будет представлять функцию sum и будет возвращать сумму дву чисел.
Затем аналогичным образов в вызов функции do_operation можно передать третьему параметру другую функцию — multiply, которая выполнит умножение чисел:
Таким образом, более гибкие по функциональности функции, которые через параметры принимают другие функции.
Функция как результат функции
Также одна функция в Python может возвращать другую функцию. Например, определим функцию, которая в зависимости от значения параметра возвращает ту или иную операцию:
В данном случае функция select_operation в зависимости от значения параметра choice возвращает одну из трех функций — sum, subtract и multiply. Затем мы мы можем получить результат функции select_operation в переменную operation:
Так, в данном случае в функцию select_operation передается число 1, соответственно она будет возвращать функцию sum. Поэтому переменная operation фактически будет указывать на функцию sum, которая выполняет сложение двух чисел:
Похожие публикации:
- No eth на терминале сбербанка что значит
- Как написать текст в столбик в html
- Как преобразовать char в int
- Как рисовать бойфренда из игры fnf
