こんにちは、私は鄭兄弟です。Python を始めるのは簡単ですが、マスターするのは難しいです。経験豊富なエンジニアにとってさえ、一部の現象は直感に反するものです。次の 10 の質問は非常に興味深く、挑戦的です。その結果は、あなたを驚かせるかもしれません混乱しています。どれだけ正解できるか見てみましょう?
ここに最初に質問があり、最後に答えがあります。最初に紙を用意し、答えを書き留めて、最後に確認することをお勧めします。
次のコードの出力を記述してください:
class A: def function(self): return A() a = A() A = int print(a.function())
>>> round(7 / 2) >>> round(3 / 2) >>> round(5 / 2)
>>> isinstance(type, object) >>> isinstance(object, type) >>> isinstance(object, object) >>> isinstance(type, type)
>>> any([]) >>> all([])
class A: answer = 42 def __init__(self): self.answer = 21 self.__add__ = lambda x, y: x.answer + y def __add__(self, y): return self.answer - y print(A() + 5)
>>> sum("") >>> sum("", []) >>> sum("", {})
>>> sum([ el.imag for el in [ 0, 5, 10e9, float('inf'), float('nan') ] ])
>>> "this is a very long string" * (-1)
max(-0.0, 0.0)
>>> x = (1 << 53) + 1 >>> x + 1.0 > x
以下の結果はPython 3.8.5バージョンで検証したものです。
class A: def function(self): return A() a = A() A = int print(a.function())
正しい結果は 0:
Python の関数定義は次のとおりであるため、これは難しくありません。実際には、実行可能なステートメントや関数は呼び出される前には存在せず、変数は実際に呼び出されたときにのみバインドされます。
上記の例では、関数定義中に、Python はまだ定義されていないクラスまたは関数への参照を許可します。ただし、実行中、A はすでに int クラスです。つまり、関数メソッドは新しく作成された int インスタンス (デフォルト値は 0) を返します。
A = int がない場合、結果は次のようになります:
>>> round(7/2) 4 >>> round(3/2) 2 >>> round(5/2) 2
正しい結果は 4 2 2 ですが、最後のround(2.5) == 2 は数学のルールに少し反していると感じるはずです。これは、Python のround メソッドがバンカーの丸め [1] を実装しているためです。最も近い偶数に丸められます。
>>> isinstance(type, object) True >>> isinstance(object, type) True >>> isinstance(object, object) True >>> isinstance(type, type) True >>>
はどちらも True です。object と true は同じものなのでしょうか?
Python では、すべてが次のようになります。はオブジェクトであるため、オブジェクトのインスタンス チェックはすべて True を返します。
isinstance(Anything, object) #=> True。
type は、すべての Python 型の構築に使用されるメタクラスを表します。したがって、すべての型 (int、str、object) は型クラスのインスタンスであり、これも Python のすべてのオブジェクトと同様にオブジェクトです。ただし、type は、Python でそれ自体のインスタンスである唯一のオブジェクトです。
>>> type(1) <class 'int'> >>> type(int) <class 'type'> >>> type(type) <class 'type'> >>>
>>> any([]) False >>> all([]) True >>> any([True,False]) True >>> all([True,False]) False >>>
パラメータが空のリストの場合、any および all の結果は少し予期せぬものになります。しかし、チェック ロジックを理解すると、それは理にかなっています:
Python の論理演算子は遅延しています。any のアルゴリズムは、初めて true と思われる要素を見つけることです。見つからない場合は、False を返します。シーケンスは空であるため、どの要素も true になることができないため、any([]) は False を返します。
同様に、all アルゴリズムは最初の false 要素を検索します。見つからない場合は True を返します。空のシーケンスには false 要素がないため、all([]) は True を返します。これは少し空虚な真実の概念ですか? ?
class A: answer = 42 def __init__(self): self.answer = 21 self.__add__ = lambda x, y: x.answer + y def __add__(self, y): return self.answer - y print(A() + 5)
正しい結果は: 16:
オブジェクト関数の検索順序は、インスタンス レベル > クラス レベル > 親クラス レベルです。上記のコードでは、初期化中にバインドされた関数がインスタンス レベルで、クラス内で定義された関数がクラスのレベル。
ただし、二重アンダースコアで囲まれたマジック関数はこのルールには含まれません。つまり、Python は最初にクラスレベルのマジック関数を検索します。
二重下線を削除すると、結果は 26 になります:
##6>>> sum("") 0 >>> sum("", []) [] >>> sum("", {}) {}
sum(iterable, /, start=0)
>>> sum([ ... el.imag ... for el in [ ... 0, 5, 10e9, float('inf'), float('nan') ... ] ... ]) 0.0
>>> "this is a very long string" * (-1) '' >>>
正确的结果是 '',所有的负数倍的字符串,都当作 0 倍,返回 ''。
max(-0.0, 0.0)
为什么会这样?出现这种情况是由于两个原因。负零和零在 Python 中被视为相等。max 的逻辑是,如果多个最大值,返回遇到的第一个。因此 max 函数返回第一次出现的零,它恰好是负数。
>>> x = (1 << 53) + 1 >>> x + 1.0 > x False
正确的结果是 False,这违反了数学规则啊,为什么呢?
这种违反直觉的行为归咎于三件事:长算术、浮点精度限制和数值比较。
Python 可以支持非常大的整数,如果隐式超过限制则切换计算模式,但 Python 中的浮点精度是有限的。
2⁵³ + 1 = 9007199254740993
是不能完全表示为 Python 浮点数的最小整数。因此,为了执行加 1.0,Python 将 9007199254740993 转换为 float,将其四舍五入为 Python 可以表示的 9007199254740992.0,然后向其添加 1.0,但由于相同的表示限制,它将其设置回 9007199254740992.0:
>>> float(9007199254740993) 9007199254740992.0 >>> 9007199254740992.0 + 1.0 9007199254740992.0 >>>
此外 Python 在 float 与 int 比较时并不会抛出错误,也不会尝试将两个操作数转换为相同的类型。相反,他们比较实际的数值。因为 9007199254740992.0 比 9007199254740993 小,因此 Python 返回 False。
以上がさあ、Python の 10 個の質問に挑戦してみませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。