{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Программирование для всех (основы работы в Python)\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "## Типы переменных и преобразование типов. Ввод и вывод.\n", "\n", "### Типы переменных и преобразование типов\n", "\n", "Типы переменных (не путать с *data types* и *data scales*):\n", "\n", "* числовой с плавающей точкой (*float*);\n", "* целочисленный (*integer*);\n", "* строковый или текстовый (*string*);\n", "* логический или булев (*boolean*): только два значения `True` и `False`.\n", "\n", "Посмотрим, как определить тип переменной (функция `type()`):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "float" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 2.34\n", "type(x)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "int" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = 5\n", "type(y)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "str" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "name = \"Alla\"\n", "type(name)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "bool" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Иногда требуется преобразовать тип переменной, например, из числа с плавающей точкой сделать целое число. Зачем это бывает нужно? Для удобства и для более корректной выдачи результатов. Например, у нас есть база данных по респондентам, в которой указан их год рождения, и мы хотим добавить столбец с возрастом респондентов (числом полных лет). Из-за того, что кто-то ввел год в виде 1993.0, возраст при вычислениях тоже получится числом с плавающей точкой — 25.0. Так как мы знаем, что возраст всегда будет целым, чтобы дробная часть не смущала, можно привести все значения к целочисленному типу." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int(25.0) # int - от integer" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int(\"23\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'45'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(45) # str - от string" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "23.56" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float(\"23.56\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Однако, если преобразование невозможно, Python выдаст ошибку (а точнее, исключение `ValueError`, про исключения поговорим позже):" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "could not convert string to float: '23,56'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"23,56\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: could not convert string to float: '23,56'" ] } ], "source": [ "float(\"23,56\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так как запятая в Python не воспринимается как десятичный разделитель (в качестве разделителя используется точка), превратить строку `'23,56'` в число не получится, нужно будет сначала заменить запятую на точку. Как работать со строками, мы обсудим позже, но если интересно, можно сделать следующее: создать любую строковую переменную, а потом после её названия поставить точку и нажать *Tab*. Так же, как и в случае с модулем `math`, выпадет список всех возможных методов, которые можно применять к строке." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ввод и вывод\n", "\n", "Иногда возникает необходимость запросить какую-нибудь информацию у пользователя — попросить ввести её с клавиатуры. Это может быть нужно, например, когда мы пытаемся имитировать заполнение какой-нибудь формы (собрать информацию и обработать) или написать функцию, которая будет работать по-разному в зависимости от режима (\"Если хотите выгрузить данные из файла, нажмите 1, если хотите вводить данные вручную, введите 2\").\n", "\n", "Запросить данные с клавиатуры можно с помощью функции `input()`:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter something:something\n" ] } ], "source": [ "s = input(\"Enter something:\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "something\n" ] } ], "source": [ "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте рассмотрим ещё один пример и запросим у пользователя его возраст:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter your age: 26\n" ] } ], "source": [ "age = input(\"Enter your age: \")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'26'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "age" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Введенное нами значение сохранилось. Однако, если посмотреть внимательнее, это не совсем число: число пять стоит в кавычках. Это строка! То есть обычный текст. Проверим:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "str" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(age) # действительно" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Тут нам как раз и пригодится преобразование типов переменных:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter your age: 26\n" ] } ], "source": [ "age = int(input(\"Enter your age: \"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь все правильно, с `age` можно работать как с числом:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "int" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(age)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В заключение рассмотрим пример с вводом двух чисел с новой строки (необязательно целых). Сохраним введенные пользователем числа в переменные `A` и `B`, а потом выведем на экран их сумму и разность в одну строку:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter a number: 9.6\n", "Enter a number: 5.1\n", "Sum:\t14.7\tDifference:\t4.5\n" ] } ], "source": [ "A = float(input(\"Enter a number: \"))\n", "B = float(input(\"Enter a number: \"))\n", "print(\"Sum:\", A + B, \"Difference:\", A - B, sep=\"\\t\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде выше в функции `print()` мы задействовали аргумент `sep`. Это разделитель, который отделяет элементы в строке, выводимой с помощью `print()`. Как мы видели, по умолчанию функция `print()` выводит все элементы через пробел. Другими словами, значение `sep` по умолчанию — это `\" \"`. В этом примере мы записали `\\t`, это специальный символ для табуляции, отступа в четыре пробела. Но вообще символ в `sep` может быть любым. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }