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)が可変である. すべての変数は、オブジェクトの参照です.この変数は、オブジェクトが可変であるかどうかにかかわらず、別のオブジェクトに割り当てられます.
したがって、入力されたパラメータ変数が可変オブジェクトを指す場合、関数体外ではこのオブジェクトの内容は永遠に変化しません.入力されたパラメータ変数が可変オブジェクトを指す場合、このオブジェクトが変化するかどうかは、関数体の内部でこの可変オブジェクトの内容が変化したかどうかに依存します.次の例では、リストと辞書の導出(list and dict comprehensions)とは何ですか.例をあげてもいいですか.リスト/辞書導出は、リストおよび辞書の生成を簡略化するための構文糖(syntax sugar)である.第3版の「Learning Python」によると、リストが導く実行速度は通常のサイクルより速いが、以降のPythonバージョンもこの結果であることは保証されていない. PEP 8とは何ですか?PEP 8はPythonコード仕様を定義し、可読性が高く、メンテナンスが容易なコードをどのように書くかを教えてくれます.詳細はPEP 8公式ドキュメントを参照してください.Sublime Text編集ツールにはPEP 8形式の検出プラグインがあり、ディスクに保存されているファイルはPEP 8の仕様に合致しなければならない. 仮想環境(virtual environment)を使用しますか?多くのPythonプログラマーは、私自身もこのような観点で、virtual environmentはあなたの開発と実行環境を孤立させるために非常に有用なツールであり、特に複数のプロジェクトを同時に開発し、異なるPythonバージョンに基づいてライブラリを実行する必要がある場合に使用されます.新しいプロジェクトを作成するたびに、またはcloneの既存のプロジェクトを作成し、仮想環境を使用します. リスト内のすべての要素の和をどのように計算しますか?リスト内のすべての要素の積を計算するにはどうすればいいですか?この問題はかなり簡単ですが、覚えておいてください.Pythonicでこの問題を解く必要があります. リストとメタグループの違いをリストできますか?例を挙げて使い方の違いを説明する.リストとメタグループはPythonの最も基本的な2つのデータ型です. まず、リストオブジェクトは可変であるが、メタグループはそうではない. の次に、要素グループは、例えば辞書オブジェクトのキー値(key)として使用することができるハッシュ(hashed)によって使用することができる.
例として、地図上の地理的座標は二元グループで表すことができ、地図上の経路は座標点リストで表すことができる. メモリの使用量が異なります.リスト・オブジェクトはすでにメモリに存在しますが、
似たような問題は、 python 2を言ってください.xとpython 3.x間の違い.ネット上の文章をよく読むと、いくつかの違いを言うことができます. python3.xの文字列はすべてunicodeです. python3.x中の python3.xでは python3.xのすべてのクラス(class)は新しいタイプ(new style)である. python3.xは、より単純な をサポートする.
もしあなたが1つの違いも言えないならば、少なくともPythonに対する関心が足りないことを意味します.修飾器(Decorator)とは?その用途を話してもらえますか.修飾器(Decorator)も非常にPythonicの方法で、関数やクラスのコードを注入したり修正したりするのに便利です.すなわち、モディファイヤを使用すると、関数とクラスメソッドをパッケージ化し、元のコードを実行する前と後に他のコードを実行できます.修飾器構文は、次のような非常に興味深い符号化方法をもたらすことができます. メモリキャッシュ パラメータ検出
原文に上記の質問を挙げる以外に、以下の知識点も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/
最近、チーム内でPython言語が普及しています.Python言語に触れたばかりのエンジニアの中には、概念的に混同されているところがたくさんあります.ちょうどこの文章を見ました.Pythonの面接問題で、Pythonの基本的な常識や混同しやすい知識点が挙げられています.そのため、チームのPython初心者にお勧めします.
したがって、入力されたパラメータ変数が可変オブジェクトを指す場合、関数体外ではこのオブジェクトの内容は永遠に変化しません.入力されたパラメータ変数が可変オブジェクトを指す場合、このオブジェクトが変化するかどうかは、関数体の内部でこの可変オブジェクトの内容が変化したかどうかに依存します.次の例では、
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 == []
# 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のコード書き込み方式である.# 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
# , 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))
例として、地図上の地理的座標は二元グループで表すことができ、地図上の経路は座標点リストで表すことができる.
range
とxrange
の違いを知っていますか?range
関数はリストオブジェクトを返し、xrange
はxrange
オブジェクトを返します.彼らの主な違いは:xrange
オブジェクトは、生成する必要があるrange
の大きさにかかわらず、同じメモリ・サイズを常に占有します.xrange
オブジェクトはリストオブジェクトのスライス関数を使用できません.つまりrange(10)[3:5]
は動作しますが、xrange(10)[3:5]
は動作しません.似たような問題は、
map
とitertools.imap
の違いがありますか?filter
とitertools.ifilter
の違いは?これらの違いを明らかにすると、これらの関数をより効果的に使用する方法がわかります. print
は文ではなく関数である.range
をxrange
の代わりに使用し、xrange
関数を削除した.unpack
方式、例えばfirst, *middle, last = [0, 1, 2, 3, 4, 5, 6, 7]
もしあなたが1つの違いも言えないならば、少なくともPythonに対する関心が足りないことを意味します.
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面接で聞かれる可能性が高いです.
また、Python言語で最も強力なライブラリ関数をできるだけ多く理解する必要があります.
http://xiaocong.github.io/blog/2013/06/16/python-interview-question-and-answer/