Локальные и глобальные переменные

Содержание

Почему GIL всё ещё используют?

Разработчики языка получили уйму жалоб касательно GIL. Но такой популярный язык как Python не может провести такое радикальное изменение, как удаление GIL, ведь это, естественно, повлечёт за собой кучу проблем несовместимости.


В прошлом разработчиками были предприняты попытки удаления GIL. Но все эти попытки разрушались существующими расширениями на C, которые плотно зависели от существующих GIL-решений. Естественно, есть и другие варианты, схожие с GIL. Однако они либо снижают производительность однопоточных и многопоточных I/O-приложений, либо попросту сложны в реализации. Вам бы не хотелось, чтобы в новых версиях ваша программа работала медленней, чем сейчас, ведь так?

Создатель Python, Guido van Rossum, в сентябре 2007 года высказался по поводу этого в статье «It isn’t Easy to remove the GIL»:

С тех пор ни одна из предпринятых попыток не удовлетворяла это условие.

Работа с переменными

Именование переменных

В языке Python имя переменной должно состоять только из цифр, букв и знаков подчеркивания. И не должно начинаться с цифры.

Это жёсткий внутренний закон языка, помимо которого есть свод более мягких, но не менее важных правил, и они говорят нам:

  • давайте переменным имена, которые описывают суть объекта;
  • используйте единый стиль именования в рамках каждого проекта;
  • старайтесь не создавать наименования длиннее пятнадцати символов;

Список зарезервированных слов

В каждом языке есть зарезервированные слова. Такие слова имеют специальное значение, и поэтому запрещены для использования в качестве имён переменных. Вот список зарезервированных слов для Python:

False, class, finally, is, return, None, continue, for, lambda, try, True, def, from, nonlocal, whileand, del, global, not, with, as, elif, if, or, yield, assert, else, import, pass, break, except, in, raise.

Как объявить переменную

В Питоне не требуется специального объявления переменных. В момент присваивания значения, объявление происходит автоматически. А присваивание выглядит так:

Импорт переменной в Python

Чтобы импортировать переменную из другого файла, используем в начале текущего файла следующую конструкцию:

Пример:

Проверка существования переменной

Чтобы выяснить, есть ли в программе переменная (например ), ищем вхождения строки с её названием в словарях, возвращаемых функциями (локальная видимость) и (глобальная видимость):

Локальная область видимости

Локальная область видимости наиболее часто используется в Python. Когда мы создаем переменную в блоке кода, она будет разрешена при помощи ближайшей области видимости, или областей. Группирование всех этих областей известно как среда блоков кода. Другими словами, все назначения выполняются в локальной области по умолчанию. Если вам нужно что-то другое, тогда вам нужно настроить свою переменную на глобальную или нелокальную область, которые мы рассмотрим немного позже. Сейчас мы создадим простой пример, используя интерпретатор Python, в котором демонстрируется назначение локальной области видимости.

Python

x = 10

def my_func(a, b): print(x) print(z)

my_func(1, 2)

1 2 3 4 5 6 7

x=10

defmy_func(a,b)

print(x)

print(z)

my_func(1,2)

Результат

Python

10 Traceback (most recent call last): File «<pyshell#19>», line 1, in <module> my_func(1, 2) File «<pyshell#18>», line 3, in my_func print(z) NameError: name ‘z’ is not defined

1 2 3 4 5 6 7

10

Traceback(most recent call last)

File»<pyshell#19>»,line1,in<module>

my_func(1,2)

File»<pyshell#18>»,line3,inmy_func

print(z)

NameErrorname’z’isnotdefined

Здесь мы создаем переменную х и очень простую функцию, которая принимает два аргумента. Далее она выводит х и z

Обратите внимание на то, что мы не определили z, так что когда мы вызываем функцию, мы получаем ошибку NameError. Это происходит в связи с тем, что z не определена, или находится вне области видимости

Если вы определите z перед вызовом функции, тогда она будет найдена и ошибка NameError не возникнет. Ошибка NameError также возникает при попытке получения доступа к переменной, которая находится только внутри функции:

Python

def my_func(a, b): i = 2 print(x)

if __name__ == ‘__main__’: x = 10 my_func(1, 2) print(i)

1 2 3 4 5 6 7 8 9

defmy_func(a,b)

i=2

print(x)

if__name__==’__main__’

x=10

my_func(1,2)

print(i)

Переменная i определена только внутри функции, так что при запуске кода мы получаем ошибку NameError. Давайте немного модифицируем первый пример. Разместим данный код в python-файл и попытаемся его запустить:

Python

def my_func(a, b): x = 5 print(x)

if __name__ == ‘__main__’: x = 10 my_func(1, 2) print(x)

1 2 3 4 5 6 7 8 9

defmy_func(a,b)

x=5

print(x)

if__name__==’__main__’

x=10

my_func(1,2)

print(x)

  1. Что, по-вашему, должно произойти?
  2. Выдаст ли код цифру 10 дважды?

Нет, не выдаст. Причина в том, что мы имеем две переменные х. Переменная х внутри my_func имеет локальную область видимости функции и переопределяет переменную х вне функции. Так что когда мы вызываем функцию my_func, в выдаче мы видим 5, а не 10. Затем, когда функция возвращается, переменная х внутри функции my_func является кучей мусора и область для выдачи х срабатывает еще один раз. По этой причине последний оператор выдачи выдает именно 10. Если вы хотите кое-что поинтереснее, вы можете попытаться вывести х перед тем как назначить его в нашей функции:

Python

def my_func(a, b): print(x) x = 5 print(x)

if __name__ == ‘__main__’: x = 10 my_func(1, 2) print(x)

1 2 3 4 5 6 7 8 9 10

defmy_func(a,b)

print(x)

x=5

print(x)

if__name__==’__main__’

x=10

my_func(1,2)

print(x)

Кода вы запустите этот код, вы получите ошибку:

Python

UnboundLocalError: local variable ‘x’ referenced before assignment

1 UnboundLocalErrorlocal variable’x’referenced before assignment

Это происходит потому, что Python замечает, что вы назначаете х в функцию my_func позже, что и приводит к ошибке, так как х еще не определен.

Операции в программировании

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

Так в математике и программировании символ плюса является оператором операции сложения по отношению к числам. В случае строк этот же оператор выполняет операцию конкатенации, т. е. соединения.

>>> 10.25 + 98.36
108.61
>>> 'Hello' + 'World'
'HelloWorld'

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

>>> 1 + 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Здесь в строке интерпретатор сообщает, что произошла ошибка типа – неподдерживаемый операнд для типов int и str.

Влияние GIL на многопоточные приложения

Если смотреть на типичную программу (не обязательно написанную на Python) — есть разница, ограничена ли эта программа производительностью процессора или же I/O.

Операции, ограниченные производительностью процессора (англ. CPU-bound) — это все вычислительные операции: перемножение матриц, поиск, обработка изображений и т. д.

Операции, ограниченные производительностью I/O (англ. I/O-bound) — это те операции, которые часто находятся в ожидании чего-либо от источников ввода/вывода (пользователь, файл, БД, сеть). Такие программы и операции иногда могут ждать долгое время, пока не получат от источника то, что им нужно. Это связано с тем, что источник может проводить собственные (внутренние) операции, прежде чем он будет готов выдать результат. Например, пользователь может думать над тем, что именно ввести в поисковую строку или же какой запрос отправить в БД.

Ниже приведена простая CPU-bound программа, которая попросту ведёт обратный отсчёт:

Запустив это на 4х-ядерном компьютере получим такой результат:

Ниже приведена та же программа, с небольшим изменением. Теперь обратный отсчёт ведётся в двух параллельных потоках:

И вот результат:


Как видно из результатов, оба варианта затратили примерно одинаковое время. В многопоточной версии GIL предотвратил параллельное выполнение потоков.

GIL не сильно влияет на производительность I/O-операций в многопоточных программах, т. к. в процессе ожидания от I/O блокировка распространяется по потокам.

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

Такое увеличение времени — это результат появления и реализации блокировки.

Почему для решения проблемы был выбран именно GIL?

Итак, почему же это не очень «хорошее» решение используется в Python? Насколько для разработчиков это решение критично?

По словам Larry Hastings, архитектурное решение GIL — это одна из тех вещей, которые сделали Python популярным.

Python существует с тех времён, когда в операционных системах не существовало понятия о потоках. Этот язык разрабатывался в расчёте на лёгкое использование и ускорение процесса разработки. Всё больше и больше разработчиков переходило на Python.

Много расширений, в которых нуждался Python, было написано для уже существующих библиотек на C. Для предотвращения несогласованных изменений, язык C требовал потокобезопасного управления памятью, которое смог предоставить GIL.

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

Те библиотеки на C, которые не были потокобезопасными, стало легче интегрировать. Эти расширения на C стали одной из причин, почему Python-сообщество стало расширяться.

Как можно понять, GIL — фактическое решение проблемы, с которой столкнулись разработчики CPython в начале жизни Python.

Global Variables

In Python, a variable declared outside of the function or in global scope is known as a global variable. This means that a global variable can be accessed inside or outside of the function.

Let’s see an example of how a global variable is created in Python.

Example 1: Create a Global Variable

Output

x inside: global
x outside: global

In the above code, we created x as a global variable and defined a to print the global variable x. Finally, we call the which will print the value of x.

What if you want to change the value of x inside a function?

Output

UnboundLocalError: local variable 'x' referenced before assignment

The output shows an error because Python treats x as a local variable and x is also not defined inside .

To make this work, we use the keyword. Visit Python Global Keyword to learn more.

Python Glob() Methods

Today, we are going to discuss three primary functions of Glob module.

Contents

glob(file_pattern, recursive = False)

It retrieves the list of files matching the specified pattern in the file_pattern parameter.

The file_pattern can be an absolute or relative path. It may also contain wild cards such as “*” or “?” symbols.

The recursive parameter is turn off (False) by default. When True, it recursively searches files under all subdirectories of the current directory.

Let’s now check out some examples:

Check the current directory for Python script files

The below code checks for .py files in the current dir only.

>>> import glob
>>> for py in glob.glob("*.py"):
...    print(py)
...
copy_file1.py
copy_file2.py
decimal_sample.py

Another sample code – It checks for .py files in current dir and subdirectories.

>>> import glob
>>> for py in glob.glob("*.py"):
...    print(py)
...
copy_file1.py
copy_file2.py
decimal_sample.py
test_num.py
test_python_in_with_if.py
test_scope.py

List files with a pattern

We can provide a pathname pattern by including some wild cards like ? or numeric range .  The below code lists all files whose name starts with “test” followed by a number.

>>> for py in glob.glob("test.py"):
...    print(py)
...
test1.py
test2.py

Let’s check one more example using the question mark in the pattern.

>>> for py in glob.glob("?????.py"):
...    print(py)
...
quiz1.py
test1.py
test2.py

The above for loop statement printed all .py files having five letters.

The following statement would print the names of folders recursively in the current working directory.

>>> glob.glob('selenium/**/', recursive=True)

iglob() method | Python Glob

This method creates a Python generator object which can be used to list files under a given directory. You can call the next() function to print names of files.

Check the sample code below:

>>> gen = glob.iglob("*.py")
>>> type(gen)
<class 'generator'>
>>> for py in gen:
...    print(py)
...
copy_file1.py
copy_file2.py
decimal_sample.py
find_seed.py
frozen_set.py

escape() method

It allows for escaping the given character sequence. You can find it handy for locating files with certain characters in their file names.

Check out the below examples:

>>> char_seq = "-_#"
>>> for spcl_char in char_seq:
...    esc_set = "*" + glob.escape(spcl_char) + "*" + ".py"
...    for py in (glob.glob(esc_set)):
...       print(py)
...
python quiz-classes-2.py
python-class.py
python-lists.py
python-random#num.py
python-set.py
python-tuples.py
python-while_loop.py
copy_file#2.py
decimal_sample.py
find_seed.py
frozen-set.py

Must check out – Python to list all files in a directory

Use of global Keyword

Let’s take an example.

Example 1: Accessing global Variable From Inside a Function

When we run the above program, the output will be:

1

However, we may have some scenarios where we need to modify the global variable from inside a function.

Example 2: Modifying Global Variable From Inside the Function

When we run the above program, the output shows an error:

UnboundLocalError: local variable 'c' referenced before assignment

This is because we can only access the global variable but cannot modify it from inside the function.

The solution for this is to use the keyword.

Example 3: Changing Global Variable From Inside a Function using global

When we run the above program, the output will be:

Inside add(): 2
In main: 2

In the above program, we define c as a global keyword inside the function.


Then, we increment the variable c by , i.e . After that, we call the function. Finally, we print the global variable c.

As we can see, change also occurred on the global variable outside the function, .

Практическая работа

Напишите программу, в которой определены следующие четыре функции:

  1. Функция getInput() не имеет параметров, запрашивает ввод с клавиатуры и возвращает в основную программу полученную строку.

  2. Функция testInput() имеет один параметр. В теле она проверяет, можно ли переданное ей значение преобразовать к целому числу. Если можно, возвращает логическое True. Если нельзя – False.

  3. Функция strToInt() имеет один параметр. В теле преобразовывает переданное значение к целочисленному типу. Возвращает полученное число.

  4. Функция printInt() имеет один параметр. Она выводит переданное значение на экран и ничего не возвращает.

В основной ветке программы вызовите первую функцию. То, что она вернула, передайте во вторую функцию. Если вторая функция вернула True, то те же данные (из первой функции) передайте в третью функцию, а возвращенное третьей функцией значение – в четвертую.

Переменные

Данные хранятся в ячейках памяти компьютера. Когда мы вводим число, оно помещается в какую-то ячейку памяти. Но как потом узнать, куда именно? Как впоследствии обращаться к этим данными? Нужно как-то запомнить, пометить соответствующую ячейку.

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

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

Слово «переменная» обозначает, что сущность может меняться, она непостоянна. Действительно, вы увидите это в дальнейшем, одна и та же переменная может быть связана сначала с одними данными, а потом – с другими. То есть ее значение может меняться, она переменчива.

В программе на языке Python, как и на большинстве других языков, связь между данными и переменными устанавливается с помощью знака =. Такая операция называется присваивание (также говорят «присвоение»). Например, выражение sq = 4 означает, что на объект, представляющий собой число 4, находящееся в определенной области памяти, теперь ссылается переменная sq, и обращаться к этому объекту следует по имени sq.

Имена переменных могут быть любыми. Однако есть несколько общих правил их написания:

  1. Желательно давать переменным осмысленные имена, говорящие о назначении данных, на которые они ссылаются.

  2. Имя переменной не должно совпадать с командами языка (зарезервированными ключевыми словами).

  3. Имя переменной должно начинаться с буквы или символа подчеркивания (_), но не с цифры.

  4. Имя переменной не должно содержать пробелы.

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

>>> sq = 4
>>> sq
4

Вот более сложный пример работы с переменными в интерактивном режиме:

>>> apples = 100
>>> eat_day = 5
>>> day = 7
>>> apples = apples - eat_day * day
>>> apples
65

Здесь фигурируют три переменные: apples, eat_day и day. Каждой из них присваивается свое значение. Выражение сложное. Сначала выполняется подвыражение, стоящее справа от знака равенства. После этого его результат присваивается переменной apples, в результате чего ее старое значение (100) теряется. В подвыражении вместо имен переменных на самом деле используются их значения, т. е. числа 100, 5 и 7.

Ключевые аргументы

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

Python

def keyword_function(a=1, b=2): return a+b

print( keyword_function(b=4, a=5) ) # 9

1 2 3 4

defkeyword_function(a=1,b=2)

returna+b

print(keyword_function(b=4,a=5))# 9

Вы также можете вызвать данную функцию без спецификации ключевых слов. Эта функция также демонстрирует концепт аргументов, используемых по умолчанию. Каким образом? Попробуйте вызвать функцию без аргументов вообще!

Python

keyword_function() # 3

1 keyword_function()# 3

Функция вернулась к нам с числом 3. Почему? Причина заключается в том, что а и b по умолчанию имеют значение 1 и 2 соответственно. Теперь попробуем создать функцию, которая имеет обычный аргумент, и несколько ключевых аргументов:

Python

def mixed_function(a, b=2, c=3): return a+b+c

mixed_function(b=4, c=5)

Traceback (most recent call last): File «<string>», line 1, in <fragment> TypeError: mixed_function() takes at least 1 argument (2 given)

1 2 3 4 5 6 7 8

defmixed_function(a,b=2,c=3)

returna+b+c

mixed_function(b=4,c=5)

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

TypeErrormixed_function()takes at least1argument(2given)

Python

print( mixed_function(1, b=4, c=5) ) # 10

print( mixed_function(1) ) # 6

1 2 3

print(mixed_function(1,b=4,c=5))# 10

print(mixed_function(1))# 6

Выше мы описали три возможных случая. Проанализируем каждый из них. В первом примере мы попробовали вызвать функцию, используя только ключевые аргументы. Это дало нам только ошибку. Traceback указывает на то, что наша функция принимает, по крайней мере, один аргумент, но в примере было указано два аргумента. Что же произошло? Дело в том, что первый аргумент необходим, потому что он ни на что не указывает, так что, когда мы вызываем функцию только с ключевыми аргументами, это вызывает ошибку. Во втором примере мы вызвали смешанную функцию, с тремя значениями, два из которых имеют название. Это работает, и выдает нам ожидаемый результат: 1+4+5=10. Третий пример показывает, что происходит, если мы вызываем функцию, указывая только на одно значение, которое не рассматривается как значение по умолчанию. Это работает, если мы берем 1, и суммируем её к двум значениям по умолчанию: 2 и 3, чтобы получить результат 6! Удивительно, не так ли?

Global and local variables

Here, we will show how to use global variables and local variables in the same code.

Example 4: Using Global and Local variables in the same code

Output

global global 
local

In the above code, we declare x as a global and y as a local variable in the . Then, we use multiplication operator to modify the global variable x and we print both x and y.

After calling the , the value of x becomes because we used the to print two times . After that, we print the value of local variable y i.e .

Example 5: Global variable and Local variable with same name

Output

local x: 10
global x: 5

In the above code, we used the same name x for both global variable and local variable. We get a different result when we print the same variable because the variable is declared in both scopes, i.e. the local scope inside and global scope outside .


When we print the variable inside it outputs . This is called the local scope of the variable.

Similarly, when we print the variable outside the , it outputs global x: 5. This is called the global scope of the variable.

Local Variables

A variable declared inside the function’s body or in the local scope is known as a local variable.

Example 2: Accessing local variable outside the scope

Output

NameError: name 'y' is not defined

The output shows an error because we are trying to access a local variable y in a global scope whereas the local variable only works inside or local scope.

Let’s see an example on how a local variable is created in Python.

Example 3: Create a Local Variable

Normally, we declare a variable inside the function to create a local variable.

Output

local

Let’s take a look at the where x was a global variable and we wanted to modify x inside .

Что такое переменная?

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

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

К примеру, у вас есть целое число 103204934813. Вы можете сохранить его в переменной, и тогда вам не придётся постоянно вводить повторно длинное число. Сохраните число в переменной my_int:

По сути, my_int – это ярлык, привязанный к значению 103204934813.

Фраза my_int = 103204934813 – это операция присваивания, которая состоит из следующих частей:

  • my_int – имя переменной;
  • = – оператор присваивания;
  • 103204934813 – значение.

Таким образом, присваивая значению имя, вы инициализируете, или создаёте переменную. После этого можно использовать переменную вместо значения. В Python, в отличие от некоторых других языков программирования, переменные не нужно явно декларировать. То есть, объявив, что my_int равно 103204934813, вы можете просто использовать my_int вместо числа. Попробуйте запустить:

С помощью переменных можно быстро выполнить вычисления. Попробуйте отнять 813 из my_int:

В качестве значения переменной можно использовать результат математического уравнения. Попробуйте сложить два числа и сохранить значение их суммы в переменной x:

Как видите, это очень похоже на простейшее школьное уравнение; здесь, как и в алгебре, буквы и другие символы используются для представления чисел и величин в формулах и уравнениях. Синтаксис Python подразумевает, что имя переменной находится слева, а значение – справа.

Выведите значение x:

Python выводит 221, потому что именно это число получается в результате сложения 76 и 145.

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

Попробуйте запросить одну из этих переменных. На экране появится значение этой переменной:

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

Область видимости переменных

Последнее обновление: 23.04.2017

Область видимости или scope определяет контекст переменной, в рамках которого ее можно использовать. В Python есть два типа контекста: глобальный и локальный.

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

name = "Tom"


def say_hi():
    print("Hello", name)


def say_bye():
    print("Good bye", name)

say_hi()
say_bye()

Здесь переменная name является глобальной и имеет глобальную область видимости. И обе определенные здесь функции могут свободно ее использовать.

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

def say_hi():
    name = "Sam"
    surname = "Johnson"
    print("Hello", name, surname)


def say_bye():
    name = "Tom"
    print("Good bye", name)

say_hi()
say_bye()

В данном случае в каждой из двух функций определяется локальная переменная name. И хотя эти переменные называются одинаково, но тем не менее это дву разных переменных, каждая из которых доступна только в рамках своей функции. Также в функции say_hi определена переменная surname, которая также является локальной, поэтому в функции say_bye мы ее использовать не сможем.

Есть еще один вариант определения переменной, когда локальная переменная скрывают глобальную с тем же именем:

name = "Tom"


def say_hi():
    print("Hello", name)


def say_bye():
    name = "Bob"
    print("Good bye", name)

say_hi()  # Hello Tom
say_bye()  # Good bye Bob

Здесь определена глобальная переменная name. Однако в функции say_bye определена локальная переменная с тем же именем name. И если функция say_hi использует глобальную переменную, то функция say_bye использует локальную переменную, которая скрывает глобальную.

Если же мы хотим изменить в локальной функции глобальную переменную, а не определить локальную, то необходимо использовать ключевое слово global:

def say_bye():
	global name
    name = "Bob"
    print("Good bye", name)

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

PI = 3.14


# вычисление площади круга
def get_circle_square(radius):

    print("Площадь круга с радиусом", radius, "равна", PI * radius * radius)

get_circle_square(50)

В данном случае число 3.14 представлено константой PI. Понятно, что это значение в принципе не изменится, поэтому его можно вынести из функций и определить в виде константы. Как правило, имя константы определяется заглавными буквами.

НазадВперед

Вывод данных. Функция print()

Что такое функция в программировании, узнаем позже. Пока будем считать, что print() – это такая команда языка Python, которая выводит то, что в ее скобках на экран.

>>> print(1032)
1032
>>> print(2.34)
2.34
>>> print("Hello")
Hello

В скобках могут быть любые типы данных. Кроме того, количество данных может быть различным:

>>> print("a:", 1)
a: 1
>>> one = 1
>>> two = 2
>>> three = 3
>>> print(one, two, three)
1 2 3

Можно передавать в функцию print() как непосредственно литералы (в данном случае и ), так и переменные, вместо которых будут выведены их значения. Аргументы функции (то, что в скобках), разделяются между собой запятыми. В выводе вместо запятых значения разделены пробелом.

Если в скобках стоит выражение, то сначала оно выполняется, после чего print() уже выводит результат данного выражения:

>>> print("hello" + " " + "world")
hello world
>>> print(10 - 2.5/2)
8.75

В print() предусмотрены дополнительные параметры. Например, через параметр sep можно указать отличный от пробела разделитель строк:

>>> print("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", sep="-")
Mon-Tue-Wed-Thu-Fri-Sat-Sun
>>> print(1, 2, 3, sep="//")
1//2//3

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

>>> print(10, end="")
10>>>

Обычно, если end используется, то не в интерактивном режиме, а в скриптах, когда несколько выводов подряд надо разделить не переходом на новую строку, а, скажем, запятыми. Сам переход на новую строку обозначается комбинацией символов . Если присвоить это значение параметру end, то никаких изменений в работе функции print() вы не увидите, так как это значение и так присвоено по-умолчанию:

>>> print(10, end=’\n’) 10 >>>

Однако, если надо отступить на одну дополнительную строку после вывода, то можно сделать так:

>>> print(10, end='\n\n')
10
 
>>>

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

Форматирование может выполняться в так называемом старом стиле или с помощью строкового метода format. Старый стиль также называют Си-стилем, так как он схож с тем, как происходит вывод на экран в языке C. Рассмотрим пример:

>>> pupil = "Ben"
>>> old = 16
>>> grade = 9.2
>>> print("It's %s, %d. Level: %f" % (pupil, old, grade))
It's Ben, 16. Level: 9.200000

Здесь вместо трех комбинаций символов , , подставляются значения переменных pupil, old, grade. Буквы s, d, f обозначают типы данных – строку, целое число, вещественное число. Если бы требовалось подставить три строки, то во всех случаях использовалось бы сочетание %s.

Хотя в качестве значения переменной grade было указано число 9.2, на экран оно вывелось с дополнительными нулями. Однако мы можем указать, сколько требуется знаков после запятой, записав перед буквой f точку с желаемым числом знаков в дробной части:

>>> print("It's %s, %d. Level: %.1f" % (pupil, old, grade))
It's Ben, 16. Level: 9.2

Теперь посмотрим на метод format():

>>> print("This is a {0}. It's {1}.".format("ball", "red"))
This is a ball. It's red.
>>> print("This is a {0}. It's {1}.".format("cat", "white"))
This is a cat. It's white.
>>> print("This is a {0}. It's {1} {2}.".format(1, "a", "number"))
This is a 1. It's a number.

В строке в фигурных скобках указаны номера данных, которые будут сюда подставлены. Далее к строке применяется метод format(). В его скобках указываются сами данные (можно использовать переменные). На нулевое место подставится первый аргумент метода format(), на место с номером 1 – второй и т. д.

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


С этим читают