Ввод, вывод и переменные в python
В прошлой главе мы научились использовать питон для повседневных математических вычислений, вводя команды по одной. Это называется режимом консоли, или интерактивным режимом. Но с увеличением размера программы, писать код по одной строчке становится неудобно, гораздо проще написать программу целиком (или создать скрипт), а затем при необходимости запускать.
Традиционно, первой программой на любом языке программирования становится «Hello, world!». Такая программа просто запускается и говорит миру — «привет!».
Чтобы написать нашу первую программу, зайдите в меню IDLE и смело выбирайте File -> New File . В появившемся новом пустом окне введите команду:
print("Hello, world!")
Затем нажмите Run -> Run Module и сохраните ваш файл в удобном для вас месте на диске. Лучше всего сделать отдельную папку для программирования и в ней отдельные подпапки для каждой главы. Результат работы программы появится в основном окне IDLE.
Вау! Ты только что написал свою первую программу!
Используем print для вывода информации
Для вывода данных в питоне используется команда print . Как и после любой команды, после print ставятся круглые скобочки, а в них — аргумент этой команды — строка или число, которые надо вывести.
Одна команда — одна строка. Если на одной строке (одной командой) нужно вывести несколько чисел, строк или переменных, их нужно разделять запятыми.

print("Можно выводить код на разных строках!") print("Очень удобно! А еще можно сделать пустую строку. ") print("") print(100 + 1, "долматинец", " - можно разделять части вывод")
Можно выводить код на разных строках! Очень удобно! 101 долматинец - можно разделять на части вывод
Для тренировки, попробуй написать программу, которая выводит на экран ваше имя и три твоих любимых фильма (или сериала/группы/книги. ). Главное, чтобы текст был на разных строках.
Переменные в python
Как вы помните, если мы хотим что-то временно сохранить, нам нужна переменная.
Переменная — это именованный участок оперативной памяти, предназначенный для хранения значения определенного типа (целое число / действительное число / текст. ). В прочем, питон сам определяет тип переменной, вам нужно указать только ее имя.
Для создания переменной нужно просто написать ее имя и что-либо в нее положить, для чего используется оператор присваивания ( = ).

name = "Ростислав" print("Меня зовут ", name, ".")
Меня зовут Ростислав.
Названия переменных могут состоять из латинских букв и цифр, а также символа _ , но не могут начинаться с цифры.
Формально, можно использовать и русские символы, но так обычно не делают. Обрати внимание, в коде выше, чтобы вывести текст, мы выделили его в кавычки, а чтобы переменную — написали ее имя без кавычек.
Кавычки могут быть как «двойными» , так и ‘одинарными’ , главное чтобы в начале и в конце текста стояли одинаковые кавычки.
Используем input для общения с пользователем
Для ввода данных используется команда (а правильней — функция) input . В качестве аргумента она принимает поясняющий текст, а результат возвращает в виде строки.

number = input('Сколько котов вы хотите купить? ') print('Отгружаем вам ', number, "котов!")
Сколько котов вы хотите купить? 40 Отгружаем вам 40 котов!
Если ввести нужно числа, а не строку (т.е. проводить с результатами операции, как с числами):, то результат надо преобразовать в число.

Код:
width = int(input('Введите ширину участка: ')) height = int(input('Введите высоту участка: ')) print('Площадь: ', width * height)
Результат:
Введите ширину участка: 20 Введите высоту участка: 5 Площадь: 100
Аналогично с помощью функции str можно преобразовать число в строку. Но, погодите, зачем это нужно? Что будет, если не использвоать int ? Попробуй запустить вот этот код.
s = input() print(s * 10)
Результат:

Что произошло?! Ведь 10 на 10 — это 100, а совсем не то, что выдал питон! А если вот так?
s = input() print(s + 10)

Кажется, мы только что получили нашу первую ошибку времени выполнения. Не пугайся, в работе даже самых опытных программистов это случается постоянно. Главное уметь отлавливать их и исправлять до того, как программа попадет к пользователю.
Текст ошибки может быть очень длинным, но на самом деле пока нам важна только последняя строка TypeError: can only concatenate str (not «int») to str . Если попробовать перевести ее в переводчике, получится что-то вроде Ошибка типа: можно соединять только str (строки) и str (строки), но не «int» (это целое число). .
Дело в том, что по-умолчанию питон считает, что мы вводим именно строку. Именно поэтому при умножения десятка повторилась 10 раз, а не умножилась на 10, а при сложении вообще все сломалось. Чтобы работать с введенными данными, как с числами, их нужно превратить в числа.
s = int(input()) print(s + 10)
Теперь все будет работать как задумано. Кстати, а попробуй сложить две строки, будет работать? Для тренировки напиши программу, которая спрашивает у пользователя, как его зовут, а потом здоровается с ним по имени.
Как вас зовут? Ростислав Добрый вечер, Ростислав!
| Что выводит программа? | Что нужно ввести? |
|---|---|
| Как вас зовут? Добрый вечер, Инна! |
Инна |
| Как вас зовут? Добрый вечер, Павел! |
Павел |
Доступные операции с переменными
В предыдущей главе мы с вами применяли математические операции к числам, в те же операции мы можем применять к переменным.
a = 10 # теперь в переменной a лежит число 10 b = 20 # а в переменной b лежит число 20 a = a + 5 # a теперь равно 15 a = a + b # a равно 35 a = a - 20 # a равно 15 a = a * 2 # a равно 30 a = b / 2 # a равно 10.0 b = a % 4 # b равно 2, этот оператор возвращает остаток от деления a = a // 3 # целочисленное деление, а рано 3 b = b ** 3 # возведение в степень, b равно 8
Используя эти операции, а также функции input и print , решите задачи, приведенные в этом разделе.
Создаем линейный квест
Кажется, сейчас у нас есть все, чтобы создать линеный квест!
В качестве примера линейного квеста давай сделаем что-то забавное. Попробуй написать программу, которая спрашивает какую-либо информацию про пользователя, а затем рассказывает про него шутку.
Между частями шутки для пущего эффекта можно добавить ожидание нажатия книпки Enter. Для этого можно использовать пустой input() , достаточно просто вызвать эту функцию не сохраняя результат.

Кстати, для нагнетения обстановки можно вместо нажатий Enter добавить задержку. Например, персонаж какое-то время пытается открыть дверь или ожидается итог напряженной схватки. Сделать это можно, используя встроенный модуль time (мы с тобой уже знакомы с модулем math ). Пример его использования ниже.
import time print("Сейчас будет перерыв 10 секунд.") time.sleep(10) print("10 секунд прошло, работаем дальше. ")
Попробуй оба варианта, сначала с input(), а потом с задержками. Как только заработает, можно смело хвастаться, что у тебя получился линейный квест!
Ввод в пустую переменную из input
Это всё — вторая команда в вашем вопросе ( a = «» ) бы только уничтожила только что принятую информацию ‘Володя’ .
Да, вы теперь можете хотеть проверить, какое значение в переменной a , и так можете после команды input(‘Задайте ваше имя: ‘) писать как следующую команду
print(a)
и получите соответственный вывод, в нашем примере
Володя
Отслеживать
ответ дан 30 июл 2018 в 19:03
16k 4 4 золотых знака 19 19 серебряных знаков 30 30 бронзовых знаков
from colorama import init, Fore, Back, Style import win32console win32console.PyConsoleScreenBufferType(win32console.GetStdHandle(\ win32console.STD_OUTPUT_HANDLE)) # p = _ p.SetConsoleFont(8) init(convert=True) class GuessNumber: winner = False number = int def __init__(self): print(Style.BRIGHT + Fore.GREEN +"Угадай число от 0 до 20, у тебя три попытки") print("-------------------------------------------") self.game() def rnd(self): self.random_number = randrange(0, 20, 1) def check(self, num): self.number = num if self.number == self.random_number: self.winner = True else: return def game(self): count = 0 self.rnd() while True: count += 1 print(count, "попытка") user_number = int(input("Введите число:")) print("----------------------") self.check(user_number) if count == 3: print("К сожалению ты проиграл :(") print("Компьютер загадал число", self.random_number) input("Для выхода нажмите ENTER") break if self.number > self.random_number: print("Загаданое число меньше") elif self.number < self.random_number: print("Загаданое число больше") if self.winner: print("Ура ты победил. ") print("Компьютер загадал число", self.random_number) input("Для выхода нажмите ENTER") break def main(): app = GuessNumber() if __name__ == "__main__": main()
Отслеживать
ответ дан 4 авг 2018 в 11:34
3,005 2 2 золотых знака 14 14 серебряных знаков 22 22 бронзовых знака
Обратный слеш для разрыва строки внутри скобок не нужен. Т.е. без обратного слеша будет работать.
4 авг 2018 в 14:14
Это для сайта при вставке кода)
4 авг 2018 в 15:10
a = [] while True: c = input('Как вас завут: ') b = input('\nПродолжить да & нет: ') a.append(c) if b == 'нет': break if b == 'да': print(c) else: print(c, b)
Отслеживать
ответ дан 31 июл 2018 в 7:30
11 4 4 бронзовых знака
Хотелось бы отметить, что в питоне нет переменных, как таковых. Когда вы пишете код вроде:
>>> a = 5
Вы создаете ссылку "a" на объект 5. Также, в питоне нет "пустых" переменных.
>>> a = "" # Это создаст объект пустой строки. >>> type(a)
>>> x = 5 # Инициализация объекта 5 >>> y = "" # Инициализация объекта пустой строки >>> y = x # Создание дополнительной ссылки на объект 5 >>> y 5
Если вы хотите создать копию объекта, а не ссылку на него, воспользуйтесь модулем copy. За дополнительной информацией о модуле copy посмотрите: https://docs.python.org/3.7/library/copy.html
Метод input('Необязательное праглашение ввода:') автоматически создает объект типа str. Но его можно преобразовать в int: int(input('Необязательное праглашение ввода:')) . И так как это обычный объект первого класса, его можно передавать в качестве аргумента без создание ссылки на него:
>>> for i in range(int(input('enter number of iterations: '))): . print(i) . enter number of iterations: 5 0 1 2 3 4 >>>
Ссылку на объект нужно создавать в том случае, если этот объект используется в коде много раз. Ну или по ситуации.
Неинициализированное состояние переменной
Из серии "за что мне нравится Python". Сегодня сформулировал у себя в голове еще одну приятную штуку.
Часто бывает нужно, чтобы у переменной какого-то типа было "никакое" или "неопределенное" значение. Скажем, еще непосчитанное количество, заданное int'ом или время создания объекта, который еще до конца не создан, заданное timestamp'ом.
В языке со статическим типизированием у элементарных типов (целое, дата/время) таких специальных значений нет, и чтобы это обойти есть, в общем-то, всего два подхода:
- Если вы используете не все значения типа, то можно зарезервировать какое-то из значений для показывания неопределенности. Например значение "-1" для количества, которое должно быть неотрицательным или "31.12.1899" для даты. Минусов у этого решения я усматриваю два. Во-первых, ухудшается читаемость кода: везде, где вы встречаете " if(x!=-1) " мозгу приходится разрешать лишнюю абстракцию, вспоминая, что "-1" в данном случае означает неопределенность". Хотя это можно обойти заданием константы с понятным именем. Второй минус более синий. Поскольку компилятор не в курсе, что это значение особенное, он будет продолжать с ним работать без всяких ошибок. Скажем, сложит известное количество с неизвестным. * Второй способ, более безопасный — сделать отдельный маленький класс, который будет хранить значение нужного типа, а также признак инициализированности. И при всех попытках прочитать значение сначала проверять этот признак и если надо, выкидывать exception. Недостаток этого способа заключается в простом неудобстве. Придется наверняка делать у этого класса некий метод доступа "value()", в котором будут идти проверки, и вместо " x=y+z " писать что-то вроде " x.value=y.value+z.value ". Кроме того, в зависимости от языка, еще придется заботиться об управлении памятью, о том, что классы передаются по умолчанию по ссылке, а не по значению. Ну и кроме того, сам класс, не несущий никакой творческой нагрузки, просто загромождает код.
А что же нам предлагает Python. Поскольку у переменной нет привязки к типу, то любой переменной в любой момент можно назначить значение None (аналог NULL'а, Nil'а). А потом, когда надо, присвоить ей нужное реальное значение. В итоге:
- Значение None четко означает отсутствие значения.
- Проверки красиво читаются:
if not create_date: create_date=datetime.today()
Вот так все логично и лаконично.
Комментарии: 14
Не буду разводить здесь Вашу нелюбимую дискуссию, но мне за тот же null (и не только) нравится PHP. 🙂
Иван Сагалаев
Оне не моя нелюбимая :-). Я просто не знаю PHP настолько близко, чтобы о нем внятно много говорить. Однако, что я таки про него знаю — это то, что там типизация не только динамическая, но и свободная (loose). Свободная в том смысле, что типы в выражении всегда по возможности приводятся к чему-то общему. И в PHP можно сделать так:
$i=5; $n=null; echo $i + $n; //выдаст 5
То есть можно свободно использовать неинициализированную переменную в выражениях. Питон принципиально отличается тем, что типизация динамическая, но строгая (strict). Если переменной дано значение какого-то типа, то как раз у значения этот тип реально есть, и он не будет автоматически приводиться к любому другому типу. Например аналогичный примеру код на Питоне ругнется exception'ом. Надо еще сказать, что в Питоне по этому поводу нет никакой догмы вроде "никогда ничего не приводить". Тут скорее руководствуются чисто практическим аспектом: делать то, что логично в данном случае. Так например кое что с None все-таки можно делать. Например, сравнивать с целыми и строками (но не с датой). И для своих собственных типов пользователь тоже может сам определить результаты операция с None.
if not s это крайне неудачная конструкция - слишком много в мире вещей, которые приводятся к False. Например, нельзя отличить s="" и s=None Так что никуда не денешься, придётся писать if s==None Кстати, и в питоне, и в php есть другое решение - совсем не объявлять неинициализированную переменную. Попросту del её. if "a" in locals(): // делать что-то с a else: // делать что-то без а Или даже
try: // делать что-то с a except NameError: // делать что-то без а
Иван Сагалаев
Согласен, " if not s " может быть неудачной (хотя и не всегда). В любом случае, явная проверка на None (" if s==None " или даже красивей " if s is None ") все же гораздо лучше, чем проверка на что-то другое. Но вот решения с "in locals()" или exception'ом я бы не приветствовал :-). Во-первых просто громоздко, а во-вторых они, опять-таки, уводят от прямого сообщений "переменной нет" к некой ширме "это означает, что переменной нет".
В PHP действительно нет строгой типизации. Имея какой-никакой опыт в программирповании думаю, что это чаще плохо, чем хорошо. Поскольку оболтусы называющие себя Программистами, даже не догадываясь что существуют некие понятия о хорошем и плохом стиле программирования, выдают такой грязный код, который работает только до первого внесения изменений в него. И отсутствие строгой типизиции в PHP усугубляет ситуацию. По поводу же значений Null и их поведения в операциях в PHP - все сказано в документации. Нужно иногда ее читать. Это особенность, о которой все известно, ну или почти все :). А кому неизвестно - это его проблемы. Тем более, что приведенный пример ярко демонстрирует возможности языка и небезопасный стиль программирования. Если полагаться только на типизацию, то человеческий фактор все равно может сыграть свою негативную роль.
P.S. Если переменной присвоено значение null - она, строго говоря, инициализирована. Ее можно проверить is_null(). И существование переменной тоже можно проверить. Это работа программиста.
уводят от прямого сообщений “переменной нет” к некой ширме “это означает, что переменной нет”.
Наоборот 🙂 Присваивание None/null это не более, чем конвенция, может быть, более удобная, чем присваивание -1. Если переменной нет - пусть её не будет и в namespace. Ну да, in locals() это немного уродливо, но ведь никто не мешает сделать функцию. В php из-за его свободной типизации этот вариант даже предпочтительней: если $n не объявлено, echo $n +1; просто вылетит, проверка isset() абсолютно прозрачна.
Иван Сагалаев
Конечно конвенция. Но это стандартизованная конвенция, и потому всем очевидная. Поэтому-то мне и кажется, что менее читаемые варианты все же ничем не выигрывают. P.S. Как приятно — такая маленькая тема, а так подробно в комментариях раскрывается :-). Большое всем спасибо!
По моему, инициализировать переменные нужно всегда. И инициализировать их так, что б не было больно при возможных проблемах. Будущий массив инитить пустым массивом, строку - пустой строкой, int - нулем, коэффициент - 1, и так далее.
Тогда не будет проблем и в php с его приведением типов, и в python.
$i=5;
$n=null;
echo $i + $n; //выдаст 5
А как, тогда, насчёт такого примера (как уже упомянул CR): $i=5;
unset ($n):
echo $i +$n; // выдаст 5 и ругнется на неинициализированную переменную Проверять $n на никакое значение можно так: if (isset($n)) <. >else <. >// isset() не ругается а молча делает своё дело
Лучше так:
echo (isset($n))?$i+$n:"blabla";
Ну что же, давайте пофлеймим. а) чего -то я не пойму а если в Java делается return ; то что же возвращается? Не иначе как тот самый Null только в "обертке". Так что причем тут Питон не пойму. б) - ну и про наше любимое В Руби вообще нельзя использовать переменную до ее определения (если только это не свойство обьекта - тогда оно будет nil)
class Dummy def value @val end end Dummy.new.value # вернет nil
а поскольку в контексте функции доступны методы и переменные то первая же попытка использовать "ни то ни другое" вызовет ошибку подобную питоновской. А дальше вот начинается типа правильная штука. Любой обьект отвечает на простейшее сообщение nil?
nil.nil? # true 3.nil? # false
причем это совершенно не то же самое что empty($var). Потому что для этого есть "empty?" (но на него не отвечает nil)! Более того, когда например массив очищается от nil'ов методом compact! ваш собственный обьект тоже спросят "а не nil? ли ты?" Дабы получить традиционное PHP-поведение в рельсах добавлен метод blank?
nil.blank? # true ''.blank? # true и тд ' '.blank? # true, ага? 'foo'.blank? # false
По поводу "красиво читаются" это даааа. (я очень полюбил unless, until и пр.)
@creation_date = Date.today unless @creation_date
Поскольку Рубин довольно строгий в булях ВСЕ кроме false и nil приводится к true. А вот в PHP с этим забавно (и неприятно) потому что к false приводятся и пустой массив, и пустая строка и integer-ноль. что messy и подкладывает засаду
Max Ischenko
Согласен, только я всегда использую "if foo is [not] None", даже когда в этом нет прямой необходимости (как в случае с датами). Это ИМХО делает код яснее.
А вот в PHP с этим забавно (и неприятно) потому что к false приводятся и пустой массив, и пустая строка и integer-ноль… что messy и подкладывает засаду
Кому как. Мне лично - "приятно". Потому что часто это позволяет сэкономить код. А чтобы не было засад, нужно пользоваться операторами === и !==
Строки в Python для начинающих
Строка — это тип данных, предназначенный для работы с текстом. Чтобы создать строку в Python, нужно использовать одинарные или двойные кавычки. Для многострочных строк можно использовать тройные кавычки (тоже одинарные или двойные).
first = 'Привет, мир!'second = "Привет, мир!"third = """У лукоморья дуб зелёный,златая цепь на дубе том."""
Было бы довольно скучно, если все строки в программе можно было бы создавать только в исходном коде. К счастью, в Python есть такая функция, как input. С ее помощью можно получить строку от пользователя.
name = input('Введите свое имя')greeting = "Привет, " + nameprint(greeting)
При запуске такой программы пользователь получит приглашение ввести свое имя и как только он это сделает, набрав на клавиатуре и нажав клавишу «Ввод», в переменную name будет записано имя, которое он ввел.
Во второй строке программы есть знакомый нам оператор «+». С его помощью две строки склеиваются в одну. В программировании такая склейка строк называется конкатенацией.
Третья строка выведет приветствие и имя на экран. То есть, если пользователь введет имя «Василий», на экран будет выведено
Привет, Василий
Строки могут быть пустыми, то есть не иметь внутри себя ни одного символа. Пробел — это такой же символ, как и все остальные и эти две строки не равны.
a = "" # пустая строкаb = " " # строка, состоящая из одного пробела
Для того чтобы получить длину строки, нужно использовать встроенную в Python функцию len. Эта программа, например, выведет на экран длину текста, который введет пользователь
string = input('Введите любой текст')a = len(string)print(a)
