最も一般的なPython面接の質問 - ジュニアレベル
By JoeVu, at: 2023年1月20日15:54
Estimated Reading Time: __READING_TIME__ minutes


JUNIORレベル
1. Pythonにおけるリストとタプルの違いを説明してください。
- リストはミュータブル(変更可能)であり、その内容は変更できますが、タプルはイミュータブル(変更不可能)で変更できません。
- リストは角括弧 `[ ]` を使用しますが、タプルは丸括弧 `( )` を使用します。
- リストは他のリストを含む、あらゆる型のオブジェクトを含めることができますが、タプルは同じ型のオブジェクトのみを含めることができます。
- リストは任意に拡張または縮小できますが、タプルは要素の数が固定されています。
タプルを使用すべき場合、リストを使用すべきでない場合
シーケンスの要素が変更されない場合は、タプルを使用すべきです。これは、チームで作業しており、複数の場所で多くの開発者によって使用されている変数がある場合に便利です。変数の作成者は元の値を保持したいと考えています。
car_colors = (("black", 1), ("white", 2))
def pick_car_colors(color):
for car_color in car_colors:
if car_color[0] == color:
print(color)
car_color[1] += 1
In [26]: pick_car_colors("black")
black
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[26], line 1
----> 1 pick_car_colors("black")
Cell In[25], line 7, in pick_car_colors(color)
5 if car_color[0] == color:
6 print(color)
----> 7 car_color[1] += 1
TypeError: 'tuple' object does not support item assignment
2. 関数定義における `*args` と `**kwargs` とは何ですか?
Pythonでは、`*args`と`**kwargs`は、関数に可変長の引数を渡すために使用される2つの特別な記号です。
関数定義における `*args` と `**kwargs` という特別な構文は、関数に可変長の引数を渡すために使用されます。
`*args` は、キーワードなしの可変長引数リストを関数に渡すために使用されます。
`**kwargs` は、キーワード付きの可変長引数リストを関数に渡すために使用されます。
def print_arguments(*args, **kwargs):
print(args)
print(kwargs)
In [2]: print_arguments(1, 2, 3, name="Joe", age=34)
(1, 2, 3)
{'name': 'Joe', 'age': 34}
ただし、`*args` および `**kwargs` キーワードを使いすぎないでください。これは、「クリーンコード」の原則である関数/メソッドのパラメータ制限(3つ以上のパラメータは避けるべき)に反します。
3. シャローコピーとディープコピーの違いは何ですか?
シャローコピーは、オブジェクトの直接の値のみをコピーするオブジェクトのコピーですが、ディープコピーは、元のオブジェクトのすべての値をコピーすることによって、まったく新しいオブジェクトとその内容を作成するオブジェクトのコピーです。
ディープコピーでは、元のオブジェクトのすべての値が、元のオブジェクト内で参照されているオブジェクトも含めてコピーされます。シャローコピーでは、直接のオブジェクトの値のみがコピーされ、参照されているオブジェクトはコピーされません。
original_list = [1, 2, 3]
shallow_copy = original_list
print(original_list)
print(shallow_copy)
original_list[0] = 100
[1, 2, 3]
[1, 2, 3]
print(original_list)
print(shallow_copy)
[100, 2, 3]
[100, 2, 3]
別の例
import copy
original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)
print(original_list)
print(deep_copy)
[1, 2, [3, 4]]
[1, 2, [3, 4]]
original_list[0] = 100
print(original_list)
print(deep_copy)
[100, 2, [3, 4]]
[1, 2, [3, 4]]
4. ローカル変数とグローバル変数の違いを特定してください。
ローカル変数は関数内で宣言され、その関数内でのみアクセス可能です。グローバル変数はどの関数外でも宣言され、他のどの関数やスクリプトからでもアクセス可能です。
ローカル変数の例:
- 関数内で宣言された変数
- ループ内で宣言された変数
グローバル変数の例:
- どの関数外でも宣言された変数
- メインスクリプトで宣言された変数
global_variable = "A1"
def get_shapes():
local_variable = "cubic"
global_variables = "B2"
print(local_variable)
print(global_variables)
get_shapes()
cubic
B2
global_variable
'A1'
5. Python の「リスト内包表記」を説明してください。
リスト内包表記は、Python で既存のリストから新しいリストを作成するための強力な方法です。
- リストの各要素に式またはフィルターを適用して、既存のリストからリストを作成するための簡潔な方法です。
- 既存のリスト、辞書、またはその他のイテラブルから新しいリストを作成するために使用されます。
- 関数型プログラミングにおける `map()` および `filter()` 関数の使用に似ています。
- リスト内包表記はループを記述するためのショートハンドであり、多くの場合、メモリと実行時間を節約できます。
たとえば、数値のリストがあり、各数値を2乗した新しいリストを作成したいとします。リスト内包表記を使用して次のように行うことができます。
In [1]: [x * x for x in [1, 2, 3, 4, 5]]
Out[1]: [1, 4, 9, 16, 25]
6. Python 2 の `range()` と `xrange()` の主な違いを挙げてください。
Range(): 数値のシーケンスを生成するために使用される組み込み関数です。開始、停止、ステップの3つのパラメータを取ります。シーケンスの要素を含むリストオブジェクトを返します。
例:
range(1, 10, 2)
-> [1, 3, 5, 7, 9]
xrange(): 数値のシーケンスを生成するために使用される別の組み込み関数です。range()に似ていますが、リストの代わりにジェネレータオブジェクトを返します。range()よりも高速で、メモリ消費量が少なくなります。
例:
xrange(1, 10, 2)
-> xrange(1, 10, 2)
7. Python の「正のインデックス」と「負のインデックス」を説明してください。
Python の正のインデックスは、シーケンスの先頭から 0 から始まる位置によって配置されるシーケンス内の項目を参照するために使用されます。
Python の負のインデックスは、シーケンスの末尾から -1 から始まる位置によって配置されるシーケンス内の項目を参照するために使用されます。
a = ['a', 'b', 'c', 'd', 'e', 'f']
a[0]
'a'
a[5]
'f'
a[-1]
'f'
a[-2]
'e'
a[-5]
'b'
a[-6]
'a'
8. Python の「イテレータ」とは何ですか?
Python のイテレータとは、反復処理が可能なオブジェクトであり、値のシーケンスを生成できます。イテレータは、`iter()` および `next()` 関数を使用して実装されます。
- `__iter__()`: `iter()` メソッドは、イテレータの初期化のために呼び出されます。これはイテレータオブジェクトを返します。
- `__next__()`: `next` メソッドは、イテラブルの次の値を返します。for ループを使用して任意のイテラブルオブジェクトを走査するときに、このメソッドは反復の終了を示すために `StopIteration` を発生させます。
例 1: リストの反復処理
numbers = [1, 2, 3, 4]
for number in numbers:
print(number)
出力
1
2
3
4
例 2: 辞書の反復処理
a_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key, value in a_dict.items():
print(key, value)
出力
a 1
b 2
c 3
d 4
例 3: セットの反復処理
In [7]: a_set = set(['joe', 'snow', 'bill'])
...: for element in a_set:
...: print(element)
...:
出力
snow
bill
joe
9. 「is」演算子は何をしますか?
「is」演算子は、2つの変数が同じオブジェクトを参照しているかどうかをチェックするために使用されます。両方の変数が同じオブジェクトを参照している場合は True を返し、そうでない場合は False を返します。
これは、2つの None オブジェクトを比較する際に非常に便利です。
例 1
x = [1, 2, 3]
y = [1, 2, 3]
print(x is y)
出力
False
例 2
x = [1,2,3]
y = x
print(x is y)
出力
True
例 3
x = [1, 2, 3]
y = x
print(x is y)
出力
True
例 4
if x is None:
print("x is None")
出力
x is None
10. リストの `del()` と `remove()` の違いは何ですか?
`del()` 関数は指定されたインデックスの項目を削除するために使用されますが、`remove()` 関数は値によって項目を削除するために使用されます。
例 1
list1 = [1, 2, 3, 2, 3]
del list1[2]
print(list1)
出力
[1, 2, 2, 3]
例 2
list1 = [1, 2, 3, 2, 3]
list1.remove(2)
print(list1)
出力
[1, 3, 2, 3]
11. Python で三項演算子をどのように利用しますか?
三項演算子は、if-else ステートメントを記述するためのショートハンドです。次の形式を取ります。
condition_if_true if condition else condition_if_false
rating = 3
comment = "good" if rating >= 2.5 else "bad"
print(comment)
出力
good
12. なぜ仮想環境を使用するのですか?
仮想環境は、グローバルな Python インストールに影響を与えることなく、パッケージと依存関係をインストールできる独立した Python 環境を作成するために使用されるツールであり、さまざまなバージョンのパッケージや依存関係間の競合を防ぐのにも役立ちます。
優れた仮想環境パッケージには以下のようなものがあります。
- virtualenv
- pyenv
- anaconda
- venv
- conda
- pipenv
13. Python で `yield` キーワードは何に使用されますか?
Python では、yield はジェネレータを作成するために使用されるキーワードです。ジェネレータは、アイテムの反復可能なセットを生成するために使用できる特別な関数です。「yield」キーワードを使用すると、関数はジェネレータオブジェクトを返します。これは for ループで使用したり、リスト、タプル、またはセットを作成するために使用したりできます。
例 1
def generate_guess_names():
names = ['Johnson', 'Smith', 'Williams', 'Bill', 'Gate', 'Hilary', 'Tom', 'Hank']
for name in names:
yield name
for name in generate_guess_names():
print(name)
出力
Johnson
Smith
Williams
Bill
Gate
Hilary
Tom
Hank