Python面接でよく聞かれる26の技術テーマと実装例

1. GILがマルチスレッドに与える影響

CPythonにはGlobal Interpreter Lock(GIL)が存在し、1プロセス内で1スレッドしかバイトコードを実行できません。これにより複数CPUを活かした並列実行ができません。

さらに、GILはスレッドの実行区間ごとに手放されるため、単純にGILがあればデータ競合が起きないわけではありません。明示的な排他制御が必要です。

2. 同期・非同期・ブロッキング・ノンブロッキングの違い

  • 同期(Synchronous):IO処理が完了するまで呼び出し元が待機
  • 非同期(Asynchronous):IO処理の完了を待たずに呼び出し元に制御が戻る
  • ブロッキング(Blocking):関数呼び出しでスレッドがスリープ
  • ノンブロッキング(Non-blocking):関数呼び出しで即座に結果(またはEAGAIN)が返る

3. コルーチンとは

コルーチンは関数の実行を途中で一時停止し、後から再開できる仕組みです。async defyieldを使って実装し、単一スレッド内で協調的マルチタスクを実現します。

4. コルーチン版フィボナッチジェネレータ

def fibonacci(limit):
    a, b = 0, 1
    for _ in range(limit):
        yield a
        a, b = b, a + b

gen = fibonacci(7)
print([num for num in gen])  # [0, 1, 1, 2, 3, 5, 8]

5. デコレータの役割

既存関数のコードを変更せずに、前後処理を注入できる構文糖です。認証、ロギング、キャッシュなど横断的関心事を簡潔に実装できます。

6. 呼び出し回数カウンタ付きデコレータ

from functools import wraps

def call_counter(fn):
    count = 0
    @wraps(fn)
    def wrapper(*args, **kwargs):
        nonlocal count
        count += 1
        print(f'{fn.__name__} が {count} 回呼ばれました')
        return fn(*args, **kwargs)
    return wrapper

@call_counter
def greet():
    print('Hello')

greet()
greet()

7. __new__でシングルトンを実装

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
assert s1 is s2

8. Djangoリクエストフロー

  1. クライアント → Nginx(リバースプロキシ)
  2. uWSGI → WSGIリクエストオブジェクト生成
  3. Djangoミドルウェアスタック
  4. URLconf → ビュー → ビジネスロジック(認証・権限・スロットリング)
  5. レスポンスオブジェクト → ミドルウェア → uWSGI → Nginx → クライアント

9. TCP vs UDP

項目TCPUDP
接続3ウェイハンドシェイクコネクションレス
信頼性再送制御・順序保証ベストエフォート
速度遅い高速

10. 3ウェイハンドシェイク

  1. クライアント SYN=1, seq=x
  2. サーバ SYN=1, ACK=1, seq=y, ack=x+1
  3. クライアント ACK=1, seq=x+1, ack=y+1

11. OSI 7階層モデル

物理 → データリンク → ネットワーク → トランスポート → セッション → プレゼンテーション → アプリケーション

12. map / filter / reduce

from functools import reduce

nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))        # [1, 4, 9, 16]
evens = list(filter(lambda x: x % 2 == 0, nums))   # [2, 4]
total = reduce(lambda acc, x: acc + x, nums, 0)    # 10

13. 正規表現の貪欲・非貪欲とIPv4マッチ

import re
ip = '192.168.0.1'
m = re.fullmatch(r'(?:\d{1,3}\.){3}\d{1,3}', ip)

貪欲マッチは最長一致、非貪欲は最短一致(*? +?)。

14. Linuxコマンド早見表

  • 権限確認:ls -l
  • 権限変更:chmod 644 file
  • メモリ:free -h / top
  • プロセス:ps aux / htop

15. RESTful API

HTTPメソッド(GET/POST/PUT/DELETE)でリソースを操作し、ステートレス・統一インターフェースを提供する設計指針。

16. CSRF攻撃

悪意あるサイトがユーザの認証済みセッションを利用して偽リクエストを送信する攻撃。DjangoではCSRFトークンで対策。

17. *args / **kwargs

def example(*args, **kwargs):
    print(args)    # タプル
    print(kwargs)  # 辞書

example(1, 2, x=3, y=4)

18. Djangoミドルウェア

リクエスト/レスポンスフックを提供し、認証・ロギング・CORS・GZipなど横断的処理を実装可能。

19. オブジェクト指向3セプト

  • カプセル化:データとメソッドを隠蔽
  • 継承:基底クラスを再利用
  • ポリモーフィズム:同一インターフェースで異なる動作

20. メソッドデコレータ比較

  • @classmethod:クラスオブジェクトを第一引数に
  • @staticmethod:インスタンス/クラス参照なし
  • @property:属性アクセスをメソッド化

21. __new__ vs __init__

__new__はインスタンス生成、__init__は初期化。

22. イテレータとイテラブル

from collections.abc import Iterator, Iterable

isinstance([1, 2], Iterable)  # True
isinstance(iter([1, 2]), Iterator)  # True

23. プロセス・スレッド・コルーチン

プロセススレッドコルーチン
メモリ独立共有共有
切替主体OSOSプログラマ

24. リフレクション

class Foo:
    bar = 42

f = Foo()
print(getattr(f, 'bar'))  # 42
setattr(f, 'bar', 100)

25. PEP 8

Python公式コーディング規約。インデント4スペース、1行79文字、snake_case関数名など。

26. Django REST framework

認証クラス、権限クラス、スロットリング、シリアライザ、ビューセット、ルーターなどを提供し、RESTful APIを高速開発。

27. スタックとキューの実装

class Stack:
    def __init__(self):
        self._data = []

    def push(self, item):
        self._data.append(item)

    def pop(self):
        return self._data.pop()

class Queue:
    def __init__(self):
        from collections import deque
        self._data = deque()

    def enqueue(self, item):
        self._data.append(item)

    def dequeue(self):
        return self._data.popleft()

28. json.dump vs json.dumps

import json
data = {'name': 'Alice'}
json_str = json.dumps(data)          # str
with open('out.json', 'w') as fp:
    json.dump(data, fp)              # ファイル書き込み

タグ: Python interview Django async OOP

6月20日 21:05 投稿