Jeśli Python nie ma trójskładnikowego operatora warunkowego, czy można go symulować przy użyciu innych konstrukcji języka?
case [...] { when ... then ...} [ else ... ] end
podobny efekt, ale wcale nie jest trójskładnikowy.
Jeśli Python nie ma trójskładnikowego operatora warunkowego, czy można go symulować przy użyciu innych konstrukcji języka?
case [...] { when ... then ...} [ else ... ] end
podobny efekt, ale wcale nie jest trójskładnikowy.
Odpowiedzi:
Tak, został dodany w wersji 2.5. Składnia wyrażenia to:
a if condition else b
Najpierw condition
jest obliczany, a następnie dokładnie jeden z nich a
lub b
jest oceniany i zwracany na podstawie wartości logicznejcondition
. Jeśli condition
ocenia to True
, to a
jest oceniane i zwracane, ale b
jest ignorowane, lub kiedy b
jest oceniane i zwracane, ale a
jest ignorowane.
Pozwala to na zwarcie, ponieważ gdy condition
jest prawdziwe tylko a
jest oceniana i b
nie jest oceniana w ogóle, ale jeśli condition
jest fałszywe tylko b
jest oceniana i a
nie jest oceniana w ogóle.
Na przykład:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Pamiętaj, że warunkowe są wyrażeniem , a nie wyrażeniem . Oznacza to, że nie można używać instrukcji przypisania pass
ani innych instrukcji w wyrażeniu warunkowym :
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Możesz jednak użyć wyrażeń warunkowych, aby przypisać zmienną w następujący sposób:
x = a if True else b
Pomyśl o wyrażeniu warunkowym jako przełączaniu między dwiema wartościami. Jest to bardzo przydatne, gdy znajdujesz się w sytuacji „jednej lub innej wartości”, ale nie robi wiele więcej.
Jeśli potrzebujesz użyć instrukcji, musisz użyć normalnej if
instrukcji zamiast wyrażenia warunkowego .
Pamiętaj, że niektórzy Pythoniści patrzą na to z dezaprobatą z kilku powodów:
condition ? a : b
operatora trójskładnikowego w wielu innych językach (takich jak C, C ++, Go, Perl, Ruby, Java, JavaScript itp.), Co może prowadzić do błędów, gdy ludzie nie znają Pythona „ zaskakujące "użyj go (mogą odwrócić kolejność argumentów).if
” może być naprawdę przydatna i sprawia, że skrypt jest bardziej zwięzły, to naprawdę komplikuje kod)Jeśli masz problemy z zapamiętaniem kolejności, pamiętaj, że czytając na głos, (prawie) mówisz, co masz na myśli. Na przykład x = 4 if b > 8 else 9
jest czytany na głos jako x will be 4 if b is greater than 8 otherwise 9
.
Oficjalna dokumentacja:
f(x) = |x| = x if x > 0 else -x
dla matematyków brzmi to bardzo naturalnie. Możesz również zrozumieć to tak, jak A w większości przypadków, z wyjątkiem sytuacji, gdy C to powinieneś zrobić B zamiast tego ...
z = 3 + x if x < y else y
. Jeśli x=2
i y=1
, możesz oczekiwać, że da to 4, ale tak naprawdę da 1. z = 3 + (x if x > y else y)
to prawidłowe użycie.
z = 3 + x if x < y else 3 + y
) lub zgrupować warunek ( z = 3 + (x if x < y else y)
lub z = (x if x < y else y) + 3
)
Możesz indeksować do krotki:
(falseValue, trueValue)[test]
test
musi zwrócić wartość Prawda lub Fałsz .
Bezpieczniej jest zawsze go wdrożyć, ponieważ:
(falseValue, trueValue)[test == True]
lub możesz użyć wbudowanego, bool()
aby zapewnić wartość logiczną :
(falseValue, trueValue)[bool(<expression>)]
(lambda: print("a"), lambda: print("b"))[test==true]()
[]
literach, może być dowolnym wyrażeniem. Ponadto, dla bezpieczeństwa możesz wyraźnie przetestować prawdziwość, pisząc [bool(<expression>)]
. Ta bool()
funkcja jest dostępna od wersji 2.2.1.
True
i False
jako: {True:trueValue, False:falseValue}[test]
Nie wiem, czy jest to mniej wydajne, ale przynajmniej unika całości debata „elegancka” a „brzydka”. Nie ma wątpliwości, że masz do czynienia z wartością logiczną zamiast int.
W przypadku wersji wcześniejszych niż 2.5 istnieje sztuczka:
[expression] and [on_true] or [on_false]
Może dawać błędne wyniki, gdy on_true
ma fałszywą wartość boolowską. 1
Chociaż ma tę zaletę, że ocenia wyrażenia od lewej do prawej, co moim zdaniem jest wyraźniejsze.
1. Czy istnieje odpowiednik operatora trójskładnikowego „?”: „?
<expression 1> if <condition> else <expression 2>
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1
Z dokumentacji :
Wyrażenia warunkowe (czasem nazywane „operatorem potrójnym”) mają najniższy priorytet ze wszystkich operacji w języku Python.
Wyrażenie
x if C else y
najpierw ocenia warunek, C ( nie x ); jeśli C jest prawdą, x jest obliczane i zwracana jest jego wartość; w przeciwnym razie y jest obliczane, a jego wartość zwracana.Zobacz PEP 308, aby uzyskać więcej informacji na temat wyrażeń warunkowych.
Nowość od wersji 2.5.
Operator wyrażenia warunkowego w języku Python został dodany w 2006 r. Jako część propozycji ulepszenia języka Python 308 . Jego forma różni się od zwykłego ?:
operatora i jest:
<expression1> if <condition> else <expression2>
co jest równoważne z:
if <condition>: <expression1> else: <expression2>
Oto przykład:
result = x if a > b else y
Inna składnia, której można użyć (kompatybilna z wersjami wcześniejszymi niż 2.5):
result = (lambda:y, lambda:x)[a > b]()
gdzie operandy są leniwie oceniane .
Innym sposobem jest indeksowanie krotki (co nie jest zgodne z operatorem warunkowym większości innych języków):
result = (y, x)[a > b]
lub jawnie skonstruowany słownik:
result = {True: x, False: y}[a > b]
Inną (mniej niezawodną), ale prostszą metodą jest użycie and
i or
operatory:
result = (a > b) and x or y
jednak to nie zadziała, jeśli x
byłoby False
.
Możliwym obejściem jest wykonanie x
i y
wyświetlenie list lub krotek w następujący sposób:
result = ((a > b) and [x] or [y])[0]
lub:
result = ((a > b) and (x,) or (y,))[0]
Jeśli pracujesz ze słownikami, zamiast trójkowego warunku, możesz get(key, default)
na przykład skorzystać z :
shell = os.environ.get('SHELL', "/bin/sh")
Źródło: ?: W Python na Wikipedii
result = {1: x, 0: y}[a > b]
jest innym możliwym wariantem ( True
i False
faktycznie są liczbami całkowitymi z wartościami 1
i 0
)
Niestety
(falseValue, trueValue)[test]
rozwiązanie nie ma zwarć; więc zarówno falseValue
i trueValue
są oceniane niezależnie od warunków. To może być panującymi lub nawet buggy (czyli zarówno trueValue
i falseValue
może być metody i mają skutki uboczne).
Jednym z takich rozwiązań byłoby
(lambda: falseValue, lambda: trueValue)[test]()
(wykonanie opóźnione do momentu poznania zwycięzcy;)), ale wprowadza niespójność między obiektami, które można wywoływać, a obiektami, których nie można wywołać. Ponadto nie rozwiązuje problemu przy korzystaniu z właściwości.
I tak oto historia - wybór pomiędzy 3 wymienionymi rozwiązaniami jest kompromisem między posiadaniem funkcji zwarcia, używaniem co najmniej honython 2.5 (IMHO już nie stanowi problemu) i niepodatnością na błędy „ trueValue
-szacowania-do-fałszowania” .
if else if
.
Tutaj próbuję tylko pokazać ważną różnicę ternary operator
między kilkoma językami programowania.
Operator trójskładnikowy w JavaScript
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
Trójskładnikowy w Ruby
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
Operator trójskładnikowy w Scali
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
Operator trójskładnikowy w programowaniu R.
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
Operator trójskładnikowy w języku Python
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
Dla Python 2.5 i nowszych istnieje specjalna składnia:
[on_true] if [cond] else [on_false]
W starszych pytonach operator trójskładnikowy nie jest zaimplementowany, ale można go zasymulować.
cond and on_true or on_false
Istnieje jednak potencjalny problem, który jeśli zostanie cond
oceniony True
i on_true
oceni, False
to on_false
zostanie zwrócony zamiast on_true
. Jeśli chcesz mieć takie zachowanie, metoda jest OK, w przeciwnym razie użyj tego:
{True: on_true, False: on_false}[cond is True] # is True, not == True
które można owinąć:
def q(cond, on_true, on_false)
return {True: on_true, False: on_false}[cond is True]
i używał w ten sposób:
q(cond, on_true, on_false)
Jest kompatybilny ze wszystkimi wersjami Pythona.
q("blob", on_true, on_false)
zwraca on_false
, natomiast on_true if cond else on_false
zwraca on_true
. Rozwiązaniem jest zastąpienie cond
ze cond is not None
w tych przypadkach, mimo że nie jest to idealne rozwiązanie.
bool(cond)
zamiast cond is True
? Pierwszy sprawdza prawdziwość cond
, drugi sprawdza równość wskaźnika z True
obiektem. Jak podkreśla @AndrewCecil, "blob"
jest to prawda, ale tak jest is not True
.
[on_false, on_True][cond is True]
więc wyrażenie staje się krótsze.
Często możesz znaleźć
cond and on_true or on_false
ale prowadzi to do problemu, gdy on_true == 0
>>> x = 0
>>> print x == 0 and 0 or 1
1
>>> x = 1
>>> print x == 0 and 0 or 1
1
gdzie można oczekiwać tego od normalnego operatora trójskładnikowego
>>> x = 0
>>> print 0 if x == 0 else 1
0
>>> x = 1
>>> print 0 if x == 0 else 1
1
Czy Python ma trójskładnikowy operator warunkowy?
Tak. Z pliku gramatyki :
test: or_test ['if' or_test 'else' test] | lambdef
Część zainteresowania to:
or_test ['if' or_test 'else' test]
Tak więc trójskładnikowa operacja warunkowa ma postać:
expression1 if expression2 else expression3
expression3
będzie leniwie oceniany (to znaczy oceniany tylko wtedy, gdy expression2
jest fałszywy w kontekście logicznym). Ze względu na definicję rekurencyjną można je łączyć w nieskończoność (choć może to uważać za zły styl).
expression1 if expression2 else expression3 if expression4 else expression5 # and so on
Zauważ, że po każdym if
musi nastąpić znak else
. Dla osób uczących się ze zrozumieniem list i wyrażeń generatora może to być trudna lekcja - poniższe czynności nie będą działać, ponieważ Python oczekuje trzeciego wyrażenia dla innej osoby:
[expression1 if expression2 for element in iterable]
# ^-- need an else here
co podnosi SyntaxError: invalid syntax
. Tak więc powyższe jest albo niekompletną logiką (być może użytkownik spodziewa się braku operacji w fałszywym stanie), albo może być zamierzone użycie wyrażenia2 jako filtru - zauważa, że następujące jest legalne Python:
[expression1 for element in iterable if expression2]
expression2
działa jako filtr do zrozumienia listy i nie jest trójskładnikowym operatorem warunkowym.
Może być trochę bolesne napisać następujące rzeczy:
expression1 if expression1 else expression2
expression1
będzie musiał zostać oceniony dwukrotnie przy powyższym użyciu. Może ograniczyć nadmiarowość, jeśli jest to po prostu zmienna lokalna. Jednak powszechnym i wydajnym idiomem Pythona dla tego przypadku użycia or
jest zachowanie skrótu:
expression1 or expression2
co jest równoważne w semantyce. Zwróć uwagę, że niektóre przewodniki po stylach mogą ograniczać to użycie ze względu na przejrzystość - dodaje dużo znaczenia w bardzo małej składni.
expression1 or expression2
są podobne i mają takie same wady / zalety jak expression1 || expression2
w javascript
expressionN
we wszystkich instancjach jest spójne, łatwiejsze jest zrozumienie nazewnictwa, które odróżniało warunkowe wyrażenie testowe od dwóch wyrażeń wynikowych; np result1 if condition else result2
. Jest to szczególnie widoczne, gdy gniazdowania (aka łańcuchowym) result1 if condition1 else result2 if condition2 else result3
. Widzisz, o ile lepiej to czyta w ten sposób?
Symulacja trójskładnikowego języka python.
Na przykład
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()
wynik:
'b greater than a'
result = (y, x)[a < b]
dlaczego korzystasz z lambda
funkcji ?
Trójskładnikowy operator warunkowy pozwala po prostu przetestować warunek w jednym wierszu, zastępując multilinię, jeśli w przeciwnym razie kod jest zwarty.
[on_true] if [wyrażenie] else [on_false]
# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min) # Output: 10
# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10
# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
if a > b else "b is greater than a")
Powyższe podejście można zapisać jako:
# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
if a > b:
print("a is greater than b")
else:
print("b is greater than a")
else:
print("Both a and b are equal")
# Output: b is greater than a
if-else
nie jest w rzeczywistości przepisywaniem operatora trójskładnikowego i będzie generować różne dane wyjściowe dla wybranych wartości aib (szczególnie jeśli jest to typ, który implementuje dziwną __ne__
metodę).
możesz to zrobić :-
[condition] and [expression_1] or [expression_2] ;
Przykład:-
print(number%2 and "odd" or "even")
Spowoduje to wydrukowanie „nieparzystej”, jeśli liczba jest nieparzysta, lub „parzystej”, jeśli liczba jest parzysta.
Uwaga :- 0, Brak, Fałsz, emptylist, emptyString ocenia się jako False. A wszelkie dane inne niż 0 mają wartość True.
jeśli warunek [warunek] stanie się „Prawdą”, wówczas wyrażenie_1 zostanie ocenione, ale nie wyrażenie_2. Jeśli my "i" coś z 0 (zero), wynik zawsze będzie fasle. Więc w poniższej instrukcji,
0 and exp
Wyrażenie exp nie będzie w ogóle oceniane, ponieważ „i” z 0 zawsze będzie oceniać na zero i nie ma potrzeby oceny wyrażenia. Tak działa sam kompilator we wszystkich językach.
W
1 or exp
wyrażenie exp nie będzie w ogóle oceniane, ponieważ „lub” z 1 zawsze będzie wynosić 1. Więc nie będzie kłopotać się oceną wyrażenia exp, ponieważ wynik i tak będzie wynosił 1. (metody optymalizacji kompilatora).
Ale w przypadku
True and exp1 or exp2
Drugie wyrażenie exp2 nie będzie odtąd oceniane True and exp1
byłoby prawdziwe, gdy exp1 nie jest fałszywe.
Podobnie w
False and exp1 or exp2
Wyrażenie exp1 nie zostanie ocenione, ponieważ False jest równoznaczne z zapisaniem 0 i zrobieniem „, a” z 0 byłoby 0, ale po exp1, ponieważ użyto „lub”, oceni wyrażenie exp2 po „lub”.
Uwaga: - Tego rodzaju rozgałęzienia za pomocą „lub” i „i” można użyć tylko wtedy, gdy wyrażenie_1 nie ma wartości Prawdy Fałsz (lub 0 lub Brak lub pusta lista [] lub pusty ciąg „”.), Ponieważ jeśli wyrażenie_1 staje się Fałsz, wówczas wyrażenie_2 zostanie ocenione ze względu na obecność „lub” między exp_1 a exp_2.
Jeśli nadal chcesz, aby działał we wszystkich przypadkach, niezależnie od wartości prawdy exp_1 i exp_2, wykonaj następujące czynności:
[condition] and ([expression_1] or 1) or [expression_2] ;
x = [condition] and ([expression_1] or 1) or [expression_2]
i expression_1
FALSE, x
będzie 1
, nie expression_1
. Użyj zaakceptowanej odpowiedzi.
Bardziej wskazówka niż odpowiedź (nie trzeba powtarzać oczywistości dla setnego czasu), ale czasami używam jej jako skrótu oneliner w takich konstrukcjach:
if conditionX:
print('yes')
else:
print('nah')
, staje się:
print('yes') if conditionX else print('nah')
Niektórzy (wielu :) mogą się na to uważać za niepytonicznych (nawet rubinowych :), ale osobiście uważam, że jest to bardziej naturalne - tj. Jak wyrażasz to normalnie, a także trochę bardziej atrakcyjne wizualnie w dużych blokach kodu.
print( 'yes' if conditionX else 'nah' )
twoją odpowiedź. :-)
print()
w obu przypadkach - i wygląda trochę bardziej pytonicznie, muszę przyznać :) Ale co, jeśli wyrażenia / funkcje nie są takie same - jak print('yes') if conditionX else True
- aby uzyskać print()
jedyną prawdęconditionX
print('yes') if conditionX else print('nah')
jest to, że daje błąd SyntaxError w Python2.
print "yes"
podczas gdy w Python 3 jest funkcją - print("yes")
. Można to rozwiązać, używając go jako instrukcji lub lepiej - from future import print_function
.
Jedna z alternatyw dla wyrażenia warunkowego Pythona
"yes" if boolean else "no"
jest następujący:
{True:"yes", False:"no"}[boolean]
który ma następujące ładne rozszerzenie:
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
Najkrótszą alternatywą pozostaje:
("no", "yes")[boolean]
ale nie ma alternatywy dla
yes() if boolean else no()
jeśli chcesz uniknąć oceny yes()
i no()
, ponieważ w
(no(), yes())[boolean] # bad
zarówno no()
i yes()
są oceniane.
Wiele języków programowania pochodzących z C
zazwyczaj ma następującą składnię trójskładnikowego operatora warunkowego:
<condition> ? <expression1> : <expression2>
Początkowo
Python
B enevolent D ictator F lub L IFE (mam na myśli Guido van Rossum, oczywiście) odrzucił (jako non-pythonic stylu), ponieważ jest to dość trudne do zrozumienia dla ludzi nie wykorzystywanych doC
języka. Również znak dwukropka:
ma już wiele zastosowańPython
. Po zatwierdzeniu PEP 308Python
ostatecznie otrzymało własne wyrażenie warunkowe skrótu (którego używamy teraz):
<expression1> if <condition> else <expression2>
Więc po pierwsze ocenia warunek. Jeśli zwróci True
, wyrażenie1 zostanie ocenione, aby dać wynik, w przeciwnym razie wyrażenie2 zostanie ocenione. Ze względu na mechanikę Lazy Evaluation - zostanie wykonane tylko jedno wyrażenie.
Oto kilka przykładów (warunki będą oceniane od lewej do prawej):
pressure = 10
print('High' if pressure < 20 else 'Critical')
# Result is 'High'
Operatory trójskładnikowe można łączyć szeregowo:
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')
# Result is 'Normal'
Poniższy jest taki sam jak poprzedni:
pressure = 5
if pressure < 20:
if pressure < 10:
print('Normal')
else:
print('High')
else:
print('Critical')
# Result is 'Normal'
Mam nadzieję że to pomoże.
Jak już odpowiedziano, tak, w pythonie jest operator trójskładnikowy:
<expression 1> if <condition> else <expression 2>
Dodatkowe informacje:
Jeśli <expression 1>
jest to warunek, możesz użyć oceny krótkiego obwodu :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or b
PS: Oczywiście ocena zwarcia nie jest operatorem trójskładnikowym, ale często trójskładnik jest używany w przypadkach, w których zwarcie byłoby wystarczające.
short-circuit
oceną.
TAK, python ma operator trójskładnikowy, oto składnia i przykładowy kod pokazujący to samo :)
#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false
a= input("Enter the First Number ")
b= input("Enter the Second Number ")
print("A is Bigger") if a>b else print("B is Bigger")
print
naprawdę nie jest dobrym wyborem, ponieważ da to błąd SyntaxError w Python2.
Python ma trójskładnikową formę przypisań; jednak może istnieć jeszcze krótsza forma, o której ludzie powinni wiedzieć.
Bardzo często konieczne jest przypisanie do zmiennej jednej lub innej wartości w zależności od warunku.
>>> li1 = None
>>> li2 = [1, 2, 3]
>>>
>>> if li1:
... a = li1
... else:
... a = li2
...
>>> a
[1, 2, 3]
^ To długa forma wykonywania takich zadań.
Poniżej znajduje się trójskładnikowa forma. Ale to nie jest najbardziej zwięzły sposób - patrz ostatni przykład.
>>> a = li1 if li1 else li2
>>>
>>> a
[1, 2, 3]
>>>
Dzięki Pythonowi możesz po prostu używać or
do alternatywnych zadań.
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
Powyższe działa odtąd li1
jest, None
a interpretuje to jako False w wyrażeniach logicznych. Inter interpretuje następnie i ocenia drugie wyrażenie, które nie jest None
i nie jest pustą listą - więc zostaje przypisane do.
Działa to również z pustymi listami. Na przykład, jeśli chcesz przypisać a
listę, która zawiera elementy.
>>> li1 = []
>>> li2 = [1, 2, 3]
>>>
>>> a = li1 or li2
>>>
>>> a
[1, 2, 3]
>>>
Wiedząc o tym, możesz po prostu wykonywać takie zadania za każdym razem, gdy je napotkasz. Działa to również z ciągami znaków i innymi iteracjami. Możesz przypisać a
dowolny ciąg znaków, który nie jest pusty.
>>> s1 = ''
>>> s2 = 'hello world'
>>>
>>> a = s1 or s2
>>>
>>> a
'hello world'
>>>
Zawsze podobała mi się składnia trójskładnikowa C, ale Python idzie o krok dalej!
Rozumiem, że niektórzy mogą powiedzieć, że nie jest to dobry wybór stylistyczny, ponieważ opiera się na mechanice, która nie jest od razu widoczna dla wszystkich programistów. Ja osobiście nie zgadzam się z tym punktem widzenia. Python jest językiem bogatym w składnię i zawiera wiele idiomatycznych sztuczek, które nie są od razu widoczne dla dablera. Ale im więcej uczysz się i rozumiesz mechanikę bazowego systemu, tym bardziej go doceniasz.
Inne odpowiedzi poprawnie mówią o trójskładnikowym języku Python. Chciałbym uzupełnić, wymieniając scenariusz, w którym operator trójskładnikowy jest często używany, ale dla którego istnieje lepszy idiom. Jest to scenariusz użycia wartości domyślnej.
Załóżmy, że chcemy użyć option_value
wartości domyślnej, jeśli nie jest ustawiona:
run_algorithm(option_value if option_value is not None else 10)
lub po prostu
run_algorithm(option_value if option_value else 10)
Jednak coraz lepszym rozwiązaniem jest po prostu pisanie
run_algorithm(option_value or 10)
jeśli zmienna jest zdefiniowana i chcesz sprawdzić, czy ma wartość, możesz to zrobić a or b
def test(myvar=None):
# shorter than: print myvar if myvar else "no Input"
print myvar or "no Input"
test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)
wyjdzie
no Input
no Input
no Input
hello
['Hello']
True
x if x else y
, ale nie x if z else y
.
Świetny sposób na połączenie wielu operatorów:
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'
array = [(0,0),(0,1),(1,0),(1,1)]
for a in array:
x, y = a[0], a[1]
print(f(x,y))
# Output is:
# equal,
# less,
# greater,
# equal
Uciążliwa jest domyślna składnia Pythona val = a if cond else b
, więc czasami robię to:
iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)
Oczywiście ma to tę wadę, że zawsze ocenia obie strony (a i b), ale składnia jest dla mnie o wiele bardziej przejrzysta
val = a if cond else b
stwierdzenie.
is_spacial=True if gender = "Female" else (True if age >= 65 else False)
**
można go zagnieżdżać według potrzeb. powodzenia
**