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, bijvoorbeeld 0L , 0.0 , 0j
  • Lege reeksen: '' , "" , () , []
  • Lege toewijzingen: {}
  • Door de gebruiker gedefinieerde typen waarbij de methoden __bool__ of __len__ 0 of False 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
Python 2.x 2.7

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 .



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow