int(number)はフローリング型変換であることがドキュメントに明確に記載されています。
int(1.23)
1
また、int(string)は、文字列が整数リテラルである場合にのみintを返します。
int('1.23')
ValueError
int('1')
1
その特別な理由はありますか?あるケースでは関数がフロアになり、他のケースではフロアにならないのは直感に反します。
回答:
特別な理由はありません。Pythonは、PerlやJavascriptなどの言語で、特に初心者にとって問題のよく知られた原因である暗黙の変換を実行しないという一般原則を単に適用しています。
int(some_string)文字列を整数形式に変換する明示的な要求です。この変換の規則では、文字列に有効な整数リテラル表現が含まれている必要があると指定されています。int(float)floatを整数に変換する明示的な要求です。この変換のルールは、フロートの小数部分が切り捨てられることを指定しています。
インタプリタint("3.1459")を返すためには3、文字列を暗黙的にfloatに変換する必要があります。Pythonは暗黙的な変換をサポートしていないため、代わりに例外を発生させることを選択します。
これはほぼ間違いなく、Zen ofPythonの3つの原則を適用する場合です。
明示的の方が暗黙的です。
[...]実用性は純粋さを打ち負かす
エラーは黙って通過してはいけません
ある割合の時間、誰かint('1.23')がユースケースに対して間違った変換を呼び出しており、floatまたはdecimal.Decimalその代わりに何かを望んでいます。このような場合、間違った値を黙って与えるよりも、修正できる即時エラーを取得する方が明らかに優れています。
あなたがいる場合にはないint型に、明示的にそれを通すことによってそうすることが自明であることを切り詰めたいfloatまず、その後の1呼び出しint、round、trunc、floorまたはceil必要に応じてを。これにより、コードがより自己文書化intさfloatれ、丸められた値が必要なものであることを明確にすることで、仮想のサイレント切り捨て呼び出しを後で変更することを防ぎます。
思考実験が役立つ場合があります。
int('1.23')エラーで失敗します。これは既存の動作です。int('1.23')生成され1ます。これがあなたが提案していることです。動作Aを使用すると、動作Bの効果を得るのは簡単で簡単int(float('1.23'))です。代わりに使用してください。
一方、動作Bの場合、動作Aの効果を取得することは非常に複雑です。
def parse_pure_int(s):
if "." in s:
raise ValueError("invalid literal for integer with base 10: " + s)
return int(s)
(そして、上記のコードを使用しても、誤って処理されるコーナーケースがないことを完全に確信しているわけではありません。)
したがって、行動Aは行動Bよりも表現力があります。
考慮すべきもう1つのこと'1.23'は、浮動小数点値の文字列表現です。'1.23'整数への変換には、概念的には2つの変換(文字列から浮動小数点、整数)が含まれますがint(1.23)、int('1')それぞれに1つの変換のみが含まれます。
編集:
そして実際、上記のコードは扱えないだろうとコーナーケースがあります1e-2し、1E-2両方あまりにも浮動小数点値をしています。
int('123E-2')またはかもしれませんint('1L')。
簡単に言えば、それらは同じ機能ではありません。
これらは、整数を返す同じ名前の2つの異なる関数ですが、異なる関数です。
'int'は短くて覚えやすく、各タイプに適用されるその意味はほとんどのプログラマーにとって直感的であるため、彼らはそれを選択しました。
それらが同じまたは組み合わせた機能を提供しているという意味はありません。それらは単に同じ名前を持ち、同じタイプを返します。それらは「floorDecimalAsInt」および「convertStringToInt」と簡単に呼ぶことができますが、覚えやすく(99%)直感的で混乱がほとんど発生しないため、「int」を選択しました。
「4.5」などの小数点を含むテキストの整数としてテキストを解析すると、ほとんどのコンピューター言語でエラーがスローされ、ほとんどのプログラマーはエラーをスローすると予想されます。これは、テキスト値が整数を表していないためです。彼らは誤ったデータを提供しています
intは、それがタイプ(およびそれに組み込まれているタイプ)であることを覚えておくと役立つ場合があります。その作成者(__new__)は、いくつかの可能な引数タイプを取ります。各タイプの動作は明確に定義されています。
int事実ではないが、その機能タイプ、である__new__および__init__それぞれ適切に対処する方法文字列またはfloat型の引数を取り、。この型は2つの引数型を異なる方法で処理すると言う方が正確ですが、1つしかありませんint。
type(3)を返します<type int>。ただし、Pythonはについて文句を言いませんfloat("3")。Pythonは暗黙的に文字列をintに変換してからfloatに変換しませんか?