Sök…


Introduktion

Villkorliga uttryck, som involverar nyckelord som om, elif och annat, ger Python-program möjlighet att utföra olika åtgärder beroende på ett booleskt tillstånd: Sant eller falskt. Detta avsnitt behandlar användningen av Python-konditioner, booleska logik och ternära uttalanden.

Syntax

  • <uttryck> om <villkorligt> annat <uttryck> # ternär operatör

om, elif, och annat

I Python kan du definiera en serie villkor med hjälp av if för den första, elif för resten, fram till den sista (valfritt) else för allt som inte fångas av de andra villkoren.

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.")

Utgångar Number is bigger than 2

else if använder else if istället för elif utlöses ett syntaxfel och är inte tillåtet.

Villkorligt uttryck (eller "Den ternära operatören")

Den ternära operatören används för inline villkorliga uttryck. Det används bäst i enkla, kortfattade operationer som lätt kan läsas.

  • Ordningen på argumenten skiljer sig från många andra språk (som C, Ruby, Java, etc.), vilket kan leda till buggar när personer som inte känner till Pythons "överraskande" beteende använder den (de kan vända ordningen).
  • Vissa tycker att det är "svårt", eftersom det strider mot det normala flödet av tankar (tänker först på tillståndet och sedan effekterna).
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'

Resultatet av detta uttryck blir som det läses på engelska - om det villkorliga uttrycket är sant, kommer det att utvärdera till uttrycket på vänster sida, annars höger sida.

Hyresverksamhet kan också häckas, som här:

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

De tillhandahåller också en metod för att inkludera balsam i lambda-funktioner .

Om uttalande

if condition:
    body

if uttalanden kontrollerar villkoret. Om den utvärderas till True , kör den kroppen if uttalandet. Om det utvärderas till False hoppar det över kroppen.

if True:
    print "It is true!"
>> It is true!

if False:
    print "This won't get printed.."

Villkoret kan vara valfritt uttryck:

if 2 + 2 == 4:
    print "I know math!"
>> I know math!

Annars uttalande

if condition:
    body
else:
    body

Det andra uttalandet kommer att utföra sin kropp endast om föregående villkorliga uttalanden alla utvärderar till falskt.

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!

Booleska logiska uttryck

Booleska logiska uttryck, förutom att utvärdera till True eller False , returnerar värdet som tolkades som True eller False . Det är ett Pythonic sätt att representera logik som annars kan kräva ett om-annat test.


Och operatör

Den and Operatören utvärderar alla uttryck och returnerar det sista uttrycket om alla uttryck utvärderas till True . Annars returnerar det det första värdet som utvärderas till False :

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"
"Hello World"

>>> "" and "Pancakes"
""

Eller operatör

Operatören or operatören utvärderar uttryck från vänster till höger och returnerar det första värdet som utvärderar till True eller det sista värdet (om inget är True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

Lat utvärdering

Kom ihåg att utvärderingen är lat när du använder den här metoden. Uttryck som inte måste utvärderas för att bestämma resultatet utvärderas inte. Till exempel:

>>> def print_me():
        print('I am here!')
>>> 0 and print_me()
0

I exemplet print_me exekveras aldrig print_me eftersom Python kan bestämma att hela uttrycket är False när det möter 0 ( False ). Tänk på detta om print_me måste köras för att visa din programlogik.


Testning för flera förhållanden

Ett vanligt misstag vid kontroll av flera villkor är att tillämpa logiken felaktigt.

Detta exempel försöker kontrollera om två variabler vardera är större än 2. Uttalandet utvärderas som - if (a) and (b > 2) . Detta ger ett oväntat resultat eftersom bool(a) utvärderar som True när a inte är noll.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
...     print('yes')
... else:
...     print('no')
    
yes

Varje variabel måste jämföras separat.

>>> if a > 2 and b > 2:
...     print('yes')
... else:
...     print('no')
        
no

Ett annat, liknande, misstag görs när man kontrollerar om en variabel är en av flera värden. Uttalandet i detta exempel utvärderas som - if (a == 3) or (4) or (6) . Detta ger ett oväntat resultat eftersom bool(4) och bool(6) vardera utvärderar till True

>>> a = 1
>>> if a == 3 or 4 or 6:
...     print('yes')
... else:
...     print('no')
       
yes

Återigen måste varje jämförelse göras separat

>>> if a == 3 or a == 4 or a == 6:
...     print('yes')
... else:
...     print('no')
        
no

Att använda operatören är det kanoniska sättet att skriva detta.

>>> if a in (3, 4, 6):
...     print('yes')
... else:
...     print('no')
    
no

Sanningsvärden

Följande värden betraktas som falsey, eftersom de utvärderar False när de tillämpas på en boolesk operatör.

  • Ingen
  • Falsk
  • 0 eller vilket numeriskt värde som är ekvivalent med noll, till exempel 0L , 0.0 , 0j
  • Tomma sekvenser: '' , "" , () , []
  • Tom mappningar: {}
  • Användardefinierade typer där __bool__ eller __len__ returnerar 0 eller False

Alla andra värden i Python utvärderar till True .


Obs: Ett vanligt misstag är att helt enkelt kontrollera förfalskningen av en operation som returnerar olika Falsey-värden där skillnaden är viktig. Använd till exempel if foo() snarare än det mer uttryckliga if foo() is None

Använda cmp-funktionen för att få jämförelsesresultat för två objekt

Python 2 innehåller en cmp funktion som låter dig bestämma om ett objekt är mindre än, lika med eller större än ett annat objekt. Denna funktion kan användas för att välja ett val ur en lista baserat på ett av dessa tre alternativ.

Anta att du måste skriva ut 'greater than' om x > y , 'less than' om x < y och 'equal' om x == y .

['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) returnerar följande värden

Jämförelse Resultat
x <y -1
x == y 0
x> y 1

Den här funktionen tas bort på Python 3. Du kan använda cmp_to_key(func) hjälpfunktionen som finns i functools i Python 3 för att konvertera gamla jämförelsefunktioner till nyckelfunktioner.

Utvärdering av villkorligt uttryck med listförståelser

Python låter dig hacka listförståelser för att utvärdera villkorade uttryck.

Till exempel,

[value_false, value_true][<conditional-test>]

Exempel:

>> n = 16
>> print [10, 20][n <= 15]
10

Här returnerar n<=15 False (vilket motsvarar 0 i Python). Så vad Python utvärderar är:

[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

Den inbyggda __cmp__ metoden returnerade 3 möjliga värden: 0, 1, -1, där cmp (x, y) returnerade 0: om båda objekterna var desamma 1: x> y -1: x <y

Detta kan användas med listförståelser för att returnera det första (dvs. index 0), det andra (dvs. index 1) och det sista (dvs. index -1) elementet i listan. Ger oss en villkor av denna typ:

[value_equals, value_greater, value_less][<conditional-test>]

Slutligen, i alla exemplen ovan utvärderar Python båda grenarna innan de väljer en. För att bara utvärdera den valda grenen:

[lambda: value_false, lambda: value_true][<test>]()

där att lägga till () i slutet säkerställer att lambda-funktionerna endast kallas / utvärderas i slutet. Således utvärderar vi bara den valda grenen.

Exempel:

count = [lambda:0, lambda:N+1][count==N]()

Testa om ett objekt är Inget och tilldela det

Du vill ofta tilldela något till ett objekt om det är None , vilket indikerar att det inte har tilldelats. Vi använder aDate .

Det enklaste sättet att göra detta är att använda testet is None .

if aDate is None:
    aDate=datetime.date.today()

(Observera att det är mer Pythonic att säga is None istället för == None .)

Men detta kan optimeras något genom att utnyttja uppfattningen att not None kommer att utvärdera till True i ett booleskt uttryck. Följande kod är ekvivalent:

if not aDate:
    aDate=datetime.date.today()

Men det finns ett mer Pythonic sätt. Följande kod är också likvärdig:

aDate=aDate or datetime.date.today()

Detta gör en kortslutningsutvärdering . Om aDate initialiseras och not None , tilldelas det sig själv utan nettoeffekt. Om den inte is None , datetime.date.today() till aDate .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow