2016-01-06 3 views
-1

У меня есть проблемы с пониманием смысла not в заявлении, таких какЧто не делает int (x)?

not int(x) 

Он вычисляет True если x равно 0. Но если x - любое другое число, которое оно оценивает до False.

Я хотел бы объяснить это поведение, спасибо.

+7

_ "Я не могу понять значение не в этом" _. Извините, в чем? Если вас смущает часть кода, отправьте этот фрагмент кода. (предпочтительно, как [mcve]) – Kevin

+0

, если 'x'' '' '' '' '0'', или' x' - это float и '1> x> = 0', тогда' not int (x) 'будет 'true'. В противном случае это будет «ложь». –

+0

@ Кевин должен быть понятен сейчас. – timgeb

ответ

4

not some_object будет возвращать True, если some_object является falsy, то есть, если bool(some_object) будет возвращать False.

Для любого целого z, bool(z) всегда будет True, если z==0. Таким образом, not int(x) - это всего лишь способ проверить, x, после преобразования его в целое число (с использованием int), равно нулю.

Демо:

>>> x = '-7' # this is not 0 after conversion to an integer 
>>> bool(int(x)) 
True 
>>> x = '0' 
>>> bool(x) # a non-empty string is truthy 
True 
>>> bool(int(x)) 
False 
>>> not int(x) # you can omit the call to bool in a boolean context 
True 

В логическом контексте, мы можем опустить вызов bool. Использование неявной логичности объектов может пригодиться, особенно если вы хотите проверить, пуст ли какой-либо объект (например, пустые строки, наборы, списки, словари ...).

>>> not {} 
True 
>>> not [] 
True 
>>> not set() 
True 
>>> not '' 
True 
>>> not tuple() 
True 
>>> not 0.0 
True 
>>> not 0j 
True  
>>> not [1,2,3] 
False 

Методы, участвующие здесь __nonzero__ для python2 и __bool__ для Python3. Теоретически мы могли бы переопределить их. Рассмотрим следующий пример Python2:

>>> class LyingList(list): 
...  def __nonzero__(self): # for Py3, override __bool__ 
...   return True 
... 
>>> liar = LyingList([]) 
>>> liar 
[] 
>>> not liar 
False 

uh oh!

+1

Для полноты пустые кортежи 0.0 и 0j также являются ложными. – Reti43

+0

@ Reti43 спасибо, добавлено – timgeb