Python Переменные

Python Переменные — важное понятие языка Python.

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

Привожу выдержки из главы 2-й книги Python Прохоренок_704:

Переменные

Все данные в языке Python представлены объектами. Каждый объект имеет тип данных и значение. Для доступа к объекту предназначены переменные.

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

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

Каждая переменная должна иметь уникальное имя, состоящее из латинских букв, цифр и знаков подчеркивания, причём имя переменной не может начинаться с цифры.

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

Например, имена, начинающиеся с символа подчеркивания, не импортируются из модуля с помощью инструкции from module import *, а имена, имеющие по два символа подчеркивания в начале и конце, для интерпретатора имеют особый смысл.

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

Листинг 2.1. Список всех ключевых слов

>>> import keyword

>>> keyword.kwlist

['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'Continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

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

Листинг 2.2. Ошибочное переопределение встроенных идентификаторов

>>> help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
‘    Return the absolute value of the argument.

>>> help = 10
>>> help
10
>>> help(abs)
Traceback (most recent call last):
‘    File «<pyshell#S>», line 1, in <module>
‘        help (abs)
TypeError: ‘int’ object is not callable

В этом примере мы с помощью встроенной функции help () получаем справку по функции аbs (). Далее переменной help присваиваем число 10. После переопределения идентификатора мы больше не можем пользоваться функцией help (), т. к. это приведет к выводу сообщения об ошибке.

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

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

В редакторе IDLE встроенные идентификаторы подсвечиваются фиолетовым цветом. Обращайте внимание на цвет переменной — он должен быть черным.

Если Вы заметили, что переменная подсвечена, то название переменной следует обязательно изменить. Получить полный список встроенных идентификаторов позволяет код, приведенный в Листинге 2.3.

Листинг 2.3. Получение списка встроенных идентификаторов
>>> import builtins
>>> dir(builtins)

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

Правильные имена переменных: х, y1, strName, str_name.
Неправильные имена переменных: 1y, ИмяПеременной.

Последнее имя неправильное, т. к. в нем используются русские буквы. Хотя на самом деле такой вариант также будет работать, но лучше русские буквы всё же не применять:
>>> ИмяПеременной = 10   # Лучше так не делать!
>>> ИмяПеременной

10

При указании имени переменной важно учитывать регистр букв: x и X- разные переменные:
>>> x = 10; X = 20
>>> x, X
(10, 20)

2.2. Типы данных

В Python 3 объекты могут иметь следующие типы данных:

+ bool — логический тип данных. Может содержать значения True или False, которые ведут себя как числа 1 и о соответственно:

>>> type(True), type(False)
(<class ‘bool’>, <class ‘bool’>)
>>> int(True), int(False)
( 1, 0)

+ NoneType — объект со значением None (обозначает отсутствие значения):

>>> type(None)
<class ‘NoneType’>

В логическом контексте значение None интерпретируется как False:

>>> bool(None)
False

+ int — целые числа. Размер числа ограничен лишь объемом оперативной памяти:
>>> type(2147483647), type(999999999999999999999999) (<class ‘int’>, <class ‘int’>)

+ float — вещественные числа:
>>> type(5.1), type(8.5e-3)
(<class ‘float’>, <class ‘float’>)

+ complex — комплексные числа:
>>> type (2+2j)
<class ‘complex’>

+ str — Unicode-строки:
>>> type («Строка»)

<class ‘str’>

+ bytes — неизменяемая последовательность байтов:
>>> type(bytes(«Строка», «utf-8″))

<class ‘bytes’>

+ bytearray — изменяемая последовательность байтов:
>>> type (bytearray («Строка», «utf-8″))

<class ‘bytearray’>

list — сnиски. Тип данных list аналогичен массивам в других языках программирования:
»> type ( [1, 2, 3] )

<class ‘list’>

tuple — кортежи:
>>> type ( (1, 2, 3)

<class ‘tuple’>

range — диапазоны:

>>> type( range(1, 10)

<class ‘range’>

dict — словари. Тип данных dict аналогичен ассоциативным· массивам в других языках программирования:
>>> type( {«х»: 5, «у»: 20} )

<class ‘dict’>

set — множества (коллекции уникальных объектов):
>>> type ( {«а», «bb», «с»} )

<class ‘set’>

frozenset- неизменяемые множества:
>>> type (frozenset (["а", "b", "с"]))

<class ‘frozenset’>

ellipsis- обозначается в виде трех точек или слова Ellipsis. Тип ellipsis используется в расширенном синтаксисе получения среза:
>>> type ( … ) , … , . . . is Ellipsis
(<class ‘ellipsis’>, Ellipsis, True)
>>> class С():
‘ def __getitem__(self, obj): return obj

>>> с = с ()
>>> с[ ... , 1:5, 0:9:1, 0]
(E11ipsis, s1ice(1, 5, None), s1ice(O, 9, 1), 0) ‘ + .

function — функции:
>>> def func(): pass
>>> type (func)
<class ‘function’>

module — модули:
>>> import sys
>>> type (sys)
<class ‘module’>

type — классы и типы данных. Не удивляйтесь! Все данные в языке Python являются объектами, даже сами типы данных!
>>> class С: pass
>>> type (С)
<class ‘type’>
>>> type (type ( «»))
<class ‘type’>

Основные типы данных делятся на изменяемые и неизменяемые. К изменяемым типам относятся списки, словари и тип bytearray. Пример изменения элемента списка:
>>> arr = [1, 2, 3]
>>> arr [0] = 0  # Изменяем первый элемент сnиска
>>> arr
[0, 2, 3]

К неизменяемым типам относятся числа, строки, кортежи и тип bytes. Например, чтобы получить строку из двух других строк, необходимо использовать операцию конкатенации, а ссылку на новый объект присвоить переменной:
>>> str1 = «авто»
>>> str2 = «транспорт»
>>> str3 = str1 + str2  # Конкатенация
>>> print(str3)
автотранспорт

Кроме того, типы данных делятся на последовательности и отображения. К последовательностям относятся строки, списки, кортежи, типы bytes и bytearray, а к отображениям — словари.

Последовательности и отображения поддерживают механизм итераторов, позволяющий произвести обход всех элементов с помощью метода __next__ () или функции next (). Например, вывести элементы списка можно так:
>>> arr = [1, 2]
>>> i = iter(arr)
>>> i.__next__() # Метод __next__ ()
1
>>> next (i) # Функция next ()
2

Если используется словарь, то на каждой итерации возвращается ключ:
>>> d = {«x»: 1, «у»: 2}
>>> i = iter(d)
>>> i.__next__ () # Возвращается ключ
‘у’
>>> d[i. next ()] # Получаем значение по ключу
1

На практике подобным способом не пользуются. Вместо него применяется цикл for, который использует механизм итераторов незаметно для нас. Например, вывести элементы списка можно так:
>>> for i in [1, 2]: print(i)

Перебрать слово по буквам можно точно так же. Для примера вставим тире после каждой буквы:
>>> for i in «Строка»: print (i + » -», end=» «)
Результат:
С-т-р-о-к-а

Пример перебора элементов словаря:
>>> d = («x»: 1, «у»: 2}
>>> for key in d: print( d[key]

Последовательности поддерживают также обращение к элементу по индексу, получение среза, конкатенацию (оператор +), повторение (оператор *) и проверку на вхождение (оператор in). Все эти операции мы будем подробно рассматривать по мере изучения языка.

2.3. Присваивание значения переменным

В языке Python используется динамическая типизация. Это означает, что при присваивании переменной значения интерпретатор автоматически относит переменную к одному из типов данных. Значение переменной присваивается с помощью оператора = таким образом:
>>> x = 7 # Тип int
>>> у= 7.8 # Тип float
>>> s1 = «Строка» # Переменной s1 присвоено значение Строка
>>> s2 = ‘Строка’ # Переменной s2 также присвоено значение Строка
>>> b = True # Переменной b присвоено Логическое значение True

В одной строке можно присвоить значение сразу нескольким переменным:
>>> x = у = 10
>>> x, у
(10, 10)

После присваивания значения в переменной сохраняется ссылка на объект, а не сам объект. Это обязательно следует учитывать при групповом присваивании. Групповое присваиванние можно использовать для чисел, строк и кортежей, но для изменяемых объектов этого делать нельзя.
Пример:
>>> x = у = [1, 2] # Якобы создали два объекта
>>> x, у
( [1, 2], [1, 2])

В этом примере мы создали список из двух элементов и присвоили значение переменным x и у. Теперь nопробуем изменить значение в переменной у:
>>> у[1] = 100 # Изменяем второй элемент
>>> x, у ([1, 100], [1, 100])

Как видно из примера, изменение значения в переменной у привело также к изменению значения в переменной x. Таким образом, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объекта, необходимо производить раздельное присваивание:
>>> x = [1, 2]
>>> у = [1, 2]
>>> у[1] = 100 # Изменяем второй элемент
>>> x, у
([1, 2], [1, 100])

Проверить, ссылаются ли две переменные на один и тот же объект, позволяет оператор is. Если переменные ссылаются на один и тот же объект, то оператор is возвращает значение True:
>>> x = у = [1, 2]
>>> x is у # Один объект
True
>>> x = [1, 2] # Разные объекты
>>> у = [1, 2] # Разные объекты
>>> x is у
False

Следует заметить, что в целях эффективности кода интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста переменным присвоено число 2, то в этих переменных будет сохранена ссылка на один и тот же объект. Пример:
>>> x = 2; у = 2; z = 2
>>> x is у, у is z
(True, True)

Посмотреть количество ссылок на объект позволяет метод getrefcount () из модуля sys:
>>> import sys # Подключаем модуль sys
>>> sys.getrefcount(2)
304

Когда число ссылок на объект становится равно нулю, объект автоматически удаляется из оперативной памяти. Исключением являются объекты, которые подлежат кэшированию.

Помимо группового присваивания язык Python поддерживает позиционное присваивание. В этом случае переменные указываются через запятую слева от оператора =, а значения — через запятую справа. Пример позиционного присваивания;
>>> x, у, z = 1, 2, 3
>>> x, у, z
(1, 2, 3)

С помощью позиционного присваивания можно поменять значения переменных местами. Пример:
>>> x, у = 1, 2; x, у
(1, 2)
>>> x, у = y, x; x, у
(2, 1)

По обе стороны оператора = могут быть указаны последовательности. Напомню, что к последовательностям относятся строки, списки, кортежи, типы bytes и bytearray.

В Python 3 существует возможность сохранения в переменной сnиска, состоящего из лишних элементов, при несоответствии количества элементов справа и слева от оператора Для этого перед именем переменной указывается звездочка (*).

Следует помнить, что звездочку можно указать только перед одной переменной. В противном случае возникнет неоднозначность и интерпретатор выведет сообщение об ошибке:
>>> *x, у, *z = (1, 2, 3, 4)
SyntaxError: two starred expressions in assignment

2.4. Проверка типа данных

Python в любой момент времени изменяет тип переменной в соответствии с данными, хранящимися в ней. Пример:
>>> а = «Строка» # Тип str

>>> а = 7  # Теперь переменная имеет тип int

Определить, на какой тип данных ссылается переменная, позволяет функция type ( <Имя переменной>) :
>>> type (а)
<class ‘int’>

Проверить тип данных переменной можно следующими способами:
- сравнить значение, возвращаемое функцией type (), с названием типа данных:
>>> x = 10
>>> if type(x) == int: print («Это тип int»)

- проверить тип с помощью функции isinstance () :
>>> s = «Строка»
>>> if isinstance(s, str): print («Это тип str»)

2.5. Преобразование типов данных

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

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

Таким образом, тип данных в языке Python- это характеристика объекта, а не переменной. Переменная всегда содержит только ссылку на объект.

После присваивания переменной значения над объектом можно производить операции, предназначенные для этого типа данных. Например, строку нельзя сложить с числом, т. к. это приведет к выводу сообщения об ошибке:
>>> 2 + «25″
Traceback (most recent call last) :
‘ File «<pyshell#O>»·, line 1, in <module>
‘ 2 + «25″
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’

Для преобразования типов данных предназначены следующие функции:
- bооl ( [ <Обект> ] ) — преобразует объект в логический тип данных. Примеры:
>>> bool(0), bool(1), bool(«»), bool(«Строка»), bool([1, 2]), bool([])
(False, True, False, True, True, False)

- int ( [<Объект> [, <Система счисления>] ] ) — преобразует объект в число. Во втором параметре можно указать систему счисления (значение по умолчанию — 10).

Примеры:
>>> int(7.5), int(«71″)
(7, 71)
>>> int(«71″, 10), int(«71″, 8), int(«0o71″, 8), int(«A», 16)
(71, 57, 57, 10)

Если преобразование невозможно, то возбуждается исключение:
>>> int («71s»)
Traceback (most recent call last):
‘ File «<pyshell#9>», line 1, in <modu1e>
int («71s»)
Va1ueError: inva1id 1itera1 for int() with base 10: ’71s’

- float ( [<Число или строка> ] ) — преобразует целое число или строку в вещественное число. Примеры:
>>> float(7), float(«7.1″)
(7.0, 7.1)
>>> float(«Infinity»), float(«-inf»)
(inf, -inf)
»> float («Infinity») + float («-inf»)
nan

- str ( [<Объект> ] ) — преобразует объект в строку.

- str (<Объект> [, <Кодировка> [, <Обработка ошибок>] ] ) — преобразует объект типа bytes или bytearray в строку. В третьем параметре могут быть указаны значения «strict» (при ошибке возбуждается исключение UnicodeDecodeError; значение по умолчанию), «replace» (неизвестный символ заменяется символом, имеющим код \uFFFD) или «ignore» (неизвестные символы игнорируются).

- bytes (<Строка>, <Кодировка> [, <Обработка ошибок>] ) — преобразует строку в объект типа bytes. В третьем параметре могут быть указаны значения «strict» (значение по умолчанию), «replace» или «ignore».

- bytes (<Последовательность>) -. преобразует последовательность целых чисел от О до 255 в объект типа bytes. Если число не попадает в диапазон, то возбуждается исключение ValueError.

- bytearray (<Строка>, <Кодировка> [, <Обработка ошибок>]) — преобразует строку в объект типа bytearray. В третьем параметре могут быть указаны значения «strict» (значение по умолчанию), «replace» или «ignore».

- bуtearrау(<Последовательность>J — преобразует последовательность целых чисел от О до 255 в объект типа bytearray. Если число не nопадает в диапазон, то возбуждается исключение ValueError.

- list (<Последовательность>) — преобразует элементы последовательности в список.

- tuple (<Последовательность>) — преобразует элементы последовательности в кортеж.

В качестве примера рассмотрим возможность сложения двух чисел, введенных пользователем. Как Вы уже знаете, вводить данные позволяет функция input ( ). Воспользуемся этой функцией для получения чисел от пользователя (листинг 2.4).

Листинг 2.4. Получение данных от пользователя

# -*- coding: utf-8 -*-
x = input («x = «) # Вводим 5
у = input («у = «) # Вводим 12
print (x + у)
input ()

Результатом выполнения этого скрипта будет не число, а строка «512″. Таким образом, следует запомнить, что функция input () возвращает результат в виде строки. Чтобы просуммировать два числа, необходимо преобразовать строку в число (листинг 2.5).

Листинг 2.5. Преобразование строки в число

# -*- coding: utf-8 -*-
x = int(input(«x = «)) # Вводим 5
у = int(input(«y = «)) # Вводим 12
print (x + у)
input ()

В этом случае мы получим число 17, как и должно быть. Однако, если пользователь вместо числа введёт строку, то программа завершится с фатальной ошибкой. Как обработать ошибку, мы будем рассматривать по мере изучения языка.

2.6. Удаление переменной

Удалить переменную можно с помощью инструкции del:
del <Переменная1>[, ... , <ПеременнаяN>]

Пример удаления одной переменной:
>>> x = 10; x
10
>>> del x; x
Traceback (most recent call last):
‘ File «<pyshell#l>», line 1, in <module>
‘ del x; x
NameError: name ‘x’ is not defined

Пример удаления нескольких переменных:
>>> x, у = 10, 20
>>> del x, у

Дико извиняюсь за обилие информации, но в учебнике её ещё больше — я выкинул некоторые примеры, чтобы не переутомиться слишком сильно на редактировании.

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

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

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Python ПеременныеПродолжение тут…

Родник_

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.