|
0 / 0 / 0
Регистрация: 22.07.2021
Сообщений: 2
|
||||||||||||||||
Передача переменных в функцию и области видимости22.07.2021, 02:46. Показов 6462. Ответов 16
Метки нет (Все метки)
Всем доброго времени суток.
Знаний в языке программирования не много, поэтому прошу не судить строго. Вопрос возможно для кого-то простой, но найти решения я пока не смог. Опишу на простом примере. Есть основной файл с циклом, в котором вызываются и выполняются функции (my1.py). Есть список, по которому мы идем в цикле (my2.py). Каждая функция написана в отдельном файле, для удобства (в данном примере все три функции в одном файле my3.py). Когда код написан в одном файле, все работает, когда разбил отдельно функции по файлам, возникла проблема. Так вот, нужно чтоб текущую переменную цикла из списка я мог каким-то образом передать в тело функции, например, в func3. Как решить эту проблему никак не пойму, решил обратиться за помощью.. my1.py
func1 func2 a func1 func2 b func1 func2 c
0
|
||||||||||||||||
| 22.07.2021, 02:46 | |
|
Ответы с готовыми решениями:
16
Области видимости переменных, C# Области видимости переменных Области видимости переменных |
|
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
|
|||||||||||
| 22.07.2021, 06:39 | |||||||||||
Сообщение было отмечено Welemir1 как решение
Решение
2
|
|||||||||||
|
0 / 0 / 0
Регистрация: 22.07.2021
Сообщений: 2
|
|
| 22.07.2021, 08:46 [ТС] | |
|
u235, Да, действительно просто, спасибо!
Немного не хватило мне понимания передать в эту функцию переменную def func3(symb): , везде ее пытался объявить. В основном коде вроде тоже все заработало.
0
|
|
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 22.07.2021, 09:24 | |
|
-T0MMY-, не забывайте про локальные области видимости функции.
0
|
|
| 23.07.2021, 19:55 | |||||||||||||||||||||
|
-T0MMY-, А вот пример, как с помощью ООП можно с помощью коммутатора из любого модуля передавать значения в переменную любого другого модуля принадлежащего заданной композиции модулей, связанных в единое целое.
commutator.py Основной запускаемый файл. Кликните здесь для просмотра всего текста
my1.py Кликните здесь для просмотра всего текста
my2.py Кликните здесь для просмотра всего текста
my3.py Кликните здесь для просмотра всего текста
Все четыре файла должны находится в одном каталоге. Алгоритм такой: Загружается коммутатор, связывающий все модули. Из главного сценария с коммутатором запускается основная функция main из модуля my1.py . Эта функция в цикле запускает функции из модуля my3.py. Функции из модуля my3.py заполняют три списка в модуле my2.py . Затем функция main из модуля my1.py распечатывает списки сформированные в модуле my2.py Добавлено через 17 минут -T0MMY-, Если Вы ООП еще не изучали, то может пригодится в будущем.
1
|
|||||||||||||||||||||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 23.07.2021, 20:51 | |
|
Viktorrus, ознакомился с вашей идеей с сетевой структурой модулей, очень интересно. Подробная документация по использованию была бы кстати. У меня, например, проблема была другого характера, импорта модулей из каталога выше и их взаимосвязь. Если бы ваша технология решала и эту проблему было бы очень круто, я бы попробовал прикрутить и к своему проекту что нибудь. Ну или реализовать примеры на PyQt или PySide.
0
|
|
| 24.07.2021, 01:57 | ||
|
А вот если модули с данными, и они размещены кем то в разных каталогах, то импортировать модули из других каталогов уже придется. Я про импорт из других каталогов читал в 4-ом издании Лутца. А в 5-ом издании эту тему пропустил. Вам нужно почитать про пакеты при импорте модулей. Пакетом Лутц называет путь к импортируемому модулю. "Основы импортирования пакетов. На элементарном уровне операции импортирования пакетов прямолинейны — там, где в операторах import находилось имя простого файла, взамен можно указать путь с именами, разделенными точками: import dirl.dir2.mod " Смотрите Лутц М. Изучаем Python (том 1, 5-е издание, 2019) Глава 24 "Пакеты модулей" Раздел Основы импортирования пакетов стр. 721-755. (материал сложный). AlexMarkov, Что касается создания сети связанных модулей, то я завтра на примере выше поясню как связать модули в сеть и как такая сеть работает. Добавлено через 17 минут AlexMarkov, Если Вы обеспечите импорт модулей из других каталогов, то сетевая структура модулей я думаю и в этом случае будет работать.
0
|
||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 24.07.2021, 05:37 | |
|
Viktorrus, импорт из других каталогов уже обеспечен, при прочтении глав о которых вы говорите все и было сделано, правда я не знаю насколько правильно, да и на первом этапе все объекты из простенькой бд в пространстве имён модулей, пока все работает мне этого достаточно, правда приходиться немного подождать при первом запуске модулей пока интерпретатор в оперативу все записывает, а потом норм до выключения или перезагрузки системы, на рабочем компе самое то, он больше ни для чего и не нужен, кроме екселей с вордами, да там и нет ничего больше. Бд типа sql, думаю на PostgreSql, MySql или SqlLite, буду потом прикручивать, если будут данные для обновления бд. Жду ваших решений с сетями связанных модулей ну и примеры, естественно, без примеров сложно понять применимы эти принципы на практике или нет, ну и простенькое README, документирование кода или самодокументирующийся код не помешают.
0
|
|
| 24.07.2021, 10:32 | ||||||
|
AlexMarkov, Питон для меня хобби, и коммерческими продуктами я не занимаюсь. Поэтому ни когда не пользовался средствами для создания документации. Но свои продукты, которые пишу для себя, я тщательно документирую, что бы использовать их в будущем.
У меня есть шаблоны, для создания журналов записей, там все подробно комментировано. Первый шаблон я создавал первоначально используя сеть модулей. Это более крупный пример, он состоит из 5-ти файлов. Я про него расскажу позже, после объяснения примера выше, в этом топике. Второй шаблон, это тот же журнал записей, который я сделал, засунув все модули из первого шаблона в один файл. Хотя там нет сети модулей, но использована та же логика и те же обозначения, как в первом шаблоне. Но он Вам в данном случае будет не интересен. Итак, в следующем комментарии я расскажу о примере выше в этом топике. Код размещен выше, смотрите его, когда я буду объяснять. Добавлено через 1 час 20 минут AlexMarkov, "Сеть модулей", или как я еще это называю "агрегированный модуль" состоит из нескольких файлов, которые жестко связаны друг с другом, и с ними можно работать только как с единым целым, состоящим из нескольких частей, каждая из которых находится в отдельном файле. Для чего это сделано. Кликните здесь для просмотра всего текста
Каждый файл, это не большой код, который проще проектировать и с ним разбираться, чем когда все свалено в одну кучу в один файл. Но если использовать традиционные цепочки модулей, то там сложно передавать данные между модулями, когда модулей много. Обычно в них передачу данных между модулями осуществляют с помощью функций.
Использование ООП позволяет общаться (передавать данные) между модулями напрямую и достаточно просто. Создается следующая структура модулей: Основной модуль "сети модулей" (агрегатора) импортирует на себя все остальные модули (у которых отсутствует импорт других модулей). Мы грубо говоря имеем как бы аналог компьютерной сети, в которой есть сервер и связанные с ним рабочие станции. Итак сеть модулей имеет структуру звезды, где есть центральный (главный) модуль и все остальные, связанные с ним модули. Рассмотрим, как это реализовано в нашем примере. Сеть модулей в этом примере состоит из: 1) commutator.py - главный модуль (в сети модулей) и дополнительные модули, которые импортирует главный модуль 2) my1 3) my2 4) my3 Теперь еще немного теории, как создается связь модулей. Кликните здесь для просмотра всего текста
Все основано на способность экземпляров класса создавать свои изолированные пространства имен из атрибутов этого экземпляра класса.
И что примечательно. Если в некотором месте большой программы, включая разные модули, нам доступен указанный экземпляр класса, то становятся и доступны (в том числе для записи) все его атрибуты из пространства имен этого экземпляра класса. Код главного модуля commutator.py, идущий после импорта вспомогательных модулей, помещается внутрь класса. В данном случае это класс Prog_Tools Когда мы в дальнейшем создадим экземпляр этого класса, то он создаст свое собственное пространство имен из своих атрибутов. А дальше встает вопрос. Как получить доступ к этому экземпляру, а значит и к его пространству имен? Я придумал сделать это так: Передавать в модули экземпляр создаваемого класса в переменную, которую я называю так же, как и название экземпляра класса. А именно t1. Делается это вот как: В каждом из вспомогательный модулей инициализируем переменную t1 = None. Когда создается экземпляр t1 класса Prog_Tools , при инициализации созданный экземпляр передается во все модули в переменные t1 . Кликните здесь для просмотра всего текста
Теперь посмотрите коды в модулях, и какие строчки не понятны, то спрашивайте, что бы мне не рассказывать о каждой строке в коде модулей. Добавлено через 19 минут AlexMarkov, Когда разберетесь с данным в этой теме примером, то посмотрите более крупный пример. Это шаблон "Журнала записей" созданный в виде сети модулей из 4-х файлов, и пятого файла сценария, импортирующего этот агрегированный модуль. Я его выложил в конце темы Написать программу автосервис Цитата от туда: "Схема такая: 1. файл сценария journalRecordsPattern.py импортирует модуль program_Tools.py , который является главной частью (базовым модулем-частью) агрегированного модуля состоящего из следующих частей: 2. program_Tools.py - главная часть агрегированного модуля, 3. input_Data.py - модуль входных данных (часть агрегированного модуля), 4. output_Data.py - модуль выходных данных (часть агрегированного модуля), 5. journal.py - модуль журнала (часть агрегированного модуля), который является основной содержательной частью проекта (цифровой моделью реального журнала записей)." Добавлено через 18 минут AlexMarkov, Я использую короткие имена в цепочке пути при обращении к нужной переменной в другом модуле, мне так удобнее. А то при развернутых именах цепочки пути получатся длинными. Но вы можете использовать и полные имена в цепочке пути. Может Вам так будет удобнее. Это кому как больше нравится. Недостаток коротких имен, это помнить, что они обозначают. Но я продумал мини язык для создания таких имен, и постоянно пользуясь этой технологией, у меня нет проблем помнить, что обозначает каждая короткая переменная. ![]() Правило создания коротких имен описано в шаблоне "Журнала записей" в файле program_Tools.py , который выложен в теме, ссылку на которую я дал.
2
|
||||||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
||||
| 24.07.2021, 16:37 | ||||
|
Также интересен момент добавления модуля в данный пример, если дополнительный код будет выделен, например, красным было бы понятнее. Дополнительный код - еще один модуль m4 с дополнительной внутренней логикой, т.е. как нам включать допом модули для работы с ними? Добавлено через 3 минуты
0
|
||||
| 24.07.2021, 20:00 | |||
![]()
1
|
|||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
|
| 25.07.2021, 06:41 | |
|
Viktorrus, все очень круто и шустро работает. Думаю использовать вашу идею в следующей версии для редактирования базы данных, для пользователя-программера-разработчика будет самое то для понимания дальнейших целей в выполнении поставленной задачи. Я так понимаю с GUI на tkinter все также хорошо работает? Очень сложно разбираться в чужом коде, поэтому в дальнейшем попробую самостоятельно поработать со своей базой данных, ну и рассмотреть возможность встроенной GUI на Qt. Если будут вопросы, где лучше их задавать, здесь, в блоге или в отдельной теме? В общем, идея зачет, спасибо.
0
|
|
| 25.07.2021, 11:56 | |||||||
|
Кликните здесь для просмотра всего текста
Проект состоит из 3-х файлов, основного сценария и двух модулей с GUI. У меня возникла проблема с синхронизацией модулей содержащих GUI. И я придумал, как решить эту проблему, поместив код в файле сценария в класс Prog_Tools, через который появилась возможность синхронизировать работу модулей с GUI. Я с любого из этих модулей смог давать команды для другого модуля, для их синхронизации. Но идея создания коммутатора, для объединения любого количества модулей в сеть, это появилось уже позже. Но именно в том проекте эта идея позволила решить проблему, которую по другому я не смог решить. Это не значит, что других решений не может существовать, но мое решение помогло мне справится с проблемой. Для меня использование ООП является наиболее органичным, так как моделирует мой мыслительный процесс. Но графика очень сильно увеличивает объем кода, поэтому он большой. Но программа работающая и включает разные возможности, включая поиск. Так как первоначально я создавал электронную телефонную книжку, то предусмотрена возможность группировки записей по начальной букве. Но эта возможность полезна и для любого журнала записей.
Могу привести код (для трех файлов, размещаемых в одном каталоге ) этого проекта. Это все тот же шаблон журнала записей, но с использованием GUI. journalEntriesTemplate1.py - основной файл сценария. Его нужно запускать. Может иметь любое название, соответствующее тематике журнала записей. Кликните здесь для просмотра всего текста
В один комментарий все не влазит, поэтому разобью комментарий на части.
1
|
|||||||
| 25.07.2021, 12:00 | |||||||||||
|
journal.py - модуль с GUI общего вида журнала. Название фиксированное.
Кликните здесь для просмотра всего текста
Добавлено через 1 минуту record.py - модуль с GUI выводит форму для одной записи, имеющую дополнительными поля в записи. Название фиксированное. Кликните здесь для просмотра всего текста
1
|
|||||||||||
| 25.07.2021, 17:55 | ||
|
AlexMarkov, Поправка. В этом пректе класс в основном сценарии называется Progr, а не Prog_Tools, как я стал называть аналогичные классы позже.
Добавлено через 19 минут AlexMarkov, Кстати этот проект с GUI наиболее тщательно за комментирован. Но там есть тонкие моменты, приходилось придумывать свои решения. К ним относятся и создание графической таблицы и работы с ней (создание системы координат каждой ячейки, а так же создание возможности листать страницы, правда только вниз, когда записей больше 24-х размещаемых на одной странице). И другие решения с графикой, связанные с работой с окнами и с сохранением записей в базе данных на основе модуля shelve. Поэтому, что будет не понятно, спрашивайте. Добавлено через 10 минут Если бы это был коммерческий проект, я бы был вынужден написать инструкцию к работе с программой. А так я не стал заморачиватся. Что будет не понятно в работе программы, объясню. Я реально использую эту программу в качестве электронного телефонного справочника. И другой вариант, использую для электронного каталога всех моих документов. Работа программы вполне меня устраивает. Правда я так и не собрался реализовать автоматическое сохранение архивов базы данных. Но меня устраивает и простое копирование каталога с файлами программы вручную в архивную папку. ![]() Добавлено через 4 часа 57 минут AlexMarkov, Предупреждение. Если Вы все-таки будете разбираться с кодом проекта, содержащим графику (в чем я не уверен, так как код достаточно объемный ), то имейте ввиду, что писал я его давно и там использовал прием, который сейчас не стал бы применять. Это скрытые глобальные переменные. Когда переменные инициализируются внутри одной функции и объявляются в ней глобальными, и потом идет работа с ними из другой функции. При этом в начале модуля, где должны определятся глобальные переменные, их нет. Такой код труден для понимания. Сейчас я бы сделал по другому. Создал бы класс Data и в нем соответствующие атрибуты экземпляра класса. И заменил бы глобальные переменные этими атрибутами. Так код проще и для проектирования и для последующего чтения. И снимаются все проблемы с глобальными переменными. Но так как код нормально работает, то мне не хочется туда лезть и его менять.Но если что будет не понятно, обращайтесь, я объясню. Кстати в этом примере я разобравшись у Лутца использовал прием автоматического сохранения записей из текущего листа в окне журнала, когда окно закрывается крестом в верхнем правом углу графического окна. Вообще, при уходе с текущего листа всегда происходит автоматическое сохранение информации с этого листа. Я так сделал, из-за того, что память у меня иногда уже подводит, поэтому боюсь потерять занесенную информацию .Добавлено через 19 минут А вопросы по моим проектам, которые я здесь выложил, задавайте здесь.
1
|
||
|
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
|
||||
| 25.07.2021, 19:31 | ||||
|
0
|
||||
| 25.07.2021, 19:44 | ||
|
0
|
||
| 25.07.2021, 19:44 | |
|
Помогаю со студенческими работами здесь
17
Области видимости переменных + функции Области видимости переменных точечного запроса Области видимости переменных, типов, констант
Области видимости и передача массива из метода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по
1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|