Как создать пустую переменную в python
Перейти к содержимому

Как создать пустую переменную в python

  • автор:

None (null), или немного о типе NoneType

Python 3 логотип

Ключевое слово null обычно используется во многих языках программирования, таких как Java, C++, C# и JavaScript. Это значение, которое присваивается переменной.

Концепция ключевого слова null в том, что она дает переменной нейтральное или «нулевое» поведение.

А что же в Python?

Эквивалент null в Python: None

Он был разработан таким образом, по двум причинам:

Многие утверждают, что слово null несколько эзотерично. Это не наиболее дружелюбное слово для новичков. Кроме того, None относится именно к требуемой функциональности — это ничего, и не имеет поведения.

Присвоить переменной значение None очень просто:

Существует много случаев, когда следует использовать None.

Часто вы хотите выполнить действие, которое может работать либо завершиться неудачно. Используя None, вы можете проверить успех действия. Вот пример:

Python является объектно-ориентированным, и поэтому None - тоже объект, и имеет свой тип.

Проверка на None

Есть (формально) два способа проверить, на равенство None.

Один из способов — с помощью ключевого слова is.

Второй — с помощью == (но никогда не пользуйтесь вторым способом, и я попробую объяснить, почему).

Посмотрим на примеры:

Данный код выведет:
Отлично, так они делают одно и то же! Однако, не совсем. Для встроенных типов - да. Но с пользовательскими классами вы должны быть осторожны. Python предоставляет возможность переопределения операторов сравнения в пользовательских классах. Таким образом, вы можете сравнить классы, например, MyObject == MyOtherObject.
И получаем немного неожиданный результат:
Интересно, не правда ли? Вот поэтому нужно проверять на None с помощью ключевого слова is.

А ещё (для некоторых классов) вызов метода __eq__ может занимать много времени, и is будет просто-напросто быстрее.

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Ввод в пустую переменную из input

Это всё - вторая команда в вашем вопросе ( a = "" ) бы только уничтожила только что принятую информацию 'Володя' .

Да, вы теперь можете хотеть проверить, какое значение в переменной a , и так можете после команды input('Задайте ваше имя: ') писать как следующую команду

print(a) 

и получите соответственный вывод, в нашем примере

Володя 

Отслеживать
ответ дан 30 июл 2018 в 19:03
16.6k 4 4 золотых знака 21 21 серебряный знак 31 31 бронзовый знак

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,092 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 для начинающих

Строка — это тип данных, предназначенный для работы с текстом. Чтобы создать строку в Python, нужно использовать одинарные или двойные кавычки. Для многострочных строк можно использовать тройные кавычки (тоже одинарные или двойные).

first = 'Привет, мир!'
second = "Привет, мир!"
third = """У лукоморья дуб зелёный,
златая цепь на дубе том."""

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

name = input('Введите свое имя')
greeting = "Привет, " + name
print(greeting)

При запуске такой программы пользователь получит приглашение ввести свое имя и как только он это сделает, набрав на клавиатуре и нажав клавишу «Ввод», в переменную name будет записано имя, которое он ввел.

Во второй строке программы есть знакомый нам оператор «+». С его помощью две строки склеиваются в одну. В программировании такая склейка строк называется конкатенацией.

Третья строка выведет приветствие и имя на экран. То есть, если пользователь введет имя «Василий», на экран будет выведено

Привет, Василий

Строки могут быть пустыми, то есть не иметь внутри себя ни одного символа. Пробел — это такой же символ, как и все остальные и эти две строки не равны.

a = "" # пустая строка
b = " " # строка, состоящая из одного пробела

Для того чтобы получить длину строки, нужно использовать встроенную в Python функцию len. Эта программа, например, выведет на экран длину текста, который введет пользователь

string = input('Введите любой текст')
a = len(string)
print(a)

Python с нуля. Освойте с Виртуальным ИИ-помощником!

Неинициализированное состояние переменной

Из серии "за что мне нравится 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 и подкладывает засаду

Кому как. Мне лично - "приятно". Потому что часто это позволяет сэкономить код. А чтобы не было засад, нужно пользоваться операторами === и !==

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

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