Python Language
Voorwaardelijke
Zoeken…
Invoering
Voorwaardelijke uitdrukkingen, met trefwoorden zoals if, elif en anders, bieden Python-programma's de mogelijkheid om verschillende acties uit te voeren, afhankelijk van een Booleaanse voorwaarde: waar of niet waar. In deze sectie wordt het gebruik van Python-voorwaardelijkheden, booleaanse logica en ternaire verklaringen behandeld.
Syntaxis
- <expression> if <conditional> else <expression> # Ternary Operator
if, elif en anders
In Python kunt u een reeks voorwaardelijke waarden definiëren met behulp van if
voor de eerste, elif
voor de rest, tot de laatste (optioneel) else
voor iets dat niet wordt gevangen door de andere voorwaardelijke voorwaarden.
number = 5
if number > 2:
print("Number is bigger than 2.")
elif number < 2: # Optional clause (you can have multiple elifs)
print("Number is smaller than 2.")
else: # Optional clause (you can only have one else)
print("Number is 2.")
Number is bigger than 2
uitgangen Number is bigger than 2
else if
plaats van elif
veroorzaakt een syntaxisfout en is niet toegestaan.
Voorwaardelijke expressie (of "The Ternary Operator")
De ternaire operator wordt gebruikt voor inline voorwaardelijke expressies. Het wordt het best gebruikt in eenvoudige, beknopte bewerkingen die gemakkelijk kunnen worden gelezen.
- De volgorde van de argumenten verschilt van veel andere talen (zoals C, Ruby, Java, etc.), wat kan leiden tot bugs wanneer mensen die niet vertrouwd zijn met het "verrassende" gedrag van Python het gebruiken (ze kunnen de volgorde omkeren).
- Sommigen vinden het "log", omdat het in strijd is met de normale gedachtestroom (eerst aan de toestand denken en dan aan de effecten).
n = 5
"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'
Het resultaat van deze uitdrukking is zoals deze in het Engels wordt gelezen - als de voorwaardelijke uitdrukking Waar is, wordt deze geëvalueerd naar de uitdrukking aan de linkerkant, anders aan de rechterkant.
Onderliggende bewerkingen kunnen ook worden genest, zoals hier:
n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"
Ze bieden ook een methode voor het opnemen van conditionals in lambda-functies .
Als verklaring
if condition:
body
De if
instructies controleren de toestand. Als het naar True
evalueert, wordt de body van de if
instructie uitgevoerd. Als het naar False
evalueert, slaat het het lichaam over.
if True:
print "It is true!"
>> It is true!
if False:
print "This won't get printed.."
De voorwaarde kan elke geldige uitdrukking zijn:
if 2 + 2 == 4:
print "I know math!"
>> I know math!
Anders verklaring
if condition:
body
else:
body
De instructie else zal zijn hoofdtekst alleen uitvoeren als voorgaande voorwaardelijke statements allemaal als False evalueren.
if True:
print "It is true!"
else:
print "This won't get printed.."
# Output: It is true!
if False:
print "This won't get printed.."
else:
print "It is false!"
# Output: It is false!
Booleaanse logische uitdrukkingen
Booleaanse logische uitdrukkingen geven niet alleen de waarde True
of False
, maar geven ook de waarde terug die als True
of False
is geïnterpreteerd. Het is een Pythonische manier om logica weer te geven die anders misschien een if-else-test vereist.
En operator
De and
operator evalueert alle uitingen en het rendement van de laatste uitdrukking als alle expressies de waarde True
. Anders retourneert het de eerste waarde die False
:
>>> 1 and 2
2
>>> 1 and 0
0
>>> 1 and "Hello World"
"Hello World"
>>> "" and "Pancakes"
""
Of operator
De operator or
evalueert de uitdrukkingen van links naar rechts en retourneert de eerste waarde die evalueert naar True
of de laatste waarde (als er geen True
).
>>> 1 or 2
1
>>> None or 1
1
>>> 0 or []
[]
Luie evaluatie
Wanneer u deze aanpak gebruikt, moet u er rekening mee houden dat de evaluatie lui is. Uitdrukkingen die niet hoeven te worden geëvalueerd om het resultaat te bepalen, worden niet geëvalueerd. Bijvoorbeeld:
>>> def print_me():
print('I am here!')
>>> 0 and print_me()
0
In het bovenstaande voorbeeld wordt print_me
nooit uitgevoerd omdat Python kan bepalen dat de gehele expressie False
wanneer deze de 0
( False
) tegenkomt. Houd dit in gedachten als print_me
moet worden uitgevoerd om uw programmalogica te bedienen.
Testen op meerdere condities
Een veel voorkomende fout bij het controleren op meerdere voorwaarden is de logica onjuist toe te passen.
Dit voorbeeld probeert te controleren of twee variabelen elk groter zijn dan 2. De instructie wordt geëvalueerd als - if (a) and (b > 2)
. Dit levert een onverwacht resultaat op omdat bool(a)
als True
evalueert wanneer a
niet nul is.
>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')
yes
Elke variabele moet afzonderlijk worden vergeleken.
>>> if a > 2 and b > 2:
... print('yes')
... else:
... print('no')
no
Een andere, soortgelijke, fout wordt gemaakt bij het controleren of een variabele een van meerdere waarden is. De instructie in dit voorbeeld wordt geëvalueerd als - if (a == 3) or (4) or (6)
. Dit levert een onverwacht resultaat op omdat bool(4)
en bool(6)
elk naar True
evalueren
>>> a = 1
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')
yes
Opnieuw moet elke vergelijking afzonderlijk worden gemaakt
>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')
no
Het gebruik van de in-operator is de canonieke manier om dit te schrijven.
>>> if a in (3, 4, 6):
... print('yes')
... else:
... print('no')
no
Waarheden
De volgende waarden worden als falsey beschouwd, in die zin dat ze worden geëvalueerd als False
wanneer ze worden toegepast op een booleaanse operator.
- Geen
- vals
-
0
, of een numerieke waarde die gelijk is aan nul, bijvoorbeeld0L
,0.0
,0j
- Lege reeksen:
''
,""
,()
,[]
- Lege toewijzingen:
{}
- Door de gebruiker gedefinieerde typen waarbij de methoden
__bool__
of__len__
0 ofFalse
retourneren
Alle andere waarden in Python worden geëvalueerd als True
.
Opmerking: een veel voorkomende fout is eenvoudigweg te controleren op de valsheid van een bewerking die verschillende Falsey-waarden retourneert waar het verschil ertoe doet. Gebruik bijvoorbeeld if foo()
plaats van het meer expliciete if foo() is None
Gebruik de functie cmp om het vergelijkingsresultaat van twee objecten te krijgen
Python 2 bevat een cmp
functie waarmee u kunt bepalen of een object kleiner is dan, gelijk aan of groter dan een ander object. Deze functie kan worden gebruikt om een keuze uit een lijst te kiezen op basis van een van die drie opties.
Stel dat u 'greater than'
als x > y
, 'less than'
als x < y
en 'equal'
als x == y
moet afdrukken.
['equal', 'greater than', 'less than', ][cmp(x,y)]
# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'
cmp(x,y)
geeft de volgende waarden terug
Vergelijking | Resultaat |
---|---|
x <j | -1 |
x == y | 0 |
x> y | 1 |
Deze functie is verwijderd op Python 3. U kunt de cmp_to_key(func)
in functools
in Python 3 gebruiken om oude vergelijkingsfuncties om te zetten in sleutelfuncties.
Evaluatie van voorwaardelijke expressie met behulp van lijstbegrippen
Met Python kunt u lijstbegrippen hacken om voorwaardelijke uitdrukkingen te evalueren.
Bijvoorbeeld,
[value_false, value_true][<conditional-test>]
Voorbeeld:
>> n = 16
>> print [10, 20][n <= 15]
10
Hier geeft n<=15
False
(wat overeenkomt met 0 in Python). Dus wat Python evalueert is:
[10, 20][n <= 15]
==> [10, 20][False]
==> [10, 20][0] #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
De ingebouwde __cmp__
methode retourneerde 3 mogelijke waarden: 0, 1, -1, waarbij cmp (x, y) 0 retourneerde: als beide objecten hetzelfde waren 1: x> y -1: x <y
Dit kan worden gebruikt met lijstbegrippen om het eerste (dwz index 0), tweede (dwz index 1) en laatste (dwz index -1) element van de lijst te retourneren. Dit geeft ons een voorwaardelijke van dit type:
[value_equals, value_greater, value_less][<conditional-test>]
Ten slotte evalueert Python in alle bovenstaande voorbeelden beide takken voordat er een wordt gekozen. Om alleen de gekozen tak te evalueren:
[lambda: value_false, lambda: value_true][<test>]()
waarbij het toevoegen van de ()
aan het einde ervoor zorgt dat de lambdafuncties alleen aan het einde worden aangeroepen / geëvalueerd. We evalueren dus alleen de gekozen tak.
Voorbeeld:
count = [lambda:0, lambda:N+1][count==N]()
Testen of een object Geen is en het toewijzen
U wilt vaak iets aan een object toewijzen als het None
, wat aangeeft dat het niet is toegewezen. We zullen aDate
.
De eenvoudigste manier om dit te doen, is door de test is None
te gebruiken.
if aDate is None:
aDate=datetime.date.today()
(Merk op dat het meer Pythonisch is om te zeggen is None
plaats van == None
.)
Maar dit kan enigszins worden geoptimaliseerd door het idee te benutten dat not None
in een booleaanse uitdrukking naar True
zal evalueren. De volgende code is equivalent:
if not aDate:
aDate=datetime.date.today()
Maar er is een meer pythonische manier. De volgende code is ook equivalent:
aDate=aDate or datetime.date.today()
Dit doet een evaluatie van kortsluiting . Als aDate
is geïnitialiseerd en not None
, wordt deze aan zichzelf toegewezen zonder netto-effect. Als het is None
, wordt datetime.date.today()
toegewezen aan aDate
.