Comportamento de curto-circuito no operador and, or:
Vamos primeiro definir uma função útil para determinar se algo é executado ou não. Uma função simples que aceita um argumento, imprime uma mensagem e retorna a entrada inalterada.
>>> fun(1)
executed1>>>1or fun(1)# due to short-circuiting "executed" not printed1>>>1and fun(1)# fun(1) called and "executed" printed
executed1>>>0and fun(1)# due to short-circuiting "executed" not printed 0
Nota: Os seguintes valores são considerados pelo intérprete como falsos:
FalseNone0""()[]{}
Comportamento de curto-circuito na função: any(), all():
As funções any()e all()funções do Python também suportam curto-circuito. Como mostrado nos documentos; eles avaliam cada elemento de uma sequência em ordem, até encontrar um resultado que permita uma saída antecipada da avaliação. Considere os exemplos abaixo para entender os dois.
A função any()verifica se algum elemento é True. Ele para de executar assim que um True é encontrado e retorna True.
>>> any(fun(i)for i in[1,2,3,4])# bool(1) = True
executedTrue>>> any(fun(i)for i in[0,2,3,4])
executed # bool(0) = False
executed # bool(2) = TrueTrue>>> any(fun(i)for i in[0,0,3,4])
executed
executed
executedTrue
A função all()verifica se todos os elementos são True e para de executar assim que um False é encontrado:
>>> all(fun(i)for i in[0,0,3,4])
executedFalse>>> all(fun(i)for i in[1,0,3,4])
executed
executedFalse
Comportamento de curto-circuito na comparação encadeada:
Além disso, em Python
As comparações podem ser encadeadas arbitrariamente ; por exemplo, x < y <= zé equivalente a x < y and y <= z, exceto que yé avaliado apenas uma vez (mas em ambos os casos znão é avaliado quando x < yé considerado falso).
>>>5>6> fun(3)# same as: 5 > 6 and 6 > fun(3)False# 5 > 6 is False so fun() not called and "executed" NOT printed>>>5<6> fun(3)# 5 < 6 is True
executed # fun(3) called and "executed" printedTrue>>>4<=6> fun(7)# 4 <= 6 is True
executed # fun(3) called and "executed" printedFalse>>>5< fun(6)<3# only prints "executed" once
executedFalse>>>5< fun(6)and fun(6)<3# prints "executed" twice, because the second part executes it again
executed
executedFalse
Edit:
Mais um ponto interessante notar : - Lógico and,or operadores em Python retorna de um operando valor em vez de um booleano ( Trueou False). Por exemplo:
A operação x and yfornece o resultadoif x is false, then x, else y
Diferente de outros idiomas &&, por exemplo , ||operadores em C que retornam 0 ou 1.
Exemplos:
>>>3and5# Second operand evaluated and returned 5>>>3and()()>>>()and5# Second operand NOT evaluated as first operand () is false()# so first operand returned
Da mesma forma, o oroperador retorna o valor mais à esquerda para o qual bool(value)== Trueelse mais valor mais à direita (de acordo com o comportamento de curto-circuito), exemplos:
>>>2or5# left most operand bool(2) == True2>>>0or5# bool(0) == False and bool(5) == True5>>>0or()()
Então, como isso é útil? Um exemplo de uso dado em Practical Python por Magnus Lie Hetland:
Digamos que um usuário deve digitar seu nome, mas pode optar por não inserir nada; nesse caso, você deseja usar o valor padrão '<unknown>'. Você pode usar uma instrução if, mas também pode declarar as coisas de maneira muito sucinta:
In[171]: name = raw_input('Enter Name: ')or'<Unkown>'EnterName:In[172]: nameOut[172]:'<Unkown>'
Em outras palavras, se o valor de retorno de raw_input for verdadeiro (não uma sequência vazia), ele será atribuído ao nome (nada será alterado); caso contrário, o padrão '<unknown>'é atribuído a name.
Qualificação menor: a lista explícita de valores falsos é um pouco enganadora. Qualquer tipo pode ter um ou mais valores falsos. Por convenção, todos os tipos numéricos com valor 0são Falsas (por isso não é apenas 0, é 0.0, 0j, decimal.Decimal(0), fractions.Fraction(0), etc.), assim como todas as coleções de comprimento 0(tão em cima do que você listou, b''[PY3], u''[Py2] e set()/ frozenset()são todos os built-ins que são avaliados como falsos), mas os tipos definidos pelo usuário / de terceiros podem definir seus próprios (com __bool__[Py3] / __nonzero__[Py2] direta ou indiretamente, definindo __len__).
ShadowRanger
@ShadowRanger aqui seu comentário completará minha resposta. obrigado por adicionar esta nota.
Respostas:
Sim, tanto os operadores
and
quanto oor
curto-circuito - consulte a documentação .fonte
Comportamento de curto-circuito no operador
and
,or
:Vamos primeiro definir uma função útil para determinar se algo é executado ou não. Uma função simples que aceita um argumento, imprime uma mensagem e retorna a entrada inalterada.
Pode-se observar o comportamento de curto-circuito do Python de
and
,or
operadores no exemplo a seguir:Nota: Os seguintes valores são considerados pelo intérprete como falsos:
Comportamento de curto-circuito na função:
any()
,all()
:As funções
any()
eall()
funções do Python também suportam curto-circuito. Como mostrado nos documentos; eles avaliam cada elemento de uma sequência em ordem, até encontrar um resultado que permita uma saída antecipada da avaliação. Considere os exemplos abaixo para entender os dois.A função
any()
verifica se algum elemento é True. Ele para de executar assim que um True é encontrado e retorna True.A função
all()
verifica se todos os elementos são True e para de executar assim que um False é encontrado:Comportamento de curto-circuito na comparação encadeada:
Além disso, em Python
Edit:
Mais um ponto interessante notar : - Lógico
and
,or
operadores em Python retorna de um operando valor em vez de um booleano (True
ouFalse
). Por exemplo:Diferente de outros idiomas
&&
, por exemplo ,||
operadores em C que retornam 0 ou 1.Exemplos:
Da mesma forma, o
or
operador retorna o valor mais à esquerda para o qualbool(value)
==True
else mais valor mais à direita (de acordo com o comportamento de curto-circuito), exemplos:Então, como isso é útil? Um exemplo de uso dado em Practical Python por Magnus Lie Hetland:
Digamos que um usuário deve digitar seu nome, mas pode optar por não inserir nada; nesse caso, você deseja usar o valor padrão
'<unknown>'
. Você pode usar uma instrução if, mas também pode declarar as coisas de maneira muito sucinta:Em outras palavras, se o valor de retorno de raw_input for verdadeiro (não uma sequência vazia), ele será atribuído ao nome (nada será alterado); caso contrário, o padrão
'<unknown>'
é atribuído aname
.fonte
0
são Falsas (por isso não é apenas0
, é0.0
,0j
,decimal.Decimal(0)
,fractions.Fraction(0)
, etc.), assim como todas as coleções de comprimento0
(tão em cima do que você listou,b''
[PY3],u''
[Py2] eset()
/frozenset()
são todos os built-ins que são avaliados como falsos), mas os tipos definidos pelo usuário / de terceiros podem definir seus próprios (com__bool__
[Py3] /__nonzero__
[Py2] direta ou indiretamente, definindo__len__
).Sim. Tente o seguinte no seu intérprete python:
e
ou
fonte