最近、Python の人気が高まっているため、Python に関する技術面接を受けている方も多いのではないでしょうか。この投稿では、高度な Python の面接に関する 10 の質問と回答をリストします。
これらは混乱を招く可能性があり、言語としての Python と、Python が舞台裏でどのように機能するかを十分に理解する必要がある中級の開発者を対象としています。
1. Nolocal キーワードと Global キーワードの目的は何ですか?
これら 2 つのキーワードは、以前に宣言された変数のスコープを変更するために使用されます。nolocal は、ネストされた関数内の変数にアクセスする必要がある場合によく使用されます。nolocalで宣言された変数は、ローカル変数でもグローバル変数でもなく、外側のネストされた関数内の変数です。
def func1():
x = 5
def func2():
nolocal x
print(x)
func2()
global は、より直接的なディレクティブです。以前に宣言された変数をグローバルにします。たとえば、次のコードを検討してください。
x = 5
def func1():
print(x)
func1()
> >> 5
xは関数呼び出しの前に宣言されているため、 func1 は xにアクセスできます。ただし、変更しようとすると、次のようになります。
x = 5
def func2():
x += 3
func2()
> >> UnboundLocalError: 代入前にローカル変数 'c' が参照されました
これが機能するためには、x によってグローバル変数xを参照していることを示す必要があります。
x = 5
def func2():
グローバル x
x += 3
func2()
2.クラス メソッドと静的メソッドの違いは何ですか?
どちらも、クラスのオブジェクトをインスタンス化せずに呼び出すことができるクラス メソッドを定義します。唯一の違いは署名です。
クラス:
@staticmethod
def func1():
パス
@classmethod
def func2(cls):
パス
ご覧のとおり、classmethod はクラスA自体に設定される暗黙のパラメーターclsを受け入れます。classmethod の一般的な使用例は、代替の継承可能なコンストラクターを作成することです。
3. GIL とは何ですか? また、GIL を回避する方法は何ですか?
GIL は Global Interpreter Lock の略で、Python が並行性のために使用するメカニズムです。これは Python システムの奥深くに組み込まれており、現在のところ、これを取り除く方法はありません。GIL の主な欠点は、スレッドが完全に並行でなくなることです。インタープリターがロックされ、スレッドを使用しているように見えても、同時に実行されないため、パフォーマンスが低下します。これを回避するいくつかの方法を次に示します。
- マルチプロセッシングモジュール。これにより、新しい Python プロセスを生成し、スレッドを管理するのと同じ方法でそれらを管理できます。
- 非同期モジュール。非同期プログラミングを効果的に有効にし、async/await構文を追加します。GIL の問題は修正されませんが、コードがより読みやすく、よりクリーンになります。
- Stackless_Python . これは、GIL を使用しない Python のフォークです。その最も顕著な用途は、EVE Online ゲームのバックエンドとしてです。
3.メタクラスとは何ですか? また、いつ使用するのですか?
メタクラスはクラスのクラスです。継承が複雑すぎる場合、メタクラスは多くのクラスに共通する特定の動作を指定できます。一般的なメタクラスはABCMetaで、抽象クラスの作成に使用されます。
Python のメタクラスとメタプログラミングは大きなトピックです。これに興味がある場合は、必ず詳細をお読みください。
4.クラスアノテーションとは? ジェネリック クラス アノテーションとは
Python は動的に型付けされる言語ですが、わかりやすくするためにクラスに注釈を付ける方法があります。これらは組み込みタイプです。
- 整数
- 浮く
- ブール
- 力
- バイト
型付けモジュールは複雑な型を提供します:
- リスト
- 設定
- 辞書
- タプル
- オプション
- 等。
クラス注釈を使用して関数を定義する方法は次のとおりです。
def func1(x: int, y: str) -> bool: False
を返す
ジェネリック クラス アノテーションは、別のクラス タイプをパラメーターとして受け取るアノテーションであり、複雑なロジックを指定できます。
- リスト[int]
- オプション[リスト[int]]
- タプル[ブール値]
これらは警告と静的型チェック専用であることに注意してください。実行時にこれらの型を保証することはできません。
5.ジェネレータ関数とは? 範囲の独自のバージョンを作成する
ジェネレーター関数は、後で実行を再開して別の値を返すために、値を返した後に実行を中断できる関数です。これは、return の代わりに使用するpass キーワードによって実装されるyieldです。これまでに使用する最も一般的なジェネレータ関数はrangeです. これを行う 1 つの方法を次に示します (正のステップについてのみ、負のステップをサポートするメソッドを作成する演習として残します)。
def range ( start, end, step):
cur = start while cur > end: yield cur cur += step
6. Python のデコレータとは?
Python のデコレーターは、関数の動作を変更するために使用されます。たとえば、特定の関数セットへのすべての呼び出しを記録したい場合、それらの引数と戻り値をキャッシュし、ベンチマークを実行します。
デコレータには@という記号が前に付き、関数宣言の前に配置されます。
@my_decorator
def func1():
パス
7. Python での酸洗いと酸洗い解除とは?
シリアル化の Python 方式. Pickling を使用すると、オブジェクトを文字列 (または選択したもの) にシリアル化し、永続的なストレージやネットワーク経由で送信できます。Unpickling は、文字列から元のオブジェクトを復元するプロセスです。ピクルスは安全ではありません。信頼できるソースからのみオブジェクトをプルします。
基本的なデータ構造をピクルする方法は次のとおりです。
import pickle
cars = {"Subaru": "best car", "Toyota": "no i am the best car"} cars_serialized = pickle.dumps(cars) # cars_serialized 是一字节串new_cars = pickle.loads(cars_serialized
)
8. *args Python **kwargs関数とは?
これらは開梱と密接に関連しています。*args を関数の引数リストに入れると、名前のない引数はすべてargs配列に格納されます。**kwargs も同じように機能しますが、名前付き引数の場合:
def func1(*args, **kwargs):
print(args)
print(kwargs)
func1(1, 'abc', lol='lmao')
> [1, 'abc']
> {"lol": "lmao" }
9. .pycファイルの用途は?
.pyc.classファイルには、Java のファイルと同じように、Python バイトコードが含まれています。ただし、このコンパイル フェーズはプログラムの実行時に発生するため、Python は依然としてインタープリター言語と見なされますが、Java ではこれらは明確に分離されています。
10. Python で抽象クラスを定義するにはどうすればよいですか?
ABCモジュールからクラスを継承して、抽象クラスabcを定義します。
from abc i import ABC , abstractmethod
class AbstractCar(ABC):
@abstractmethod
def drive(self):
pass
このクラスを実装するには、継承するだけです。
クラス Hongqi 自動車 (AbstractCar):
デフドライブ(自己):
print('ゴーゴーゴー')
__name__ == '__main__' の場合:
a = 赤旗車()
a.ドライブ()