Программирование Python по моим конспектам Лекция 10.1

Пост можно топить, минусить и всячески убивать, ибо в горячем он нахер не нужен, а вот подписчикам пригодится.



Для тех кто не в теме, тут я перевожу свои лекции по питону с языка немецкого на язык человеческий, поэтому- если что- я не виноват. Эти лекции созданы не для того, чтобы сделать из человека говнокодера, а для того, чтобы помочь в сложных темах, которые некому объяснить, а книга по программированию не может с этим помочь. Если вы никогда не были в такой ситуации- значит вы вундеркинд и я хочу от вас детей.



Отвечая на 90% одинаковых вопросов-



Я знаю, что это есть в каждой книге по питону. Это логично. Не логично было бы, если бы это было в книге по анатомии хомяков.



Я это делаю, потому что мне это нравится.



Список прошлых лекций



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...


http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...


http://pikabu.ru/story/programmirovanie_python_po_moim_konsp...



Ну что, дамы и господа, судя по всему, прошлое задание поставило вас  в тупик, так что я буду планку немного понижать. И вообще буду краток.

Сегодня мы продолжим говорить о функциях. Говорить о этих зверях можно почти бесконечно, но я постараюсь рассказать основное и полезное.

В прошлый раз мы закончили наше мучение на аргументах по умолчанию. А сегодня поговорим о глобальных и локальных переменных.

смотрим глазами ниже не житейскую ситуацию

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Декларирую я x, который указывает на значение 1

Вывожу его на экран

Затем вызываю функцию, где уже задекларирован еще один x, который тоже выводится на экран и указывает на 2. Но как же так то..один икс, а значения разные. Хм..может в функции x, стал указывать на новое значение?

ща проверим..

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Дописал после вызова функции еще одну строку, которая должна вывести значение х на экран. И оно, сцуко, снова показывает 1. У вас возник вопрос...но у меня уже есть ответ)

Фишка в том, что некоторые переменные "видны!" только в пределах своей функции. То есть мы не можем просто так из блока главной программы влиять на переменные внутри функции и наоборот. Тут надо немного разобраться.

Работает это так. При вызове скрипта интерпретатором, он сразу прочесывает код на поиск функций, если таковы есть, он делит скрипт на Области, которые бывают локальными и глобальными. Это звучит сложно, но сейчас я вам все покажу.

Есть в питоне две функции globals() locals() которые помогут мне вам все показать. А пока смотрим ниже.

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Выглядит страшно, но глаза боятся..а руки..тоже боятся.  функции globals() locals() кроме потока ненужной вам инфы показывают пространство, которое видно для того места откуда они вызваны. Если мы посмотрим на глобальное и локальное пространство для главной программы, то узнаем что локальная и глобальная переменная у него одна и это х=1.

А вот у функции совсем по другому. Свою родную функцию x=2 она воспринимает как локальную. А глобальную (которая вне функции) она видит как x=1

И чтоб вообще понятно стало. Вот вам картинка

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Начинаем с белого квадрата- это зона видимости нашей функции. Она видит то что внутри. Это локальное пространство. Но есть еще что то, что есть вне ее- серым залитое. Это глобальное пространство для функции (и для других функций)

А если мы посмотрим на основную программу. То локальное у нее это то, что залито серым, а глобальнее чем она сама у нее ничего и нет. Поэтому x=1 это и глобальная и локальная переменная.


Таким образом мы не можем залезть из серого в белое. См ниже

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Но можем вылезти из белого в серое.

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Происходит это потому, что функция во время запуска пытается найти переменную х у себя в в своем белом пространстве, а не найдя ее, начинает искать ее во внешнем (сером) пространстве, где благополучно и находит.

Так как у главной программы нет внешнего пространства, то  рассчитывать ей можно только на себя и искать ей негде. Поэтому и  ошибка.


Однако, не все так сладко. Хоть мы и можем прочитать глобальные переменные в функции, изменить мы их не сможем. Увы.

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост
Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

Вот. Ругается интерпритатор.

Однако, мы можем взять нашу переменную за жабры при желании и творить с ней что хотим.

Для этого мы используем команду global. Выглядит это так

Программирование Python по моим конспектам Лекция 10.1 Питон, Программирование, Языки программирования, Длиннопост

На выходе  3


global дает право изменять глобальные переменные. Используйте этот способ с умом, иначе сами запутаетесь в своих переменных. Ибо это как наркота для наркомана, и наркота для врача. Одному- рабочий инструмент, другому- верный ппц.


На сегодня мои полномочия все.