|
0 / 0 / 0
Регистрация: 05.12.2019
Сообщений: 43
|
||||||
Передача переменных между функциями12.10.2020, 21:24. Показов 36724. Ответов 23
Метки нет (Все метки)
Доброго времени суток.
Столкнулся с проблемой, что выводит ошибку "name 's' is not defined" Можете подсказать как передать переменную? И если вместо этой переменной будет список, ее передавать так же как и обычную переменную? Вот код:
0
|
||||||
| 12.10.2020, 21:24 | |
|
Ответы с готовыми решениями:
23
|
|
Супер-модератор
|
||||||
| 12.10.2020, 21:29 | ||||||
Сообщение было отмечено Jeyzihno как решение
Решение
2
|
||||||
| 12.10.2020, 22:58 | |||||||||||
|
Jeyzihno, В простых задачах как у Вас и тем более если переменная, полученная внутри функции, вне функции используется только один раз, то Catstail, показал Вам как получить эту переменную в другой функции, с помощью вызова первой функции внутри второй используя return. Но у такого решения недостаток в том, что если эту переменную Вам нужно будет использовать в разных местах программы, и особенно если в тоже время функция рассчитывающая эту переменную требует ощутимые затраты времени, Вы будете значительно замедлять работу Вашей программы. И еще один недостаток такого подхода, снижается читабельность такого кода. Встречая в функции вместо переменной функцию, Вы вынуждены лезть в другую функцию, что бы понять, что она возвращает.
Я предпочитаю использовать глобальные переменные. Хотя некоторые на этом форуме, и в том числе вообще в интернете среди программистов настаивают на том, что глобальные переменные использовать не нужно. Я с этим в корне не согласен. Просто нужно хорошо понимать, что такое глобальные переменные, и как с ними работать. А так же разбираться в области видимости и в пространствах имен. Плюс понимать разницу в импортировании модулей двумя способами, с помощью import ... и с помощью from ... import ... , понимая, как в этих случаях формируются пространства имен. Поэтому Лутц, пока Вы не опытны и не научились работать с глобальными переменными, советует по возможности их избегать. А вообще вот как будет выглядеть код для Вашей задачи при использовании глобальных переменных.
Поэтому мой совет. Изучая питон, постепенно осваивайте технологию использования глобальных переменных, с учетом рекомендаций, которые я описал выше. Все, что я написал относится к неизменяемым объектам (не путайте с переменными, так как переменные содержат ссылки на объекты). Если же переменная содержит ссылку на изменяемый объект, то эта переменная размещается в глобальной области (или в начале кода или перед функцией, где будет производится работа с изменяемым объектом. И в этом случае она внутри функции не объявляется глобальной. Однако все, что Вы будете с делать с объектом (изменяя его), будет автоматически отражаться во всех переменных, которые ссылаются на этот изменяемый объект. Поясню. Когда объект , на который ссылается переменная, является неизменяемым, то внутри функции такая переменная автоматически становится локальной (если не объявлена глобальной). Когда же объект, на который ссылается переменная, объявленная в начале кода или перед функцией, является изменяемым (например список) то эти изменения отражаются во всех местах, где переменные ссылаются на этот объект. Так как в этом случае внутри функций не создается локальной переменной. Добавлено через 22 минуты Jeyzihno, Кстати инициализацию переменной, которую Вы в функции объявляете глобальной, можно делать и внутри функуции, как в этом примере.
3
|
|||||||||||
|
Просто Лис
|
|||||||
| 13.10.2020, 05:52 | |||||||
3
|
|||||||
|
Супер-модератор
|
|
| 13.10.2020, 07:37 | |
|
Jeyzihno, добрый совет: старайтесь использовать глобальные переменные только в случае крайней необходимости (напр. для хранения общих конфигурационных настроек). А перебрасывать переменные из функции в функцию в обход стандартных механизмов - плохая практика. Впрочем, выбор за вами.
1
|
|
| 13.10.2020, 12:54 | |||||||||||
|
Рыжий Лис, Но Вы тоже используете глобальную переменную s инициируя ее инструкцией
Так что нет никакой разницы с использованием глобальной переменной s в моем примере, где я ее инициализирую в начале кода. Разница только в том, как результат расчета в функции qwe() передается глобальной переменной. Но способ передачи значения в глобальную переменную никак не влияет на возможность возникновения конфликта имен. Конфликт имен можно гарантированно избежать только или вообще не используя глобальные переменные, в любом их виде или используя для глобальных переменных квалифицированные имена. Квалифицированные имена можно получить при импортировании модуля с глобальными переменными используя только синтаксис import ... , если же использовать синтаксис from ... import ... , то всегда возникает опасность возникновения конфликта имен (так как в этом случае происходит объединение пространства имен модуля с пространством имен импортирующего модуля). Что бы исключить конфликт имен внутри одного файла, когда разные по смыслу объекты имеют одинаковые названия переменных, которые содержат ссылки на эти объекты, то в таком случае нужно использовать класс, что бы эти объекты были значениями атрибутов разных экземпляров класса и потому принадлежали разным пространствам имен (обращение к атрибутам так же осуществляется через квалифицированные имена). Каждый экземпляр класса имеет свое пространство имен и эти пространства не пересекаются, что исключает конфликт имен переменных. Добавлено через 10 минут Что действительно нужно учитывать при использовании глобальных переменных, это то, что если они инициализируются внутри текста программы, то их можно не увидеть и может возникнуть конфликт имен. Что бы этого частично избежать, нужно инициализацию осуществлять вначале кода.
0
|
|||||||||||
|
Просто Лис
|
||||||||
| 13.10.2020, 12:58 | ||||||||
1
|
||||||||
| 13.10.2020, 14:35 | ||
|
Сомневаюсь, что бы Jeyzihno, представил эту функцию в Вашем предыдущем варианте. Оказывается Вы считаете разработчиков питона настолько тупыми, что они придумали существование глобальных переменных, которые по Вашему использовать нельзя, и Вы вместо понятной программы городите то, что нагородили из-за того, что не умеете использовать глобальные переменные. Напишите разработчикам питона, что бы они убрали глобальные переменные. Все, я Выхожу из пустой дискуссии, которая возникала здесь уже не раз и не дала ни какого вразумительного результата. Удачи.
1
|
||
|
|
||
| 14.10.2020, 11:51 | ||
))Глобальные переменные действительно использовать нельзя. Они существуют в питоне, как следствие более общего дизайна языка, их не выпилишь.
0
|
||
|
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
|
|
| 14.10.2020, 12:45 | |
|
Оба способа передачи переменных годные. Напрасно говорят те, кто считают, что глобальные переменные использовать нельзя.
0
|
|
|
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
|
|
| 14.10.2020, 13:08 | |
|
Глобальные переменные успешно используются, и вы с этим ничего поделать не сможете.
Но никто не заставляет вас их использовать )).
0
|
|
| 14.10.2020, 13:30 | |
|
КулХацкеръ, Вы правы. Я выше описал, как можно гарантированно избежать конфликта имен, когда проект достаточно большой или когда ваши модули будут использовать другие программисты, которые так же не умеют работать с глобальными переменными, как некоторые на этом форуме.
В конце концов можно создать класс для глобальных переменных данного модуля и в качестве глобальных переменных использовать экземпляры этого класса. Тем самым мы получим квалифицированные имена для этих глобальных переменных, что гарантированно исключит какие либо конфликты имен. Такую технологию можно оформить стандартно, что бы облегчить ее использование. Но это может понадобится только для крупных проектов, где бывает сложно увидеть конфликт имен. В простых проектах вы вряд ли не заметите использования одинаковых имен для разных по смыслу переменных. Поэтому не стоит серьезно воспринимать гуляющую в интернете пугалку про глобальные переменные. Это относится и к дурацкой пугалке о eval() . Нет ничего глупее утверждать, что непрофессиональный пользователь случайно введет профессиональную строку, которая нанесет вред компьютеру. Если же программист, то он может нанести вред компьютеру многими другими способами и не будет использовать ввода такой строки. Глупо верить всему тому, что выкладывают в интернете, в том числе и на профессиональных сайтах. И там попадаются глупости. Поэтому нужно следовать принципу "Доверяй но проверяй", и "Имей свою голову на плечах".
0
|
|
|
|
||
| 14.10.2020, 13:44 | ||
|
КулХацкеръ, глобальные переменные используются в учебных примерах не более чем на 100 строк. В продакшне это считается однозначным говнокодом.
Ну используйте, чо. Я уже не занимаюсь спасением заблудших душ. Не надо "избегать конфликта имён". Во-первых, конфликт имён - это вообще не проблема, чтобы уделять ему так много внимания. Во-вторых, не надо "уметь работать с глобальными переменными". Дурное дело - нехитрое. Запутать код - куда проще, чем разложить по полочкам. Вот именно те, кто не умеет в ООП и паттерны, и любят глобалки. Потому что с ними легко и просто. Отовсюду можно достучаться. Красота
0
|
||
| 14.10.2020, 14:11 | |
|
КулХацкеръ, Не обращайте внимание на тех, кто считает себя умнее Лутца. Лутц говорит только о том, что не стоит использовать глобальные переменные неопытным программистам. Но нигде не говорит что не нужно вообще использовать глобальные переменные и сам их везде использует.
Доказывая что нельзя использовать глобальные переменные, при этом писать "глобальные переменные используются в учебных примерах не более чем на 100 строк." То есть учить новичков глобальным переменным и при этом одновременно утверждать, что их вообще использовать нельзя. Смешно. ![]() Зачем же тогда учить глобальным переменным? Никто не замечает противоречия? Как тогда у таких людей обстоят дела с логикой? ![]() Добавлено через 6 минут КулХацкеръ, Поэтому советую Вам. Когда у кого то проблемы с логикой, не стоит вступать с ним в продолжительную дискуссию. Высказали свое мнение, что бы его прочитали новички, и дальше вести дискуссию с таким человеком бессмысленно.
0
|
|
|
|
|||||
| 14.10.2020, 15:00 | |||||
|
Слишком толстый троллинг, Виктор. Добавлено через 7 минут Ооо, что я нашёл Скачал Лутца. Цитата, введение к гл. 17, "Области видимости":
Вы же приравниваете его книгу к Священному Писанию? Шах и мат, Viktorrus ![]() Добавлено через 5 минут Читаю дальше. Глава 17, аж целый подзаголовок в разделе про global:
Мне интересно, Виктор, вы вообще вашего любимого Лутца читали или нет? Добавлено через 32 минуты В ООП есть такая штука - инкапсуляция. В питоне инкапсуляция не является строгой, поэтому Лутц про неё не написал, а Viktorrus, соответственно, не прочитал. Но тем не менее, какие-то дядьки её придумали. Интересно, зачем?
0
|
|||||
| 15.10.2020, 17:29 | |||||||||||
|
Jeyzihno, Как я понимаю, Вы пока не изучали ООП. Но на всякий случай даю пример, как с помощью ООП можно исключить все проблемы с глобальными переменными в проектах любой сложности и использовать глобальные переменные без каких либо ограничений. И даже в качестве бонуса глобальные переменные, кроме обычного значения, при необходимости могут содержать любое количество дополнительных атрибутов.
В примере два файла, основной file1 и модуль module1, который импортируется из основного файла. В обоих файлах глобальные переменные имеют абсолютно одинаковые имена, но являются экземплярами разных классов, поэтому любые конфликты или какие либо другие проблемы исключаются. И мы спокойно можем использовать все достоинства глобальных переменных. Основной файл file1: Кликните здесь для просмотра всего текста
Импортируемый модуль module1: Кликните здесь для просмотра всего текста
Добавлено через 9 минут На самом деле имена функций так же являются глобальными переменными и могут провоцировать конфликты. Что бы полностью нейтрализовать конфликты, можно и функции сделать методами (атрибутами) экземпляра класса. Но не буду перегружать свой комментарий, кому это понадобится, сами это сделают.
0
|
|||||||||||
| 15.02.2021, 14:59 | |
|
Не по теме: dondublon, Ведет против меня войну по всем фронтам (по всем топикам). Но меня это только забавляет. Главное только что бы он сам себе не навредил, слишком усердствуя в этой войне.:)
0
|
|
|
|
||
| 15.02.2021, 15:33 | ||
|
Не по теме: Viktorrus, я воюю? Да бог с вами. Я вас воспитываю, исключительно из человеколюбия. Добавлено через 9 минут
0
|
||
| 15.02.2021, 15:33 | |
|
Помогаю со студенческими работами здесь
20
Переход между функциями в tkinter Закрашивание области между функциями на графике
Передача переменных между функциями Передача значений переменных функциями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия микоризы: основная теория в виде двух уравнений.
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во
всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
|