Python Language
villkors
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 exempel0L
,0.0
,0j
- Tomma sekvenser:
''
,""
,()
,[]
- Tom mappningar:
{}
- Användardefinierade typer där
__bool__
eller__len__
returnerar 0 ellerFalse
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
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
.