Python面接問題

6676 ワード

Python面接問題
最近、チーム内でPython言語が普及しています.Python言語に触れたばかりのエンジニアの中には、概念的に混同されているところがたくさんあります.ちょうどこの文章を見ました.Pythonの面接問題で、Pythonの基本的な常識や混同しやすい知識点が挙げられています.そのため、チームのPython初心者にお勧めします.
  • パラメータはどのように伝達されますか?値を伝えますか、それとも引用を伝えますか.(How are arguments passed – by reference of by value?) この問題の少しc/c++の風格、問題の実質は1つの伝達するパラメータが関数の体内で変更される時、それでは関数が帰った後に、関数の体外のこのパラメータの変数の値が変化するかどうかです.最も短い答えは、「いいえ」で、実はPythonには伝達対象(call by object)があります.この変数の値が関数の体外で変化するかどうかを理解するには、2つの概念を理解する必要があります.
  • Pythonのオブジェクトは、可変(mutable)と可変(immutable):数値(int,float)、文字列、メタグループ(tuple)が可変であり、リスト(list)、辞書(dict)が可変である.
  • すべての変数は、オブジェクトの参照です.この変数は、オブジェクトが可変であるかどうかにかかわらず、別のオブジェクトに割り当てられます.

  • したがって、入力されたパラメータ変数が可変オブジェクトを指す場合、関数体外ではこのオブジェクトの内容は永遠に変化しません.入力されたパラメータ変数が可変オブジェクトを指す場合、このオブジェクトが変化するかどうかは、関数体の内部でこの可変オブジェクトの内容が変化したかどうかに依存します.次の例では、changed関数呼び出しは、受信オブジェクトの内容を変更し、unchanged関数は、l変数を新たに生成されたオブジェクトl = l + ["a"]に付与するが、元のオブジェクトは変化しない:
    def changed(l):
        l.append("a")  #  change the original object
    
    def unchanged(l):
        l = l + ["a"]  # l + ["a"] will create a new list, instead of changing the original object
    
    l1 = []
    changed(l1)
    # l1 == ["a"]
    
    l2 = []
    unchanged(l2)
    # l2 == []
    
  • リストと辞書の導出(list and dict comprehensions)とは何ですか.例をあげてもいいですか.リスト/辞書導出は、リストおよび辞書の生成を簡略化するための構文糖(syntax sugar)である.第3版の「Learning Python」によると、リストが導く実行速度は通常のサイクルより速いが、以降のPythonバージョンもこの結果であることは保証されていない.
    # simple iteration
    a = []
    for x in range(10):
        a.append(x*2)
    # a == [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    # list comprehension
    a = [x*2 for x in range(10)]
    
    # dict comprehension
    a = {x: x*2 for x in range(10)}
    # a == {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18
    
    # set comprehension
    a = {x**2 for x in range(10) if x % 2 == 0}
    # a == set([0, 16, 4, 64, 36])
    
    リストの導出は典型的なPythonicのコード書き込み方式である.
  • PEP 8とは何ですか?PEP 8はPythonコード仕様を定義し、可読性が高く、メンテナンスが容易なコードをどのように書くかを教えてくれます.詳細はPEP 8公式ドキュメントを参照してください.Sublime Text編集ツールにはPEP 8形式の検出プラグインがあり、ディスクに保存されているファイルはPEP 8の仕様に合致しなければならない.
  • 仮想環境(virtual environment)を使用しますか?多くのPythonプログラマーは、私自身もこのような観点で、virtual environmentはあなたの開発と実行環境を孤立させるために非常に有用なツールであり、特に複数のプロジェクトを同時に開発し、異なるPythonバージョンに基づいてライブラリを実行する必要がある場合に使用されます.新しいプロジェクトを作成するたびに、またはcloneの既存のプロジェクトを作成し、仮想環境を使用します.
    # create virtual env
    virtualenv --no-site-packages --python=python3.2 ./venv
    
    # activate virtual env
    source ./venv/bin/activate
    # install requirements
    pip install -r requirements.txt
    
    #.....
    # update requirements
    pip freeze > requirements.txt
    
  • リスト内のすべての要素の和をどのように計算しますか?リスト内のすべての要素の積を計算するにはどうすればいいですか?この問題はかなり簡単ですが、覚えておいてください.Pythonicでこの問題を解く必要があります.
    #            ,     loop  ,sum    ,    reduce  
    
    # the basic way
    s = 0
    for x in range(10):
        s += x
    
    # the right way
    s = sum(range(10))
    
    # the other way
    from operator import add
    s = reduce(add, range(10))
    
    #             
    
    # the basic way
    s = 1
    for x in range(1, 10):
        s = s * x
    
    # the other way
    from operator import mul
    reduce(mul, range(1, 10))
    
  • リストとメタグループの違いをリストできますか?例を挙げて使い方の違いを説明する.リストとメタグループはPythonの最も基本的な2つのデータ型です.
  • まず、リストオブジェクトは可変であるが、メタグループはそうではない.
  • の次に、要素グループは、例えば辞書オブジェクトのキー値(key)として使用することができるハッシュ(hashed)によって使用することができる.

  • 例として、地図上の地理的座標は二元グループで表すことができ、地図上の経路は座標点リストで表すことができる.
  • rangexrangeの違いを知っていますか?range関数はリストオブジェクトを返し、xrangexrangeオブジェクトを返します.彼らの主な違いは:
  • メモリの使用量が異なります.リスト・オブジェクトはすでにメモリに存在しますが、xrangeオブジェクトは、生成する必要があるrangeの大きさにかかわらず、同じメモリ・サイズを常に占有します.
  • xrangeオブジェクトはリストオブジェクトのスライス関数を使用できません.つまりrange(10)[3:5]は動作しますが、xrange(10)[3:5]は動作しません.

  • 似たような問題は、mapitertools.imapの違いがありますか?filteritertools.ifilterの違いは?これらの違いを明らかにすると、これらの関数をより効果的に使用する方法がわかります.
  • python 2を言ってください.xとpython 3.x間の違い.ネット上の文章をよく読むと、いくつかの違いを言うことができます.
  • python3.xの文字列はすべてunicodeです.
  • python3.x中のprintは文ではなく関数である.
  • python3.xではrangexrangeの代わりに使用し、xrange関数を削除した.
  • python3.xのすべてのクラス(class)は新しいタイプ(new style)である.
  • python3.xは、より単純なunpack方式、例えばfirst, *middle, last = [0, 1, 2, 3, 4, 5, 6, 7]
  • をサポートする.
    もしあなたが1つの違いも言えないならば、少なくともPythonに対する関心が足りないことを意味します.
  • 修飾器(Decorator)とは?その用途を話してもらえますか.修飾器(Decorator)も非常にPythonicの方法で、関数やクラスのコードを注入したり修正したりするのに便利です.すなわち、モディファイヤを使用すると、関数とクラスメソッドをパッケージ化し、元のコードを実行する前と後に他のコードを実行できます.修飾器構文は、次のような非常に興味深い符号化方法をもたらすことができます.
  • メモリキャッシュ
      def memoize(f):
          memo = {}  #        memo     ,key   ,value   。
          def helper(x):
              if x not in memo:            
                  memo[x] = f(x)
              return memo[x]
          return helper
    
      #   fib  ,  fib     ,               
      @memoize
      def fib(n):
          if n == 0:
              return 0
          elif n == 1:
              return 1
          else:
              return fib(n-1) + fib(n-2)
    
      print(fib(40))  #  102334155
    
  • パラメータ検出
      def argument_test_natural_number(f):
          def helper(x):
              if type(x) == int and x > 0:
                  return f(x)
              else:
                  raise Exception("Argument is not an integer")
          return helper
    
      @argument_test_natural_number
      def faculty(n):
          if n == 1:
              return 1
          else:
              return n * faculty(n-1)
    
      for i in range(1,10):
          print(i, faculty(i))
      # 1 1
      # 2 2
      # 3 6
      # 4 24
      # 5 120
      # 6 720
      # 7 5040
      # 8 40320
      # 9 362880
    
      faculty(-1) #          faculty  ,  raise  exception
      # Exception: Argument is not an integer
    
  • with文とその使い方?簡単に言えば、with文は、指定されたコードブロックにアクセスおよび/または終了するときに、特定のコードを実行することを可能にする.最も一般的な例は、with文を使用してファイルを開くことです.自分で定義したオブジェクトにwith文を使用するには、__enter__メソッドと__exit__メソッドを定義する必要があります.詳細については、Pythonのwith文を理解することができます.

  • 原文に上記の質問を挙げる以外に、以下の知識点もPython面接で聞かれる可能性が高いです.
  • Package/Moduleの定義、およびモジュールロードの原則.
  • リスト、辞書、反復器など、自分のタイプをどのように構築するか.
  • ジェネレータ(generator)の概念と使用方法;
  • built-inタイプと関数;
  • オブジェクト属性の動作原理、例えばdict、getattr、getattribute、記述器(descriptor);
  • メタクラスプログラミング(metaclass)の概念と、どのように使用するか.
  • Package/Moduleのパッケージと配布方法
  • WSGIとは何ですか.
  • 文字列の処理と正規表現.
  • jsonとxmlデータをどのように操作するか.

  • また、Python言語で最も強力なライブラリ関数をできるだけ多く理解する必要があります.
     
    http://xiaocong.github.io/blog/2013/06/16/python-interview-question-and-answer/