Функции в python
Содержание:
- Содержание:
- Возвращает тип объекта и является собственным метаклассом языка Python.
- Задания для самоподготовки
- Known Issues
- Ввод из файла
- Практическая работа
- #3 Интерполяция строк / f-Строки (Python 3.6+)
- Типизация в Python
- Примеры создания и изменения классов «на лету» при помощи type():
- Вот и всё об этом
- Создание переменных в Python
- Вызов функции
- Почему Вам нужно обратиться именно к нам?
- Python SciPy
- Основные особенности языка
- Позволяет производить ввод данных в консоли.
- Решение задач
- А как сделать резервное копирование всех моих настроек?
- Функция range()
- Зачем это нужно
- Переменные
- Новый способ форматирования — метод format()
Содержание:
Помните Дзен Python, где должен быть “один очевидный способ сделать что-то в Python”? Можете почесать голову перед тем, как понять, что зачастую есть целых 4 эффективных способа выполнить в Python.
Давайте приступим к делу, работы много! Чтобы иметь в распоряжении простой пример для эксперимента, представим, что у вас есть следующие переменные (или константы, не важно) для работы:
Python
errno = 50159747054
name = ‘Bob’
1 |
errno=50159747054 name=’Bob’ |
Основываясь на этих переменных, вы хотите создать строку вывода, содержащую простое уведомление об ошибке:
Python
‘Hey Bob, there is a 0xbadc0ffee error!’
1 | ‘Hey Bob, there is a 0xbadc0ffee error!’ |
Эта ошибка может немного подпортить понедельник вашему разрабу… Но мы здесь за тем, чтобы обсудить форматирование строк. Так что приступим к делу.
Возвращает тип объекта и является собственным метаклассом языка Python.
Параметры:
- — объект, тип которого определяется
- — имя для создаваемого типа
- — кортеж с родительскими классами
- — словарь, будет являться пространством имён для тела класса
Возвращаемое значение:
- тип объекта, при ,
- объект нового типа при .
Вызов класса с одним аргументом:
Класс с одним аргументом возвращает тип объекта. Возвращаемое значение — это как правило, тот же объект, что и возвращаемый .
Рекомендуется для проверки типа объекта использовать встроенную функцию , так как она принимает во внимание подклассы
Примеры использования класса при вызове с одним аргументом.
>>> x = 1 >>> type(x) # <class 'int'> >>> x = 1, 2, 3 >>> type(x) # <class 'list'> # проверка типа объекта >>> x = 1 >>> isinstance(x, int) # True >>> x = 1, 2, 3 >>> isinstance(x, list) # True
Вызов класса с тремя аргументами:
Класс с тремя аргументами вернет объект нового типа. Это по сути динамическая форма инструкции , ее еще называют метакласс.
Другими словами класс , вызванный с тремя аргументами на самом деле ! Класс это метакласс, который Python внутренне использует для создания всех классов.
Все, с чем имеем дело в Python, является объектом. Сюда входят функции и классы целые числа, строки и т.д. Все они объекты. И все они созданы из класса.
# type - это тип всех типов, для # которых не указан явно иной метакласс >>> type(type) # <class 'type'> >>> type(object) # <class 'type'> >>> type(list) # <class 'type'> >>> type(int) # <class 'type'> >>> class Bar(object): pass >>> type(Bar) # <class 'type'>
В общем — это класс всех классов в языке Python и является собственным метаклассом. Класс нельзя воспроизвести на чистом Python.
Аргумент является именем класса и становится атрибутом . это кортеж, в котором перечисляются базовые классы, он становится атрибутом . — это пространство имен, содержащее определения для тела класса, которое копируется в стандартный словарь и становится атрибутом .
Понятия класс и тип по сути являются синонимами. Пользовательские типы данных могут быть сконструированы налету, во время исполнения, при помощи вызова с тремя аргументами или определены в коде, например при помощи инструкции .
Важно понимать, что тип, как и другие сущности в Python, тоже является объектом. Изменено в Python 3.6: подклассы, которые не переопределяют, больше не могут использовать форму с одним аргументом для получения типа объекта
Изменено в Python 3.6: подклассы, которые не переопределяют, больше не могут использовать форму с одним аргументом для получения типа объекта.
Задания для самоподготовки
1. Поставить в
соответствие следующим английским символам русские буквы:
h – х, e – е, l – л, o – о, w – в, r – р, d – д
и преобразовать строку «hello world!» в русские символы.
2. Дан текст:
t = «»»Куда ты скачешь
гордый конь,
И
где опустишь ты копыта?
О
мощный властелин судьбы!
Не
так ли ты над самой бездной,
На высоте, уздой железной
Россию
поднял на дыбы?»»»
Необходимо
выделить каждое второе слово из этого стихотворения и представить результат в
виде упорядоченного списка. (Подумайте как реализовать алгоритм с наименьшими
затратами по памяти).
3. Реализовать
алгоритм для нахождения всех делителей натурального числа N. Число N вводится с
клавиатуры. Для начала можно реализовать простым перебором всех N возможных чисел
(делителей). Затем, подумайте, как можно оптимизировать по скорости этот
алгоритм.
Видео по теме
Python 3 #1: установка и запуск интерпретатора языка
Python 3 #2: переменные, оператор присваивания, типы данных
Python 3 #3: функции input и print ввода/вывода
Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень
Python 3 #5: условный оператор if, составные условия с and, or, not
Python 3 #6: операторы циклов while и for, операторы break и continue
Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in
Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие
Python 3 #9: списки list и функции len, min, max, sum, sorted
Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear
Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора
Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop
Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index
Python 3 #14: функции (def) — объявление и вызов
Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»
Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов
Python 3 #17: алгоритм Евклида, принцип тестирования программ
Python 3 #18: области видимости переменных — global, nonlocal
Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение
Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield
Python 3 #21: функции map, filter, zip
Python 3 #22: сортировка sort() и sorted(), сортировка по ключам
Python 3 #23: обработка исключений: try, except, finally, else
Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle
Python 3 #25: форматирование строк: метод format и F-строки
Python 3 #26: создание и импорт модулей — import, from, as, dir, reload
Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)
Python 3 #28: декораторы функций и замыкания
Python 3 #29: установка и порядок работы в PyCharm
Python 3 #30: функция enumerate, примеры использования
Known Issues
Ввод из файла
Ввод также может быть прочитан из файлов. Файлы могут быть открыты с помощью встроенной функции . Использование , синтаксис ( так называемый «Контекст — менеджер») делает работу с и получить дескриптор файла супер легко:
Это гарантирует, что когда выполнение кода покидает блок, файл автоматически закрывается.
Файлы могут быть открыты в разных режимах. В приведенном выше примере файл открывается только для чтения. Чтобы открыть существующий файл для чтения только использовать . Если вы хотите , чтобы прочитать этот файл как байты использовать . Для добавления данных в существующий файл с помощью . Используйте , чтобы создать файл или перезаписать существующие файлы с тем же именем. Вы можете использовать , чтобы открыть файл для чтения и записи. Первый аргумент это имя файла, второй режим. Если режим остается пустым, то по умолчанию будет .
Если размер файла крошечный, безопасно прочитать все содержимое файла в память. Если файл очень большой, часто лучше читать построчно или по частям и обрабатывать ввод в том же цикле. Для этого:
При чтении файлов учитывайте характерные для операционной системы символы перевода строки. Хотя автоматически удаляет их, это всегда безопасно вызывать на линии чтения, как показано выше.
Открытые файлы ( в приведенных выше примерах) всегда указывают на определенное место в файле. Когда они первые открыли точки дескриптор файла в самом начале файла, который является положение . Дескриптор файла может отображать его текущее положение с :
После прочтения всего содержимого позиция обработчика файла будет указана в конце файла:
Позиция обработчика файла может быть установлена на то, что нужно:
Вы также можете прочитать любую длину из содержимого файла во время данного вызова. Чтобы сделать это передать аргумент для . Когда вызывается без аргументов он не будет читать до конца файла. Если передать аргумент он прочтет , что количество байтов или символов, в зависимости от режима ( и соответственно):
Чтобы продемонстрировать разницу между символами и байтами:
Практическая работа
-
Вводится строка, включающая строчные и прописные буквы. Требуется вывести ту же строку в одном регистре, который зависит от того, каких букв больше. При равном количестве преобразовать в нижний регистр. Например, вводится строка «HeLLo World», она должна быть преобразована в «hello world», потому что в исходной строке малых букв больше. В коде используйте цикл for, строковые методы upper() (преобразование к верхнему регистру) и lower() (преобразование к нижнему регистру), а также методы isupper() и islower(), проверяющие регистр строки или символа.
-
Строковый метод isdigit() проверяет, состоит ли строка только из цифр. Напишите программу, которая запрашивает с ввода два целых числа и выводит их сумму. В случае некорректного ввода программа не должна завершаться с ошибкой, а должна продолжать запрашивать числа. Обработчик исключений try-except использовать нельзя.
#3 Интерполяция строк / f-Строки (Python 3.6+)
Python 3.6 Добавил новый подход форматирования строк под названием форматированные строчные литералы, или “f-строки”. Этот новый способ форматирования строк позволяет вам использовать встроенные выражения Python внутрь строковых констант. Вот простой, наглядный пример:
Python
name = ‘Bob’
print(f’Hello, {name}!’)
# Вывод: ‘Hello, Bob!’
1 |
name=’Bob’ print(f’Hello, {name}!’) |
Как вы видите, это добавляет префикс к константе строки с буквой “f” — следовательно, названием становится “f-strings”. Этот новый синтаксис форматирования — очень мощный. Так как вы можете вставлять произвольные выражения Python, вы можете даже проводить встроенную арифметику. Посмотрим на пример:
Python
a = 5
b = 10
print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’)
# Вывод: ‘Five plus ten is 15 and not 30.’
1 |
a=5 b=10 print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’) |
Форматированные строчные литералы — это особенность парсера Python, которая конвертирует в серию строчных констант и выражений. Затем, они соединяются и составляют итоговую строку.
Представьте, что у вас есть следующая функция greet(), которая содержит :
Python
def greet(name, question):
return f»Hello, {name}! How’s it {question}?»
print(greet(‘Bob’, ‘going’))
# Вывод: «Hello, Bob! How’s it going?»
1 |
defgreet(name,question) returnf»Hello, {name}! How’s it {question}?» print(greet(‘Bob’,’going’)) |
Когда вы разбираете функцию, и смотрите, что происходит за кулисами, вы увидите, что f-строка в функции трансформируется в нечто, похожее на следующее:
Python
def greet(name, question):
return «Hello, » + name + «! How’s it » + question + «?»
1 |
defgreet(name,question) return»Hello, «+name+»! How’s it «+question+»?» |
Python
>>> import dis
>>> dis.dis(greet)
2 0 LOAD_CONST 1 (‘Hello, ‘)
2 LOAD_FAST 0 (name)
4 FORMAT_VALUE 0
6 LOAD_CONST 2 («! How’s it «)
8 LOAD_FAST 1 (question)
10 FORMAT_VALUE 0
12 LOAD_CONST 3 (‘?’)
14 BUILD_STRING 5
16 RETURN_VALUE
1 |
>>>importdis >>>dis.dis(greet) 2LOAD_CONST1(‘Hello, ‘) 2LOAD_FAST(name) 4FORMAT_VALUE 6LOAD_CONST2(«! How’s it «) 8LOAD_FAST1(question) 10FORMAT_VALUE 12LOAD_CONST3(‘?’) 14BUILD_STRING5 16RETURN_VALUE |
Строчные литералы также поддерживают существующий синтаксис формата строк метода str.format(). Это позволяет вам решать те же проблемы с форматированием, которые мы рассматривали в двух предыдущих разделах:
Python
print(f»Hey {name}, there’s a {errno:#x} error!»)
# Вывод: «Hey Bob, there’s a 0xbadc0ffee error!»
1 |
print(f»Hey {name}, there’s a {errno:#x} error!») |
Новые форматированные строчные литералы аналогичны шаблонным литералам (Template Literals) в JavaScript, которые были добавлены в ES2015. Я думаю это достаточно хорошее нововведение в Python, и я бы с радостью пользовался ими на каждодневной основе (в Python 3). Вы можете узнать больше о форматированных строчных литералах в интернете.
Типизация в Python
Для обозначения базовых типов переменных используются сами типы:
- etc.
Пример использования базовых типов в python-функции:
Помимо этого, можно параметризировать более сложные типы, например, . Такие типы могут принимать значения параметров, которые помогают более точно описать тип функции. Так, например, указывает на то, что список состоит только из целочисленных значений.
Пример кода:
Кроме , существуют и другие типы из модуля typing, которые можно параметризировать. Такие типы называются Generic-типами. Такого рода типа определены для многих встроенных в Python структур данных:
- и т.д.
Как можно заметить, некоторые типы имеют несколько параметров, которые можно описать. Например, означает, что это будет словарь, где ключи будут иметь тип , а значения – тип .
Курс «Управление ИТ-проектами»
Старт 17 сентября, 7 месяцев, Онлайн, От 8000 до 88 000 ₽
tproger.ru
События и курсы на tproger.ru
Также есть более абстрактные типы, например:
- – объект имеет реализации метода ;
- – объект имеет реализацию метода .
При этом функции тоже имеют свои типы. Например, для описания функции можно использовать тип , где указываются типы входных параметров и возвращаемых значений. Пример использования:
Тип :
- говорит о том, что у объекта реализован метод ;
- описывает типы параметров к этому методу.
На первом месте стоит массив типов входных параметров, на втором — тип возвращаемого значения.
Про остальные абстрактные типы контейнеров можно в документации Python.
Также есть более конкретные типы, например , где указывает не тип, а конкретное значение. Например означает цифру 3. Используют такой тип крайне редко.
Также Python позволяет определять свои Generic-типы.
В данном примере означает переменную любого типа, которую можно подставить при указании. Например:
Для определения собственных типов наследование возможно не только от , но и от других абстрактных типов, например, таких, как , .
На месте или могут быть конкретные типы.
Также есть специальные конструкции, которые позволяют комбинировать типы. Например, — один из типов. Если переменной может быть как , так и , то как тип следует указать . Если переменной может быть как , так и , то в качестве типа можно указать или, что предпочтительно, .
Примеры создания и изменения классов «на лету» при помощи type():
Например, следующие два определения создают идентичные объекты.
>>> class Foo(object): ... bar = True >>> Foo = type('Foo', (), {'bar'True})
Класс , созданный через метакласс можно использовать как обычный класс:
>>> Foo # <class '__main__.Foo'> >>> f = Foo() >>> f.bar # True # можно наследоваться от него >>> class FooChild(Foo): pass ... >>> FooChild # <class '__main__.FooChild'> >>> FooChild.bar # bar унаследован от Foo # True
Добавим методы в класс . Для этого определим функцию и добавим ее как атрибут.
>>> def echo_bar(self): ... print(self.bar) ... >>> FooChild = type('FooChild', (Foo,), {'echo_bar' echo_bar}) >>> hasattr(Foo, 'echo_bar') # False >>> hasattr(FooChild, 'echo_bar') # True >>> my_foo = FooChild() >>> my_foo.echo_bar() # True # после динамического создания класса добавим еще один метод >>> def echo_bar_more(self): ... print('yet another method') ... >>> FooChild.echo_bar_more = echo_bar_more >>> hasattr(FooChild, 'echo_bar_more') # True
Вот и всё об этом
Создание переменных в Python
Переменные являются контейнерами для хранения значений данных.
В отличие от других языков программирования, в Python нет команды для объявления переменной.
Переменная создается в тот момент, когда вы впервые присваиваете ей значение.
x = 5
y = «John»
print(x)
print(y)
Переменные не нужно указывать каким-либо конкретным типом, и они могут даже изменить тип после того, как они были установлены.
В других языках программирования обычно необходимо указывать тип переменных! В Python этого делать не нужно!
x = 4 # x имеет тип int (целое число)
x = «Sally» # x имеет тип str (строчная переменная)
print(x)
Строчные переменные могут быть объявлены с использованием одинарных или двойных кавычек:
Вызов функции
Рассмотрим полную версию программы с функцией:
def countFood(): a = int(input()) b = int(input()) print("Всего", a+b, "шт.") print("Сколько бананов и ананасов для обезьян?") countFood() print("Сколько жуков и червей для ежей?") countFood() print("Сколько рыб и моллюсков для выдр?") countFood()
После вывода на экран каждого информационного сообщения осуществляется вызов функции, который выглядит просто как упоминание ее имени со скобками. Поскольку в функцию мы ничего не передаем скобки опять же пустые. В приведенном коде функция вызывается три раза.
Когда функция вызывается, поток выполнения программы переходит к ее определению и начинает исполнять ее тело. После того, как тело функции исполнено, поток выполнения возвращается в основной код в то место, где функция вызывалась. Далее исполняется следующее за вызовом выражение.
В языке Python определение функции должно предшествовать ее вызовам. Это связано с тем, что интерпретатор читает код строка за строкой и о том, что находится ниже по течению, ему еще неизвестно. Поэтому если вызов функции предшествует ее определению, то возникает ошибка (выбрасывается исключение NameError):
print("Сколько бананов и ананасов для обезьян?") countFood() print("Сколько жуков и червей для ежей?") countFood() print("Сколько рыб и моллюсков для выдр?") countFood() def countFood(): a = int(input()) b = int(input()) print("Всего", a+b, "шт.")
Результат:
Сколько бананов и ананасов для обезьян? Traceback (most recent call last): File "test.py", line 2, in <module> countFood() NameError: name 'countFood' is not defined
Для многих компилируемых языков это не обязательное условие. Там можно определять и вызывать функцию в произвольных местах программы. Однако для удобочитаемости кода программисты даже в этом случае предпочитают соблюдать определенные правила.
Почему Вам нужно обратиться именно к нам?
Python SciPy
Основные особенности языка
Python – интерпретируемый язык программирования. Это значит, что исходный код частями преобразуется в машинный в процессе его чтения специальной программой – интерпретатором.
Python характеризуется ясным синтаксисом. Читать код на нем легче, чем на других языках программирования, т. к. в Питоне мало используются такие вспомогательные синтаксические элементы как скобки, точки с запятыми. С другой стороны, правила языка заставляют программистов делать отступыдля обозначения вложенных конструкций. Понятно, что хорошо оформленный текст с малым количеством отвлекающих элементов читать и понимать легче.
Python – это полноценный во многом универсальный язык программирования, используемый в различных сферах. Основная, но не единственная, поддерживаемая им парадигма, – объектно-ориентированное программирование. Однако в данном курсе мы только упомянем об объектах, а будем изучать структурное программирование, так как оно является базой. Без знания основных типов данных, ветвлений, циклов, функций нет смысла изучать более сложные парадигмы, т. к. в них все это используется.
Интерпретаторы Python распространяется свободно на основании лицензии подобной GNU General Public License.
Позволяет производить ввод данных в консоли.
Описание:
Функция позволяет обеспечить ввод пользовательских данных из консоли. Если передан необязательный аргумент подсказки , то он записывается в стандартный вывод без завершающей строки. Затем функция читает строку из ввода и преобразует ее в СТРОКУ, убирая завершающий символ строки и возвращает ее в качестве значения.
Другими словами, все что вводится в консоль при использовании встроенной функции преобразуется в тип . Это происходит в том числе и с числами. Следовательно, числовые данные, перед их использованием необходимо распознавать и преобразовывать к нужным типам.
Если был импортирован модуль , то функция будет использовать его для обеспечения сложных функций редактирования строк и истории.
- В случае считывания (признак конца файла), поднимается исключение .
- Перед чтением ввода, функция вызывает событие аудита с аргументом .
- После успешного чтения ввода, вызывает событие аудита c результатом .
Решение задач
1. Поэкспериментируйте с переводом в различные типы данных
2. Пользователь вводит свое имя и фамилию. Выведите:
Hello, имя фамилия
# На месте слов с % должны быть введенные данные
3. Посчитайте сумму трех введенных целых чисел
4. Посчитайте сумму трех введенных дробных чисел. Подумайте в какой тип данных нужно преобразовать значение, возвращенное функцией input
5. Дано число, выведите предыдущее и следущее за ним числа в таком формате:
# Число равно 10
Число предшествующее числу 10 равно 9
Число следующее за числом 10 равно 11
6. Вводятся имя и возраст. Выведите, где введенное имя = Максим, а возраст = 20
Привет, Максим! Ваш возраст равен 20!
А как сделать резервное копирование всех моих настроек?
Функция range()
Теперь пришло время познакомиться со встроенной в Python функцией range(). «Range» переводится как «диапазон». Она может принимать один, два или три аргумента. Их назначение такое же как у функции randrange() из модуля random. Если задан только один, то генерируются числа от 0 до указанного числа, не включая его. Если заданы два, то числа генерируются от первого до второго, не включая его. Если заданы три, то третье число – это шаг.
Однако, в отличие от randrange(), функция range() генерирует не одно случайное число в указанном диапазоне. Она вообще не генерирует случайные числа. Она генерирует последовательность чисел в указанном диапазоне. Так, range(5, 11) сгенерирует последовательность 5, 6, 7, 8, 9, 10. Однако это будет не структура данных типа «список». Функция range() производит объекты своего класса – диапазоны:
>>> a = range(-10, 10) >>> a range(-10, 10) >>> type(a) <class 'range'>
Несмотря на то, что мы не видим последовательности чисел, она есть, и мы можем обращаться к ее элементам:
>>> a -10 >>> a -5 >>> a 5 >>> a 9
Хотя изменять их нельзя, так как, в отличие от списков, объекты range() относятся к группе неизменяемых:
>>> a = 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'range' object does not support item assignment
Зачем это нужно
Цель — указать разработчику на ожидаемый тип данных при получении или возврате данных из функции или метода. В свою очередь, это позволяет сократить количество багов, ускорить написание кода и улучшить его качество.
Допустим, у вас есть класс юзера и функция, которая преобразует json в .
Конечно, можно написать и проще:
Однако, в обоих случаях может возникнуть ошибка, если ключ будет присутствовать и при этом иметь строковый тип. Валидация типов добавляет не очень много строк кода, но при большом количестве моделей может занимать немало места в проекте.
Использование Pydantic помогает корректно валидировать данные, при этом тип автоматически поменяется на требуемый.
Как можно заметить, более строгая типизация кода помогает сделать его проще и безопаснее. Однако, использование некоторых возможностей Pydantic может нежелательно повлиять на код. Так, мутация данных при валидации способна привести к тому, что тип значения модели будет непонятен. Например:
В данном примере созданный User после валидации будет иметь отличный от того, который был указан в модели. Это ведет к возможным крупным багам, которые лучше всегда избегать.
Также сейчас набирает большую популярность фреймворк FastAPI, который, благодаря Pydantic, позволяет быстро писать веб-приложения с автоматической валидацией данных.
В данном примере эндпоинт /item автоматически валидирует входящий json и передает его в функцию как требуемую модель.
Также для уменьшения количества багов используют mypy, который позволяет проводить статический анализ кода на соответствие типов. За счет этого зачастую можно избежать очевидных багов или несоответствий типов в функциях.
И как бонус для тех, кто ленится вручную поддерживать типизацию. дает возможность автоматически проставить типы во всех функциях, хотя после запуска этой программы обычно требуется пройтись по коду и поправить некоторые значения, которые оказались распознаны не так, как предполагалось.
Переменные
Данные хранятся в ячейках памяти компьютера. Когда мы вводим число, оно помещается в какую-то ячейку памяти. Но как потом узнать, куда именно? Как впоследствии обращаться к этим данными? Нужно как-то запомнить, пометить соответствующую ячейку.
Раньше, при написании программ на машинном языке, обращение к ячейкам памяти осуществляли с помощью указания их регистров, т. е. конкретно сообщали, куда положить данные и откуда их взять. Однако с появлением ассемблеров при обращении к данным стали использовать словесные переменные, что куда удобней для человека.
Механизм связи между переменными и данными может различаться в зависимости от языка программирования и типов данных. Пока достаточно запомнить, что в программе данные связываются с каким-либо именем и в дальнейшем обращение к ним возможно по этому имени-переменной.
Слово «переменная» обозначает, что сущность может меняться, она непостоянна. Действительно, вы увидите это в дальнейшем, одна и та же переменная может быть связана сначала с одними данными, а потом – с другими. То есть ее значение может меняться, она переменчива.
В программе на языке Python, как и на большинстве других языков, связь между данными и переменными устанавливается с помощью знака =. Такая операция называется присваивание (также говорят «присвоение»). Например, выражение sq = 4 означает, что на объект, представляющий собой число 4, находящееся в определенной области памяти, теперь ссылается переменная sq, и обращаться к этому объекту следует по имени sq.
Имена переменных могут быть любыми. Однако есть несколько общих правил их написания:
-
Желательно давать переменным осмысленные имена, говорящие о назначении данных, на которые они ссылаются.
-
Имя переменной не должно совпадать с командами языка (зарезервированными ключевыми словами).
-
Имя переменной должно начинаться с буквы или символа подчеркивания (_), но не с цифры.
-
Имя переменной не должно содержать пробелы.
Чтобы узнать значение, на которое ссылается переменная, находясь в режиме интерпретатора, достаточно ее вызвать, т. е. написать имя и нажать 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.
Новый способ форматирования — метод format()
Строковый метод format() возвращает отформатированную версию строки, заменяя идентификаторы в фигурных скобках. Идентификаторы могут быть позиционными, числовыми индексами, ключами словарей, именами переменных.
Аргументов в format() может быть больше, чем идентификаторов в строке. В таком случае оставшиеся игнорируются.
Идентификаторы могут быть либо индексами аргументов, либо ключами:
>>> "{}, {} and {}".format('one', 1, 'I') 'one, 1 and I' >>> "{1}, {2} and {0}".format('one', 1, 'I') '1, I and one'
>>> nums = 3, 4, 5, 6, 2, >>> "{}{}{}".format(*nums) '345' >>> "{0}{2}{4}".format(*nums) '352'
>>> u = {'name':'bob','age':35} >>> '{name}-{age}'.format(**u) 'bob-35' >>> '{name}'.format(**u) 'bob' >>> '{name}-{age}'.format(name="pi",age=3.14) 'pi-3.14' >>> '{0}-{age}'.format("sin",**u) 'sin-35'
Вывод атрибутов объекта:
>>> class house: size = "big" street = "main" >>> h = house() >>> '{0.size}, {0.street}'.format(h) 'big, main'
Можно задавать ширину поля и выравнивание:
>>> '{name:10}-{age:3}'.format(**u) 'bob - 35' >>> '{name:>10}-{age:>3}'.format(**u) ' bob- 35' >>> '{name:^10}-{age:^3}'.format(**u) ' bob -35 '
Вывод вещественных чисел:
>>> '{0}'.format(4/3) '1.3333333333333333' >>> '{0:f}'.format(4/3) '1.333333' >>> '{0:.2f}'.format(4/3) '1.33' >>> '{0:10.2f}'.format(4/3) ' 1.33' >>> '{0:10e}'.format(4/3) '1.333333e+00'