ホームページ > バックエンド開発 > Python チュートリアル > さあ、Python の 10 個の質問に挑戦してみませんか?

さあ、Python の 10 個の質問に挑戦してみませんか?

WBOY
リリース: 2023-05-02 11:16:06
転載
1058 人が閲覧しました

こんにちは、私は鄭兄弟です。Python を始めるのは簡単ですが、マスターするのは難しいです。経験豊富なエンジニアにとってさえ、一部の現象は直感に反するものです。次の 10 の質問は非常に興味深く、挑戦的です。その結果は、あなたを驚かせるかもしれません混乱しています。どれだけ正解できるか見てみましょう?

ここに最初に質問があり、最後に答えがあります。最初に紙を用意し、答えを書き留めて、最後に確認することをお勧めします。

次のコードの出力を記述してください:

1. Lazy Python

class A:
def function(self):
return A()
a = A()
A = int
print(a.function())
ログイン後にコピー
ログイン後にコピー

2. Rounding

>>> round(7 / 2)
>>> round(3 / 2)
>>> round(5 / 2)
ログイン後にコピー

3.type and object

>>> isinstance(type, object)
>>> isinstance(object, type)
>>> isinstance(object, object)
>>> isinstance(type, type)
ログイン後にコピー

4. 空のブール値

>>> any([])
>>> all([])
ログイン後にコピー

5. クラス内部関数の優先順位

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)
ログイン後にコピー
ログイン後にコピー

6.Sum

>>> sum("")
>>> sum("", [])
>>> sum("", {})
ログイン後にコピー

7. 予期しない属性

>>> sum([
el.imag 
for el in [
0, 5, 10e9, float('inf'), float('nan')
]
])
ログイン後にコピー

8. 負の数の倍数である文字列を出力します

>>> "this is a very long string" * (-1)
ログイン後にコピー

9. 負の数 0

max(-0.0, 0.0)
ログイン後にコピー
ログイン後にコピー

10. 数学の規則に違反します

>>> x = (1 << 53) + 1
>>> x + 1.0 > x
ログイン後にコピー

解答と解説

以下の結果はPython 3.8.5バージョンで検証したものです。

1. Lazy Python

class A:
def function(self):
return A()
a = A()
A = int
print(a.function())
ログイン後にコピー
ログイン後にコピー

正しい結果は 0:

来挑战下这十个 Python 问题,你会吗?

Python の関数定義は次のとおりであるため、これは難しくありません。実際には、実行可能なステートメントや関数は呼び出される前には存在せず、変数は実際に呼び出されたときにのみバインドされます。

上記の例では、関数定義中に、Python はまだ定義されていないクラスまたは関数への参照を許可します。ただし、実行中、A はすでに int クラスです。つまり、関数メソッドは新しく作成された int インスタンス (デフォルト値は 0) を返します。

A = int がない場合、結果は次のようになります:

来挑战下这十个 Python 问题,你会吗?

2.Rounding

>>> round(7/2)
4
>>> round(3/2)
2
>>> round(5/2)
2
ログイン後にコピー

正しい結果は 4 2 2 ですが、最後のround(2.5) == 2 は数学のルールに少し反していると感じるはずです。これは、Python のround メソッドがバンカーの丸め [1] を実装しているためです。最も近い偶数に丸められます。

3.type と object

>>> 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'>
>>> 
ログイン後にコピー

4.空のブール値

>>> 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 を返します。これは少し空虚な真実の概念ですか? ?

5.クラス内部関数の優先順位

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 问题,你会吗?

オブジェクト関数の検索順序は、インスタンス レベル > クラス レベル > 親クラス レベルです。上記のコードでは、初期化中にバインドされた関数がインスタンス レベルで、クラス内で定義された関数がクラスのレベル。

ただし、二重アンダースコアで囲まれたマジック関数はこのルールには含まれません。つまり、Python は最初にクラスレベルのマジック関数を検索します。

二重下線を削除すると、結果は 26 になります:

来挑战下这十个 Python 问题,你会吗?

##6

.Sum
>>> sum("")
0
>>> sum("", [])
[]
>>> sum("", {})
{}
ログイン後にコピー

To Figureここで何が起こっているのかを確認するには、sum 関数の署名を確認する必要があります。

sum(iterable, /, start=0)
ログイン後にコピー

sum は、反復可能な項目を左から右に合計し、合計を返します。 iterable は通常数値であり、開始値を文字列にすることはできません。

上記のすべてのケースでは、空の文字列は空のシーケンスとして扱われるため、sum は単純に開始引数を合計結果として返します。最初のケースではデフォルトでゼロが設定され、2 番目と 3 番目のケースでは開始引数として渡される空のリストと辞書を意味します。

7

.予期しない属性
>>> sum([
... el.imag
... for el in [
... 0, 5, 10e9, float('inf'), float('nan')
... ]
... ])
0.0
ログイン後にコピー

上記のコードには ima 属性がありますが、それをまったく定義していないため、実行時にエラーは報告されませんでした。 ?

これは、Python のすべての数値型 (int、real、float) が基本オブジェクト クラスから継承しており、それぞれ実数部と虚数部を返す real 属性と imag 属性をサポートしているためです。これには、Infinity と NaN も含まれます。

8.输出负数倍的字符串

>>> "this is a very long string" * (-1)
''
>>>
ログイン後にコピー

正确的结果是 '',所有的负数倍的字符串,都当作 0 倍,返回 ''。

9.见过负数的 0.0

max(-0.0, 0.0)
ログイン後にコピー
ログイン後にコピー

为什么会这样?出现这种情况是由于两个原因。负零和零在 Python 中被视为相等。max 的逻辑是,如果多个最大值,返回遇到的第一个。因此 max 函数返回第一次出现的零,它恰好是负数。

10.违反数学规则

>>> 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート