Mam następujący kod
num1 = 10
someBoolValue = True
Muszę ustawić wartość num1
na, 20
jeśli someBoolValue
jest True
; i nie rób nic innego. Oto mój kod
num1 = 20 if someBoolValue else num1
Czy można w jakiś sposób uniknąć tej ...else num1
części, aby wyglądała czysto? Odpowiednik
if someBoolValue:
num1 = 20
Próbowałem zastępując ją ...else pass
tak: num1=20 if someBoolValue else pass
. Otrzymałem tylko błąd składni. Nie mogłem też po prostu pominąć tej ...else num1
części.
python
if-statement
bdhar
źródło
źródło
num1 = 20 if someBoolValue else 10
. Wtedy też oszczędzasznum1=10
linię?num1
już istnieje ...Odpowiedzi:
Myślę, że nie jest to możliwe w Pythonie, ponieważ to, co faktycznie próbujesz zrobić, prawdopodobnie zostanie rozszerzone do czegoś takiego:
Jeśli wykluczysz
else num1
, otrzymasz błąd składni, ponieważ jestem pewien, że przypisanie musi faktycznie coś zwrócić.Jak już wspominali inni, możesz to zrobić, ale jest to złe, ponieważ prawdopodobnie następnym razem będziesz się mylić, czytając ten fragment kodu:
Nie jestem wielkim fanem z tego
num1 = someBoolValue and 20 or num1
samego powodu. Muszę pomyśleć dwa razy, co robi ta linia.Najlepszym sposobem na osiągnięcie tego, co chcesz, jest oryginalna wersja:
Powodem, dla którego jest to najlepsza wersja, jest to, że jest bardzo oczywiste, co chcesz zrobić, i nie zmylisz siebie ani kogokolwiek innego, kto będzie miał później kontakt z tym kodem.
Poza tym, na marginesie,
num1 = 20 if someBoolValue
jest to poprawny kod Ruby, ponieważ Ruby działa nieco inaczej.źródło
num1 = (20 if someBoolValue else num1)
.Użyj tego:
źródło
W jednej linii:
Ale nie rób tego. Ten styl nie jest zwykle oczekiwany. Ludzie wolą dłuższą formę dla przejrzystości i spójności.
(Należy również unikać czapek wielbłąda. Dlatego raczej używaj
some_bool_value
.)Zwróć uwagę, że wyrażenie w wierszu
some_value if predicate
bezelse
części nie istnieje, ponieważ nie byłoby wartości zwracanej, gdyby predykat był fałszywy. Jednak we wszystkich przypadkach wyrażenia muszą mieć jasno określoną wartość zwracaną. Różni się to od użycia, na przykład w Rubim lub Perlu.źródło
możesz użyć jednego z następujących:
źródło
True
/False
, ponieważbool
jest to podklasaint
. We wszystkich przypadkach, w których test zwraca coś, co po prostu dałoby wynik jako prawda, kończy się niepowodzeniem z wyjątkiem. Drugi działa tylko wtedy, gdytrueVal
sam nie ocenia fałszu, co skutkowałobyfalseVal
przypisaniem, nawet jeśli test byłby prawdziwy.Nie. Myślę, że miałeś nadzieję, że coś takiego
num1 = 20 if someBoolValue
zadziała, ale tak nie jest. Myślę, że najlepszym sposobem jestif
stwierdzenie, które napisałeś:źródło
To moja nowa ostateczna odpowiedź. Wcześniejsza odpowiedź była następująca i była przesada w przypadku podanego problemu. Getting_too_clever ==
not Good
. Oto wcześniejsza odpowiedź ... nadal dobra, jeśli chcesz dodać jedną rzecz doTrue
warunku, a drugą doFalse
:Wspomniałeś,
num1
że miałby już wartość, którą należy zostawić w spokoju. Założyłem,num1 = 10
że to pierwsza wypowiedź postu, więc operacja, do której należy się dostać,20
to dodanie10
.wyprodukował ten wynik
źródło
źródło
Jeśli chcesz wywołać metodę, jeśli jakaś wartość logiczna jest prawdziwa, możesz
else None
zakończyć działanie trójnika.źródło
Jeśli na pewno wydarzy się jeden wiersz kodu, Python 3.8 wprowadza wyrażenia przypisania, pieszczotliwie zwane „operatorem morsa”.
20
Zostanie przypisanynum
jeśli pierwsze wyrażenie logiczne jestTrue
. Przypisanie musi znajdować się tutaj w nawiasach, w przeciwnym razie wystąpi błąd składni.źródło
Dla przyszłych podróżników w czasie z Google, oto nowy sposób (dostępny od Pythona 3.8 i nowszych):
źródło
Zdecydowanie możesz użyć num1 = (20 if someBoolValue else num1), jeśli chcesz.
źródło
Oto, co mogę zasugerować. Użyj innej zmiennej, aby wyprowadzić klauzulę if i przypisz ją do num1.
Kod:
źródło
Inny sposób
num1 = (20*boolVar)+(num1*(not boolVar))
źródło
Możesz to zrobić w ten sposób.
Możesz rozwiązać swój problem w ten sposób, ale użycie „try / except block” nie jest najlepszą praktyką w Pythonie.
źródło