次の Python 関数が与えられた場合 (欠点は無視します):
def adjust_year(year):
return year > 2000 and year - 2000 or year - 1900
代わりに次のように変更すると:
def adjust_year(year):
return year - 2000 if year > 2000 else year - 1900
動作は同等ですか、それとも微妙な方法で変更しましたか?
次の Python 関数が与えられた場合 (欠点は無視します):
def adjust_year(year):
return year > 2000 and year - 2000 or year - 1900
代わりに次のように変更すると:
def adjust_year(year):
return year - 2000 if year > 2000 else year - 1900
動作は同等ですか、それとも微妙な方法で変更しましたか?
それらは確かに同等ですが、条件式のバリエーションが推奨されます。
あなたの式and ... or
は、真ん中の式が偽の値に評価されるという典型的な落とし穴を狭く回避します(year >= 2000 and year - 2000 or year - 1900
そしてyear = 2000
結果として100
)。
これに対処するにはいくつかの方法があります。1 つは、両方のバージョンを論理的に分析することです。もう 1 つは、ブルート フォースを使用して、すべての有効な入力の結果を比較することです。
def adjust_year_1(year):
return year > 2000 and year - 2000 or year - 1900
def adjust_year_2(year):
return year - 2000 if year > 2000 else year - 1900
for y in range(-4000, 4000):
if adjust_year_1(y) != adjust_year_2(y):
print y, adjust_year_1(y), adjust_year_2(y)
これは何も出力せず、関数が -4000 から 4000 の間で実際に同等であることを示しています (この範囲外の入力に対しても同等であることは簡単にわかります)。