Как вытащить переменную из функции python
В Python функция фактически представляет отдельный тип. Так мы можем присвоить переменной какую-нибудь функцию и затем, используя переменную, вызывать данную функцию. Например:
def say_hello(): print("Hello") def say_goodbye(): print("Good Bye") message = say_hello message() # Hello message = say_goodbye message() # Good Bye
В данном случае переменной message присваивается одна из функций. Сначала ей передается функция say_hello() :
message = say_hello
После этого переменная message будет указывать на данную функцию, то есть фактически представлять функцию say_hello. А это значит, что мы можем вызывать переменную message как обычную функцию:
message() # Hello
Фактически это приведет к выполнению функции say_hello, и на консоль будет выведена строка «Hello». Затем подобным образом мы можем передать переменной message другую функцию и вызвать ее.
Подобным образом можно через переменную вызывать функцию с параметрами и возвращать ее результат:
def sum(a, b): return a + b def multiply(a, b): return a * b operation = sum result = operation(5, 6) print(result) # 11 operation = multiply print(operation(5, 6)) # 30
Функция как параметр функции
Поскольку функция в Python может представлять такое же значение как строка или число, соответственно мы можем передать ее в качестве параметра в другую функцию. Например, определим функцию, которая выводит на консоль результат некоторой операции:
def do_operation(a, b, operation): result = operation(a, b) print(f"result = ") def sum(a, b): return a + b def multiply(a, b): return a * b do_operation(5, 4, sum) # result = 9 do_operation(5, 4, multiply) # result = 20
В данном случае функция do_operation имеет три параметра, причем третий параметр, как предполагается, будет представлять функцию, которая принимает два параметра и возвращает некоторый результат. Иными словами третий параметр — operation представляет некоторую операцию, но на момент определения функции do_operation мы точно не знаем, что это будет за операция. Мы только знаем, что она принимает два параметр и возвращает какой-то результат, который потом выводится на консоль.
При вызове функции do_operation мы сможем передать в качестве третьего параметра другую функцию, например, функцию sum:
do_operation(5, 4, sum)
То есть в данном случае параметр operation фактически будет представлять функцию sum и будет возвращать сумму дву чисел.
Затем аналогичным образов в вызов функции do_operation можно передать третьему параметру другую функцию — multiply, которая выполнит умножение чисел:
do_operation(5, 4, multiply) # result = 20
Таким образом, более гибкие по функциональности функции, которые через параметры принимают другие функции.
Функция как результат функции
Также одна функция в Python может возвращать другую функцию. Например, определим функцию, которая в зависимости от значения параметра возвращает ту или иную операцию:
def sum(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def select_operation(choice): if choice == 1: return sum elif choice == 2: return subtract else: return multiply operation = select_operation(1) # operation = sum print(operation(10, 6)) # 16 operation = select_operation(2) # operation = subtract print(operation(10, 6)) # 4 operation = select_operation(3) # operation = multiply print(operation(10, 6)) # 60
В данном случае функция select_operation в зависимости от значения параметра choice возвращает одну из трех функций — sum, subtract и multiply. Затем мы мы можем получить результат функции select_operation в переменную operation:
operation = select_operation(1)
Так, в данном случае в функцию select_operation передается число 1, соответственно она будет возвращать функцию sum. Поэтому переменная operation фактически будет указывать на функцию sum, которая выполняет сложение двух чисел:
print(operation(10, 6)) # 16 - фактически равно sum(10, 6)
Аналогичным образом можно получить и выполнить другие функции.
Как из функции класса взять значение переменной
Как взять значение переменной из другой функции которая уже выполнилась
:help:Привет, объясните пожалуйста как взять значение переменной из другой функции которая уже.
Как из таблицы БД sql взять значение из столбца и присвоить значение переменной в int
Мне нужно взять из таблицы БД sql взять значение из столбца и присвоить значение переменной в.
Как из формы взять значение для переменной
Вот у меня на сайте присутствуют формы(поля) для ввода логина , имеила , пароля.Каким образом можно.
Как взять значение переменной String из текстового файла?
как взять значение переменной String из текстового файла?
![]()
35345 / 19945 / 4179
Регистрация: 12.02.2012
Сообщений: 33,093
Записей в блоге: 13
А можно встречный вопрос. Даже два. Что делает функция clique? и Зачем может понадобиться значение локальной переменной?
Регистрация: 29.01.2020
Сообщений: 41
привел такую функцию просто для примера, в коде у меня будет все абсолютно другое. Нужно просто знать, как вытащить переменную из этой функции, в другую функцию кода, находящуюся вне класса Lesson]
![]()
![]()
35345 / 19945 / 4179
Регистрация: 12.02.2012
Сообщений: 33,093
Записей в блоге: 13
Сообщение от NikitaLav 
Нужно просто знать, как вытащить переменную из этой функции, в другую функцию кода, находящуюся вне класса Lesson
— если грубо — то никак. Потому, что этот подход (по-моему) не может быть правильным. Он противоречит принципам ООП. Кстати, речь о классе или экземпляре класса (объекте)?
3540 / 2144 / 566
Регистрация: 02.09.2015
Сообщений: 5,435
Полагаю ТС хочет нечто такое:
1 2 3 4 5 6 7 8 9 10
In [1]: class Lesson: . @staticmethod . def clique(): . Lesson.var = 1 . In [2]: Lesson.clique() In [3]: print(Lesson.var) 1
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
Сообщение от NikitaLav 
Нужно просто знать, как вытащить переменную из этой функции, в другую функцию кода, находящуюся вне класса Lesson]
Зачем Вам это знать? Обычным способом никак, так как это локальная переменная, которая создается когда вызывается этот метод. Причем для его вызова нужно сначала создать экземпляр класса. И при завершении работы метода локальная переменная уничтожается.
Однако в питоне существует способ сохранить значение локальной переменной функции после ее закрытия. Это делается с помощью фабричных функций. Если Вам это очень нужно, читайте про фабричные функции. Другие способы сохранения значения локальной переменной, это объявить ее глобальной или использовать изменяемые объекты.
Сообщение от Arsegg 
Lesson.var = 1
Так тоже можно сохранить значение, но это уже не локальная переменная, про которую спрашивает NikitaLav, а атрибут. Хотя и те способы, которые предложил я. это не просто обращение к локальной переменной, а специальные средства.
Добавлено через 11 минут
NikitaLav, Как правильно заметил Catstail, то что Вы спрашиваете противоречит технологии ООП. Если Вы внутри метода хотите создать переменную, значение которой можно было бы прочитать из другого места, то нужно создавать внутри метода не локальную переменную, а атрибут экземпляра класса или атрибут класса, как сделал Arsegg.
Как из функции Python вытащить переменную?
Есть функция из которой нужно вытащить одну переменную. return нельзя использовать так как используется threading который не возвращает то что возвращает функция. Нужно получить переменную data из функции read_sok как глобальную чтоб к ней можно было обратиться.
def messageShow(message, alias): def read_sok(): while 1: data = sor.recv(1024) data = data.decode("utf-8") data_list = data.split() if data_list[1] != alias: print(data) time.sleep(1) server = '192.168.1.11', 9090 # Данные сервера # Вводим наш псевдоним sor = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sor.bind(('', 0)) # Задаем сокет как клиент sor.sendto((alias + ' Connect to server').encode('utf-8'), server) # Уведомляем сервер о подключении potok = threading.Thread(target=read_sok) potok.start() while 1: sor.sendto(('[' + alias + '] ' + message).encode('utf-8'), server) break
- Вопрос задан более трёх лет назад
- 2997 просмотров
Значение переменной из функции в фунцию
Не могу понять, почему значение переменной присвоенной в одной функции не передаётся в другую, хотя почитал уже про это и вроде все возможные причины устранил.
Есть основная процедура, в которой выводится окно, к примеру, две кнопки «Выбрать путь» и «Обновить». Если сразу нажимаю «Обновить», то путь берется из переменной folder_from, если нажимаю «Выбрать путь», то открывается окно, в котором пользователь сам выбирает путь и он заносится в переменную mfolder_from. Так вот, при нажатии кнопки «Выбрать путь», переменной mfolder_from присваивается верное значение, это видно в окне вызванным методом messagebox. А вот затем, если мы нажимаем кнопку «Обновить», то переменная mfolder_from оказывается пустой. Почему?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
import tkinter.messagebox as mb from tkinter import * import tkinter as tk import tkinter.filedialog as fd def main(): wnd = Tk() # создаем кнопку "Выбор пути для MF_6" but_Path_MF6 = Button(wnd, text="../", width=2, height=1) but_Path_MF6.bind("", clck_Path6) but_Path_MF6.grid(column=0, row=0) #создаем кнопку "Обновить" but_Upd = Button(wnd, text = "Обновить", width=15, height=1) but_Upd.bind("", clck_Upd6) but_Upd.grid(column=1, row=0) wnd.mainloop() # Процедура нажатия кнопки выбора пути для обновления MF 6 def clck_Path6(event): mfolder_from = fd.askdirectory(title="Открыть папку", initialdir = " / ") mb.showwarning("Выбран путь с обновлением", mfolder_from) # Процедура нажатия кнопки обновление MF 6 def clck_Upd6(event): # Если путь с обновлением не выбран вручную, то обновление берём из пути по умолчанию if not mfolder_from: mb.showwarning("Выбран путь с обновлением", folder_from) else: mb.showwarning("Выбран путь с обновлением", mfolder_from) global folder_from global mfolder_from folder_from = 'path' mfolder_from = '' if __name__ == '__main__': main()
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

И снова глобальная переменная в js. Как изменить значение глобальной переменной в одной функции и увидеть это значение в другой функции?
Это учебное задание. Помогите, пожалуйста, разобраться почему func1 видит какую-то новую переменную.
Вычислить значение функции (значение переменной Х передается в качестве параметра функции)
Написать функцию, которая возвращает вычисленное значение функции. Значение переменной Х передается.

Вывести на экран значение функции в зависимости от переменной. И найти максимальное значение
Переменная x изменяется в интервале от – 5 до 20 с шагом 1. Вывести на экран значение функции в.
Вывести на экран значение функции в зависимости от переменной. И найти максимальное значение
Выполнить задание используя условный оператор и оператор цикла. Переменная x изменяется в.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
VKont, Для начала. Зачем вы два раза импортируете tkinter? Это бессмысленно.
from tkinter import * import tkinter as tk
Выберете тот синтаксис, который Вам больше нравится и используйте только его. Тем более, что
import tkinter as tk
у Вас никак не используется. Поэтому эта строка является мусором.
Теперь по поводу переменных. Вы просто не понимаете как работает global. И не понимаете, что такое области видимости и пространства имен. А так же не понимаете, что такое локальные и глобальные переменные.
global folder_from global mfolder_from
бессмысленная запись. Объявлять в глобальной области переменные глобальными бессмысленно, так как они там и так являются глобальными.
Нет, не буду я Вам пересказывать из учебника раздел про локальные и глобальные переменные. Читайте теорию.
Единственное, что еще скажу, это то, что инициируемая инструкцией присваивания переменная mfolder_from в функции clck_Path6 является локальной переменной этой функции и ее видно только внутри этой функции. Из другой функции к ней обратится у Вас нельзя.
А глобальная переменная mfolder_from из глобальной области у Вас не меняется, так как изнутри функций ее можно только читать, а писать Вы в нее изнутри ничего не можете если не объявили эту переменную глобальной внутри функции (а не в глобальной области, где она и так глобальная).
Добавлено через 8 минут
VKont, А вообще то, что бы не путаться с глобальными переменными, лучше создать класс и взамен глобальных переменных использовать атрибуты этого класса. Они будут доступны и для чтения и для записи из любого места программы.
Регистрация: 07.10.2016
Сообщений: 155
Сообщение от Viktorrus 
бессмысленная запись. Объявлять в глобальной области переменные глобальными бессмысленно, так как они там и так являются глобальными.
Нет, не буду я Вам пересказывать из учебника раздел про локальные и глобальные переменные. Читайте теорию.
Единственное, что еще скажу, это то, что инициируемая инструкцией присваивания переменная mfolder_from в функции clck_Path6 является локальной переменной этой функции и ее видно только внутри этой функции. Из другой функции к ней обратится у Вас нельзя.
Вот меня это и интересовало, я намеренно написал объявление переменной как глобальной, чтоб хоть немного разъяснили. Так получается, не отвечая и не пересказывая учебников Вы уже мне ответили, теперь же понятно, как в Python это устроено. Спасибо.
Дело в том, что я с другого ЯП пришёл в Python, ну нет у меня времени штудировать учебники, всё на скорую руку, порой проще знающему человеку сказать пару слов что и как, нежели читать талмуты бестолково написанной информации.
Ну, а всё же, как мне передавать значение переменной из функции в функцию, можно в двух словах? Я чел понимающий.
Добавлено через 2 минуты
Сообщение от Viktorrus 
А вообще то, что бы не путаться с глобальными переменными, лучше создать класс и взамен глобальных переменных использовать атрибуты этого класса. Они будут доступны и для чтения и для записи из любого места программы.
Т. е. в Python всё объявляется по правильному через классы и переменные и гуи, чтобы к ним в дальнейшем обращаться из всех частей одной программы?
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
VKont, Можно через глобальные переменные. Но что бы в функции можно было писать в переменными из глобальной области, нужно сразу после шапки функции указать глобальные переменные для этой функции. Тогда в функции не будет создаваться локальная переменная, а будет идти запись в глобальную переменную.
Причем одна тонкость, если Вы в глобальной области даже не инициализируете эту переменную, то она тогда будет инициализироваться изнутри функции, и помещаться в глобальное пространство имен. И к ней можно будет обращаться для чтения непосредственно из другой функции. Но лучше так не делать, так как Вы потом, через некоторое время, читая код запутаетесь что откуда берется. Да и другие не смогут разобраться с Вашим кодом.
Поэтому, если Вы хотите использовать глобальные переменные, то нужно их все инициализировать в начале кода, и работать с ними на запись, если нужно, из функций, объявляя их в функциях , откуда будет производится запись, глобальными.
А если владеете ООП, то что бы избежать возможных ошибок, работая с глобальными переменными, вместо них использовать атрибуты класса, специально созданного для использование его атрибутов вместо глобальных переменных.
Кликните здесь для просмотра всего текста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
class GV(): # класс "Глобальная переменная" (Global Variable) def __init__(self, v): self.v = v # value значение глобальной переменной self.uses_func = ["func", . ] # uses the function список функций, использующих переменную, # не влияет на работу программы, но помогает выявлять при отладке ошибки, # которые могут возникать при использовании глобальных переменных. # Создаем необходимое количество экземпляров персональных глобальных переменных. k1 = GV(3) k2 = GV(7) k3 = GV(0) k3.v = k1.v + k2.v print(k3.v) # 10 # Если для одной и той же функции необходимо несколько глобальных переменных, # количество которых заранее не известно, # то экземпляры класса и имена переменных с добавлением порядкового номера, # создаются динамически внутри соответствующей функци. # Или когда нужно сохранять много значений, глобальную переменную делать списком и добавлять туда результаты работы функции. last_move_OF_func = GV([]) last_move_OF_func.uses_func = ['func'] print(last_move_OF_func.v) # [] def func(n): for i in range(n): last_move_OF_func.v.append(i**2) func(6) print(last_move_OF_func.v) # [0, 1, 4, 9, 16, 25] print(last_move_OF_func.uses_func)
Добавлено через 10 минут
Сообщение от VKont 
Т. е. в Python всё объявляется по правильному через классы и переменные и гуи
И через функции. Некоторые считают, что чтобы не путаться , то нужно использовать только функции.
Моя позиция, что для простеньких программ можно использовать глобальные переменные, инициируя их все в начале кода и используя в функциях global и nonlocal, а в более крупных программах использовать класс для глобальных переменных.
Для меня способ с помощью ООП более простой и наглядный, чем использование только функций.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
VKont, Я на днях, перечитывая Лутца, снова натолкнулся на разбор технологий используемых в питоне.
Наследование.
Полиморфизм.
Инкапсуляция.
Если первые два понятия я знал, то с использованием в питоне инкапсуляции решил разобраться.
Инкапсуляция и глобальные переменные.
Кликните здесь для просмотра всего текста
Из Википедии.
«Инкапсуляция (англ. encapsulation, от лат. in capsula) — в информатике размещение в одном компоненте данных и методов, которые с ними работают. В реализации большинства языков программирования (C++, C#, Java и другие), обеспечивает механизм сокрытия, позволяющий разграничивать доступ к различным компонентам программы.
Инкапсуляция зачастую рассматривается как понятие, присущее исключительно объектно-ориентированному программированию (ООП), но в действительности обширно встречается и в других (см. подтипизация на записях и полиморфизм записей и вариантов). В ООП инкапсуляция тесно связана с принципом абстракции данных (не путать с абстрактными типами данных, реализации которых предоставляют возможность инкапсуляции, но имеют иную природу). Это, в частности, влечёт за собой различия в терминологии в разных источниках. В сообществе C++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную. Однако, некоторые языки (например, Smalltalk, Python) реализуют инкапсуляцию, но не предусматривают возможности сокрытия в принципе. Другие (Standard ML, OCaml) жёстко разделяют эти понятия как ортогональные и предоставляют их в семантически различном виде (см. сокрытие в языке модулей ML).»
Те, кто так активно выступают против использования глобальных переменных в Питоне, видимо пришли из С++.
Однако у Питона более гибкий подход к инкапсуляции. С помощью классов переменные могут быть инкапсулированы в пространстве имен класса, но к ним есть доступ (хотя при желании этот доступ можно и закрыть).
Глобальные переменные имеют две негативные особенности.
1) В крупных проектах могут возникать конфликты между глобальными переменными с одинаковыми именами.
2) Может нарушаться алгоритм работы программы, когда не понятно из какого места программы вносятся изменения в глобальную переменную.
Первая проблема снимается, если просто вместо глобальных переменных использовать экземпляры класса с атрибутом v, в который записывать значение переменной, тем самым осуществляя инкапсуляцию. Когда переменные в виде атрибутов экземпляров принадлежат разным экземплярам класса, то конфликтов возникать не может.
Со второй проблемой можно справиться, если такому экземпляру класса, кроме атрибута v добавить еще атрибут is_used, значением которого является список. И в этот список записывать в виде строки модуль и функцию, из которой осуществляется запись в атрибут v, данного экземпляра класса. Понимая из каких мест идет изменение значения v данного экземпляра класса, будет легко выяснить причину возникновения ошибки.
Пример, демонстрирующий использование данной технологии.
Кликните здесь для просмотра всего текста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
class GV(): # класс "Глобальная переменная" (Global Variable) def __init__(self, v): self.v = v # value значение глобальной переменной self.is_used = [] # ["func", . ] is_used список функций, использующих переменную, # не влияет на работу программы, но помогает выявлять при отладке ошибки, # которые могут возникать при использовании глобальных переменных. # Создаем необходимое количество экземпляров персональных глобальных переменных. k1 = GV(3) k2 = GV(7) k3 = GV(0) k3.v = k1.v + k2.v if not ('__main__' in k3.is_used): k3.is_used.append('__main__') print(k3.v) # 10 # Если для одной и той же функции необходимо несколько глобальных переменных, # количество которых заранее не известно, # то экземпляры класса и имена переменных с добавлением порядкового номера, # создаются динамически внутри соответствующей функци. # Если для функции создается только одна персональная глобальная переменная, # то можно не использовать класс. # Или когда нужно сохранять много значений, глобальную переменную делать списком и добавлять туда результаты работы функции. last_move_OF_func = GV([]) print(last_move_OF_func.v) # [] def func(n): for i in range(n): last_move_OF_func.v.append(i**2) if not ('__main__.func' in last_move_OF_func.is_used): # сохранение точки изменения last_move_OF_func.is_used.append('__main__.func') # переменной last_move_OF_func k3.v += k3.v * n if not ('__main__.func' in k3.is_used): # сохранение точки изменения k3.is_used.append('__main__.func') # переменной k3 func(6) print(last_move_OF_func.v) # [0, 1, 4, 9, 16, 25] print(last_move_OF_func.is_used) # ['__main__.func'] print(k3.is_used) # ['__main__', '__main__.func']
