- Python Tips, Tricks, and Hacks (часть 3)
- 4. Выбор значений
- 5. Функции
- Значения true, false, null пример
- Подробно о true, false, null
- Что такое false и true
- Чтобы понять, что такое false и true проделаем пару манипуляций!
- Теперь сравним 1 и true.
- Вывод о «0» и «false»
- Вывод о типах «0» и «false»
- Вывод о «1» и «true»
- Проверим переменные на true.
- Проверим число 1 на true.
- Результат проверки числа на true
- Проверим число 0 на true.
- Тип Boolean, логические операторы и операторы сравнения
- Значения Boolean
- Функция Boolean()
- Все имеет «значение» True или False
- Значения типа Boolean могут быть объектами
- Логические операторы и операторы сравнения
- Операторы сравнения
- Условный (тернарный) оператор
- Сравнение разных типов
Python Tips, Tricks, and Hacks (часть 3)
4. Выбор значений
4.1. Правильный путь
Начиная с версии 2.5, Python поддерживает синтаксис «value_if_true if test else value_if_false». Таким образом, вы можете выбрать одно из двух значений, не прибегая к странному синтаксису и подробным пояснениям:
Увы, это всё еще немного некрасиво. Вы также можете использовать несколько таких конструкций в одной строке:
Сначала выполняется первый if/else, а если test1 = false, выполняется второй if/else. Вы можете делать и более сложные вещи, особенно если воспользуетесь скобками.
Этот способ весьма новый, и я испытываю к нему смешанные чувства. Это правильная, понятная конструкция, она мне нравится… но она всё еще уродлива, особенно при использовании нескольких вложенных конструкций. Конечно, синтаксис всех уловок для выбора значений некрасив. У меня слабость к описанному ниже способу с and/or, сейчас я нахожу его интуитивным, сейчас я понимаю, как он работает. К тому же он ничуть не менее эффективен, чем «правильный» способ.
Хотя инлайновый if/else — новый, более правильный способ, вам всё же стоит ознакомиться со следующими пунктами. Даже если вы планируете использовать Python 2.5, вы встретите эти способы в старом коде. Разумеется, если вам нужна обратная совместимость, будет действительно лучше просмотреть их.
4.2. Уловка and/or
«and» и «or» в Python — сложные создания. Применение and к нескольким выражениям не просто возвращает True или False. Оно возвращает первое false-выражение, либо последнее из выражений, если все они true. Результат ожидаем: если все выражения верны, возвращается последнее, являющееся true; если одно из них false, оно и возвращается и преобразуется к False при проверке логического значения.
Аналогично, операция or возвращает первое true-значение, либо последнее, если ни одно из них не true.
Это вам не поможет, если вы просто проверяете логическое значение выражения. Но можно использовать and и or в других целях. Мой любимый способ — выбор значения в стиле, аналогичном тернарному оператору языка C «test? value_if_true: value_if_false»:
Как это работает? Если test=true, оператор and пропускает его и возвращает второе (последнее) из данных ему значений: ‘Test is True’ or ‘Test is False’ . Далее, or вернет первое true выражение, т. е. ‘Test is True’.
Если test=false, and вернет test, останется test or ‘Test is False’ . Т. к. test=false, or его пропустит и вернет второе выражение, ‘Test is False’.
Внимание, будьте осторожны со средним значением («if_true»). Если оно окажется false, выражение с or будет всегда пропускать его и возвращать последнее значение («if_false»), независимо от значения test.
После использования этого метода правильный способ (п. 4.1) кажется мне менее интуитивным. Если вам не нужна обратная совместимость, попробуйте оба способа и посмотрите, какой вам больше нравится. Если не можете определиться, используйте правильный.
Конечно, если вам нужна совместимость с предыдущими версиями Python, «правильный» способ не будет работать. В этом случае and/or — лучший выбор в большинстве ситуаций.
4.3. True/False в качестве индексов
Другой способ выбора из двух значений — использование True и False как индексов списка с учетом того факта, что False == 0 и True == 1:
Этот способ более честный, и value_if_true не обязано быть true. Однако у него есть существенный недостаток: оба элемента списка вычисляются перед проверкой. Для строк и других простых элементов это не проблема. Но если каждый из них требует больших вычислений или операций ввода-вывода, вычисление обоих выражений недопустимо. Поэтому я предпочитаю обычную конструкцию или and/or.
Также заметьте, что этот способ работает только тогда, когда вы уверены, что test — булево значение, а не какой-то объект. Иначе придется писать bool(test) вместо test, чтобы он работал правильно.
5. Функции
5.1. Значения по умолчанию для аргументов вычисляются только один раз
Начнем этот раздел с предупреждения. Эта проблема много раз смущала многих программистов, включая меня, даже после того, как я разобрался в проблеме. Легко ошибиться, используя значения по умолчанию:
Значения по умолчанию для аргументов вычисляются только один раз, в момент определения функции. Python просто присваивает это значение нужной переменной при каждом вызове функции. При этом он не проверяет, изменилось ли это значение. Поэтому, если вы изменили его, изменение будет в силе при следующих вызовах функции. В предыдущем примере, когда мы добавили значение к списку stuff, мы изменили его значение по умолчанию навсегда. Когда мы вызываем функцию снова, ожидая дефолтное значение, мы получаем измененное.
Решение проблемы: не используйте изменяемые объекты в качестве значений по умолчанию. Вы можете оставить всё как есть, если не изменяете их, но это плохая идея. Вот как следовало написать предыдущий пример:
None неизменяем (в любом случае, мы не пытаемся его изменить), так что мы обезопасили себя от внезапного изменения дефолтного значения.
С другой стороны, умный программист, возможно, превратит это в уловку для использования статических переменных, как в языке C.
5.1.1. Заставляем дефолтные значения вычисляться каждый раз
Если вы не хотите вносить в код функции лишний беспорядок, можно заставить интерпретатор заново вычислять значения аргументов перед каждым вызовом. Следующий декоратор делает это:
Просто примените этот декоратор к функции, чтобы получить ожидаемые результаты:
5.2. Переменное число аргументов
Python позволяет использовать произвольное число аргументов в функциях. Сначала определяются обязательные аргументы (если они есть), затем нужно указать переменную со звездочкой. Python присвоит ей значение списка остальных (не именованных) аргументов:
Зачем это нужно? Например, функция должна принимать несколько элементов и делать с ними одно и то же (например, складывать). Можно заставить пользователя передавать функции список: sum_all([1,2,3]). А можно позволить передавать произвольное число аргументов, тогда получится более чистый код: sum_all(1,2,3).
Функция также может иметь переменное число именованных аргументов. После определения всех остальных аргументов укажите переменную с «**» в начале. Python присвоит этой переменной словарь полученных именованных аргументов, кроме обязательных:
Зачем так делать? Я считаю, самая распространенная причина — функция является оберткой другой функции (или функций), и неиспользуемые именованные аргументы могут быть переданы другой функции (см. п. 5.3).
5.2.1. Уточнение
Использование именованных аргументов и произвольного числа обычных аргументов после них, по-видимому, невозможно, потому что именованные аргументы должны быть определены до «*»-параметра. Например, представим функцию:
У нас проблема: не получится передать actually_print как именованный аргумент, если при этом нужно передать несколько неименованных. Оба следующих варианта вызовут ошибку:
Единственный способ задать actually_print в этой ситуации — передать его как обычный аргумент:
5.3. Передача списка или словаря в качестве нескольких аргументов
Поскольку можно получить переданные аргументы в виде списка или словаря, нет ничего удивительного в том, что передавать аргументы функции тоже можно из списка или словаря. Синтаксис совершенно такой же, как в предыдущем пункте, нужно поставить перед списком звездочку:
А для словаря (что используется чаще) нужно поставить две звездочки:
Историческая справка: в Python до версии 2.3 для этих целей использовалась встроенная функция apply (function, arg_list, keyword_arg_dict)’.
Источник
Значения true, false, null пример
Подробно о true, false, null
Что такое false и true
Чтобы понять, что такое false и true проделаем пару манипуляций!
Если «ноль» равен «false», то выведем на экран «0 == false»:
Давайте это условие разместим прямо здесь, смотрим результат выполнения php программы:
Вывод такой, что «ноль» и «false» — равны(по значению) — это не я говорю — это говорит сам PHP.
Теперь сравним 1 и true.
Создадим теперь второе условие и используем «1» и «true», если «1» равен «true», то выведем на экран 1 == true.
Прямо здесь давайте разместим это условие:
Вывод, что «1» и «true» — равны(по значению).
Обращаю ваше внимание!
Если в первой части у вас не возникло проблем с пониманием написанного, то мы можем сделать следующий шаг!
Как вы знаете, есть :
Напишем такое условие, если ноль тождественно равен false, то выведем «0 === false», иначе «0 и false — тождественно не равны»
И выведем прямо здесь :
Вывод о «0» и «false»
Что «0» и «false» — равны по значению.
Но не равны по типу.
Чтобы разобраться с типом нам понадобится функция var_dump:
Выведем прямо здесь:
И такое же проделаем с false
Вывод о типах «0» и «false»
«0» — тип «int»(число).
«false» — тип «bool»(булев).
По типу «0» и «false» — никак не могут быть равны по типу!
Что же касается «1» и «true», то результаты и выводы будут аналогичные — не буду все те же действия повторять, перейдем сразу к выводам!
Вывод о «1» и «true»
«1» и «true» — равны по значению.
«1» и «true» — не равны по типу!
Надеюсь, что вы поняли что такое true и false
Если же нет, то рекомендую читать этот пункт, пока у вас не настанет прояснение!
Ведь «true и false» — это же так просто!
Проверим переменные на true.
Несколько примеров и проверок на «true».
Некоторые примеры похожи на примеры из первого пункта, но и могут отличаться!
Сверху пытался максимально просто объяснить, что такое «true».
Проверим число 1 на true.
Если число будет равно true, то выведем echo $true_1 + если число будет идентично true, то выведем echo $true_2
Результат проверки числа на true
Вывод, что единица — будет true только по значению, но не по типу. и это число(int) из одного знака.
Проверим число 0 на true.
Конечно же я знаю, какой будет результат, но для вас не очевидно!
Давайте проверим число «0» на true.
Нам опять понадобится:
Переменной $переменная_true_0 присвоим значение 0
И проверим число на то, что вернет в условии на два и три равно, если число будет равно true, то выведем echo $true_1
Если число будет идентично true, то выведем echo $true_2
Источник
Тип Boolean, логические операторы и операторы сравнения
Логический тип Boolean в JavaScript представляет одно из двух значений: true (истина) или false (ложь).
Значения Boolean
В программировании очень часто бывают ситуации, когда требуется тип данных, который может принимать одно значение из двух, вроде
Именно для этих случаев в JavaScript существует логический тип данных Boolean, который может принимать только значение true (истина) или false (ложь).
Функция Boolean()
Чтобы определить, является ли выражение (или переменная) истиной (возвращает значение true), можно воспользоваться функцией Boolean():
Или можно сделать еще проще:
Все имеет «значение» True или False
Любое значение отличное от 0 имеет логическое значение true.
Логическое значение 0 (ноль) — false.
Логическое значение -0 (минус ноль) — false.
Логическое значение «» (пустая строка) — false.
Логическое значение undefined — false.
Логическое значение null — false.
Логическое значение false — false.
Логическое значение NaN — false.
Значения типа Boolean могут быть объектами
Обычно, логические значения типа Boolean определяются примитивными литералами:
Однако, в JavaScript при помощи ключевого слова new логические значения также можно определить и как объекты:
Тем не менее, не определяйте значения типа Boolean как объекты. Это замедляет скорость выполнения скрипта. Кроме этого, ключевое слово new в данном случае усложняет код и может привести к неожиданным результатам:
При использовании оператора сравнения ==, одинаковые значения типа Boolean равны:
Однако, при использовании оператора сравнения ===, одинаковые значения типа Boolean не будут равными, потому что оператор === ожидает совпадения как по значению, так и по типу.
Или еще хуже. Объекты не сравниваются:
Обратите внимание на разницу между (x==y) и (x===y).
Сравнение двух объектов JavaScript всегда возвращает ложь (false).
Логические операторы и операторы сравнения
Логические операторы и операторы сравнения используются для проверки выражений и переменных на соответствие какому-либо условию.
Значения типа Boolean лежат в основе всех сравнений и условий в JavaScript.
Операторы сравнения
Операторы сравнения используются в логических выражениях для определения совпадения или различия между переменными или значениями.
Предположим, что у нас есть x = 5. Следующая таблица объясняет операторы сравнения:
Оператор | Описание | Выражение | Возвращает |
---|---|---|---|
== | равно | x == 8 x == 5 x == «5» | false true true |
=== | равно по значению и типу | x === 5 x === «5» | true false |
!= | не равно | x != 8 | true |
!== | не равно ни по значению, ни по типу | x !== 8 x !== 5 x !== «5» | true false true |
> | больше чем | x > 8 | false |
= | больше или равно | x >= 8 | false |
1) — true | |||
|| | ИЛИ | (x == 5 || y == 5) — false | |
! | НЕ | !(x == y) — true |
Оператор ! также используется для быстрого преобразования выражения к логическому значению:
Условный (тернарный) оператор
В JavaScript есть особый условный оператор, который присваивает переменной значение в зависимости от заданного условия.
имя_переменной= (условие) ?значение1:значение2
В данном примере если в переменной age значение меньше 18, то переменной voteable будет присвоена строка «Слишком молод», в обратном случае переменной voteable будет присвоена строка «Возраст подходит».
Сравнение разных типов
Сравнение данных разного типа может привести к неожиданным результатам.
При сравнении строки и числа JavaScript будет преобразовывать строку в числовое значение. Пустая строка преобразуется в 0. Не числовая строка преобразуется в значение NaN, которое всегда равно false.
Выражение | Значение |
---|---|
2 «John» | false |
2 == «John» | false |
«2» «12» | true |
«2» == «12» | false |
При сравнении двух строк значение строки «2» будет больше значения строки «12», потому что в алфавитной последовательности 1 меньше 2.
Чтобы обезопасить результаты сравнения, переменные следует привести к надлежащему типу:
Источник