Uncategorized

あなたのPythonスキルはどれくらい?今すぐ測れるクイズ9選

あなたはどれくらいPythonスキルを持っていますか?

プログミラングやデジタルリテラシーを持つ人材が重要になってきた現代社会において、特にAIや科学技術系のプログラミングに強みを持つPythonを理解・技術を持っていることは大切です。

最近では、書店に行くとPythonやプログラミングをテーマとした書籍がたくさん置かれるようになりました。プログラミングができることは、エンジニアだけでなくITやデジタル関連のプロジェクトに携わる全てのビジネスマンにとって理解が求められています。

とはいっても、自分がどれだけプログラミングスキル・Pythonスキルがあるのかを測定する手段はなかなかありませんし、会社や学校で教えてもらえるものではありませんよね。そんなあなたに簡単な9のクイズを用意してみました。ぜひ楽しみながら解いてみてください。

「Python3 プログラミング実力確認テスト」をリリース中!

スキルテストでは、Python3の実力テストを無料でリリースしています。豊富でたくさんの問題の中からランダムに出題されるので、何度でも受験することが可能です。

「Python3 プログラミング実力確認テスト」

Pythonスキルが分かる9つのクイズ

変数のデータ型

問題:
次の①, ②, ③に入る用語として適切なものはどれか。

プログラミング言語において、データの種類のことを「データ型」あるいは単純に「型」と呼ぶことがある。

Pythonで初めから用意されている型のことを「①」といい、例えば、-1,0,1,100などを表す「②」や、’hello’や’こんにちは’などを表す「③」が存在する。

組み込み型 int型 str型
組み込み型 float型 str型
組み込み型 str型 float型
ユーザー定義型 bool型 float型

 

選択肢:

(a)

(b)

(c)

(d)


答えを表示する

答え
解説
Pythonでは、はじめから用意されている型のことを「組み込み型」といいます。組み込み型には、次のようなものがあります。

型名
int(整数型) 1, 7, -10, 100, 12345
float(浮動小数点型) 1.3, 0.001, 2.34, 0.0
complex(複素数型) 1+7j, 1.3+5.112j
bool型 True, False
str(文字列型) ‘Hello’, ‘あいうえお’

組み込み型には、他にもlist(リスト)やtuple(タプル)、dict(辞書)、set(セット)などがあります。

データ型には、組み込み型だけでなく、ユーザーが独自に定義できる「ユーザー定義型」というものもあります。

 

条件分岐

問題:
変数aに代入されている値が、10より大きいか、10以下かを出力するプログラムを作成したい。

このとき、コード①〜④のうち、Python3で上記の要求を満たしながら、かつ正常に動作するプログラムはどれか。

コード①:

if a > 10
    print('aは10より大きいです。')
else if
    print('aは10以下です。')

コード②:

if a > 10:
    print('aは10より大きいです。')
else:
    print('aは10以下です。')

コード③:

if (a > 10) {
   printf("aは10より大きいです。");
}
else {
   printf("aは10以下です。");
}

コード④:

if a >= 10: 
    print('aは10より大きいです。') 
else: 
    print('aは10以下です。')

 

 

選択肢:

(a)
コード①

(b)
コード②

(c)
コード③

(d)
コード④


答えを表示する

答え
解説
「変数aに代入された値によって出力する内容を変えたい」というような場合には、条件分岐という仕組みを利用します。Python3では、条件分岐を実現するための最も代表的な方法として、「if文」が用意されています。

【if文の構文】

if 条件式:
処理内容(1)

ifの後に条件式を書いた後、必ずコロン(:)を入れます。その後に改行し、if文が終わるまではインデントしながら、条件式が真(True)であった場合の内容を記述します。

また、if文の条件式が偽(False) であった場合の内容も記述したい場合には、ifの処理内容を書いた後にelseを使います。

【if else文の構文】

if 条件式:
処理内容(1)
else:
処理内容(2)

したがって、正解はコード③になります。

繰り返し処理

問題:
与えられた果物のリストから、一つずつ果物を出力するプログラムを作りたい。

期待する結果を出力するにあたって、プログラム①の[問題コード]の部分に入る適切なコードとして、適切なものはどれか。

プログラム①:

arr = ['りんご', 'みかん', 'いちご', 'ぶどう']
[問題コード]
    print(i)

期待する結果:

りんご
みかん
いちご
ぶどう

 

 

選択肢:

(a)
for arr:

(b)
for range(len(arr))

(c)
for i in len(arr):

(d)
for i in arr:


答えを表示する

答え
解説
正解のプログラムは次にようになります。

arr = ['りんご', 'みかん', 'いちご', 'ぶどう']
for i in arr:
    print(i)

Pythonで繰り返し処理を行う際には、for文やwhile文が使われます。

for文の書式は次のようになります。

for 変数 in イテラブルオブジェクト:
実行する文

ここで、本問題の場合では、果物のリストが代入された変数arrがイテラブルオブジェクトになります。

選択肢のうち(a), (b)には「in」が抜けているため、そもそも文法として誤りです。

選択肢のうち(c)は、文法自体は正しいのですが、len()はリストなどの個数(長さ)を返す関数なので、len(arr)は4となり、「for i in 4:」ということになります。

この4は数値でありint型(整数型)なので、イテラブルオブジェクト(=繰り返し可能)ではありません。したがって選択肢(c)は誤り、実際にコードを実行すると、以下のようなエラーが発生します。

arr = ['りんご', 'みかん', 'いちご', 'ぶどう']
for i in len(arr):
    print(i)
Traceback (most recent call last):
  File "Main.py", line 2, in <module>
    for i in len(arr):
TypeError: 'int' object is not iterable

 

繰り返し処理(発展)

問題:
Aくんは、与えられたリストの中から奇数のみを2乗したリストを作成するプログラムを作成した。Aくんは2通りの実装方法を思いついたので、2つ作成した。

それらのプログラムを以下に示す。

実装①:

original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

new_list = [num**2 for num in original_list if num % 2 == 1]

print(new_list)

実装②:

original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

new_list = []
for num in original_list:
    if num % 2 == 1:
        new_list.append(num**2)
        
print(new_list)

期待する出力:

[1, 9, 25, 49, 81]

通常の実装としては、実装②のやり方でプログラムを作成するが、Pythonでは「(1)」という記法を使って、実装①のように一行で処理内容を記述することができる。

また「(1)」などをはじめとして、様々な処理を1行で簡潔に書いたコードのことを、プログラミング全般で「(2)」とよんでいる

選択肢:

空欄(1) 空欄(2)
簡潔表記 ワンライナー
簡潔表記 一行化コード
内包表記 ワンライナー
内包表記 一行化コード

選択肢:

(a)

(b)

(c)

(d)


答えを表示する

答え
解説
ワンライナーとは、様々な処理を一行でまとめて簡潔に表現したプログラムやコマンドのことを言います。

複数の処理を一行にまとめているため、冗長性やコードの長さを抑えることはできる一方で、可読性を損なってしまう可能性があります。そのため、複数人でシステム開発を行なっている場合や、技術レベルが低い別の人がコードを読む可能性がある場合には、注意が必要です。また、必要に応じてコメントを残すことが重要です。

ワンライナーの具体例としては、次のようなものがあります。

Pythonでの具体例:

# 複数のリストを結合するワンライナー
combined_list = list(zip(list1, list2))

# 要素を2倍するワンライナー
new_list = [x*2 for x in org_list]

C言語での具体例:

# 1から10までを出力するワンライナー
for (int i = 1; i <= 10; i++) printf("%d ", i);

Linux、MacOSのターミナルで使用するコマンドでの具体例:

# ディレクトリ内のファイル数をカウントするワンライナー
ls -1 | wc -l

# ファイルをソートして表示するワンライナー
sort file.txt

内包表記とは、Pythonの機能の一つで、既存のリストから新しいリストを作る方法です。リストだけでなく、セット、タプル、辞書などでも内包表記を使って記述することが可能です。

リスト内包表記の場合、書式は次のようになります。

[仮変数を用いた式 for 仮変数 in イテラブルオブジェクト]

これだけをみても、さっぱりだと思うので、具体例をいくつか示します。

具体例①:
この例では、与えられたリスト(変数my_list)の要素から、偶数のみを取り出しています。

my_list = [1, 3, 2, 10, 11, 15, 20]
even_numbers = [num for num in my_list if num % 2 == 0]

print(even_numbers)
# 出力: [2, 10, 20]

 

具体例②:
この例では、要素にabcが含まれている文字列のみを取り出しています。

my_list = ['yyy', 'abc', 'aiueo', '342', 'dabc']
filtered_list = [string for string in my_list if 'abc' in string]

print(filtered_list)

 

関数

問題:
Pythonの関数について、次の記述のうち最も正しいものはどれか。

選択肢:

(a)
関数はreturn文を使わずに値を返すことができる。

(b)
関数内で定義された変数は、関数の外からでもアクセスすることができる。

(c)
関数はデフォルトで値が設定された引数を持つことができる。

(d)
Pythonにおいて、関数は引数を一切受け付けない。


答えを表示する

答え
解説
Python3では関数はデフォルト値をあらかじめ設定した引数を持つことができます。デフォルト引数を使うことで、関数呼び出し時に引数が指定されていない場合に、関数内ではデフォルトで指定した値を引数として使います。

デフォルト引数は関数を定義するときに、引数名の後に等号(=)とデフォルト値を指定することで設定できます。以下がサンプルコードです。

# この関数はnameという引数を持ち、デフォルト値として"World"が指定されています。
def greet(name="World"):
    print(f"Hello, {name}!")

# 引数が指定されなかった場合
greet()  # 出力: Hello, World!

# 引数が指定された場合
greet("Alice")  # 出力: Hello, Alice!

出力:

Hello, World!
Hello, Alice!

【その他の選択肢】

選択肢a
→ 関数は値を返すためにreturn文を使う必要があるので、return文を使わずに値を返すことはできません。

選択肢b
→ 関数内で定義された変数は関数の外からアクセスできません。これをローカル変数と言います。例えば次のようなコードを実行すると、エラーが発生します。

def my_func():
    i = 100
    print('i in func: ', i)
    return

print('i outside func: ', i)

出力:

Traceback (most recent call last):
  File "Main.py", line 9, in <module>
    print('i outside func: ', i)
NameError: name 'i' is not defined

選択肢d
→ 明らかに間違いです。

 

クラス

問題:
次の文章の①、②に当てはまる用語として、適切なものはどれか。

Pythonにおいてクラスを定義するときには、そのクラスのオブジェクト生成時に最初に実行される処理を定義したメソッドとして「①」を定義する。「①」は、オブジェクト生成時に一回だけ実行される特別なメソッドである。

また「①」の第一引数には「②」を指定する。「②」とは、生成されるオブジェクト自身を表す特殊な変数です。

空欄① 空欄②
コンストラクタ this
コンストラクタ self
インスタンス this
インスタンス self

選択肢:

(a)

(b)

(c)

(d)


答えを表示する

答え
解説
①コンストラクタ②selfが正解です。正解の文章は次のようになります。

Pythonにおいてクラスを定義するときには、そのクラスのオブジェクト生成時に最初に実行される処理を定義したメソッドとしてコンストラクタを定義する。コンストラクタは、オブジェクト生成時に一回だけ実行される特別なメソッドである。

またコンストラクタの第一引数にはselfを指定する。selfとは、生成されるオブジェクト自身を表す特殊な変数です。

理解を深めるために、実際にPythonでクラスを定義したプログラムをみていきましょう。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# インスタンスの生成
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

# インスタンスのメソッドの呼び出し
person1.say_hello()
person2.say_hello()

このプログラムでは、「def __init__(self, name, age)」で定義しているメソッドがコンストラクタになります。Pythonでは一般的に、__init__()にオブジェクト生成時に10個する処理内容を記述します。

クラス(発展)

問題:
Pythonにおいてポリモーフィズムを実現するために利用できる機能は、次のうちどれか?

選択肢:

(a)
再帰関数

(b)
オーバーロード

(c)
インターフェース

(d)
抽象クラス


答えを表示する

答え
解説
ポリモーフィズムとは、オブジェクト指向プログラミングにおける概念の一つであり、日本語では多態性・多相性という意味になります。ポリモーフィズムによって、一つのメソッドで、異なるクラスのインスタンスを切り替えながら動作させることが可能となります。つまり「呼び出すクラスを変更しても、呼び出す側のクラス・プログラムを一切変更する必要がない」というメリットがあります。

具体的にポリモーフィズムを実装したプログラムを見てみましょう。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass

class Dog(Animal):
    def sound(self):
        return "Woof!"

class Cat(Animal):
    def sound(self):
        return "Meow!"

def make_sound(animal):
    print(animal.sound())

dog = Dog()
cat = Cat()

make_sound(dog) # 出力: Woof!
make_sound(cat) # 出力: Meow!

このプログラムでは、まず、抽象クラスとしてAnimalを定義しています。抽象クラスとは、ざっくり説明すると「実装を含まない宣言のみのクラス」です。なぜ抽象クラスを使うのかというと、Animalを継承したクラスは、全てのクラスにおいてsound()というメソッドを実装する必要があり、DogであろうとCatであろうと、sound()メソッドを持っていることが保証されるからです。

例えばAnimalという抽象クラスを定義せずに、様々な動物のクラスを定義しようとすると、コードを書く人によって、「Dogクラスの鳴くメソッドはbark()にしよう」「Catクラスの鳴くメソッドはmeow()にしよう」と言った感じで、メソッド名が統一されない可能性が出てきます。しかしながら、各種動物クラスを定義する際に、Animalクラスという抽象クラスを継承させることにしておけば、必ず鳴くメソッドはsound()になることが保証されるわけです。

したがってメソッド名を統一すれば、後からRabbit(うさぎ)やHorse(馬)やZebra(シマウマ)を実装したとしても、make_sound関数内の処理を一切変更することなく、動物を鳴かせることができるようになるわけです。これがポリモーフィズムを使うメリットといえます。

他の選択肢の説明:

再帰関数
→ 関数内でその関数自身を呼び出す処理のことであり、ポリモーフィズムとは関係がありません。

オーバーロード
→ 同じメソッド名で異なる引数の型や数を受け付けることです。Pythonでは、オーバーロードを直接実装することができません。またオーバーロードは、あるクラスが同じ名前のメソッドを複数持つことであり、これもポリモーフィズムとは直接関係はありません。

インターフェース(interface)
→ Javaなどの他のプログラミング言語では、インターフェースという仕組みが提供されており、これを使ってポリモーフィズムを実現することができます。しかしながら、Pythonではインターフェースという機能は提供されていません。

 

データベース操作, sqlite3ライブラリに関するクイズ

問題:
Python3でSQLiteデータベースを使って、特定のデータを更新することを考える。このとき、正しい手順の流れとして適切なものは次のうちどれか。

選択肢:

(a)
クエリを実行し、コミットし、データベース接続を閉じる

(b)
クエリを実行し、データをフェッチし、データベース接続を閉じる

(c)
クエリを実行し、データベース接続を閉じる

(d)
クエリを実行し、データをフェッチし、コミットする


答えを表示する

答え
解説
正解は「クエリを実行し、コミットし、データベース接続を閉じる」です。

選択肢に含まれる各手順について説明します。

クエリ実行
→ データベースを操作する「SQL文」を実行します。SQL文を使うことで、テーブルの作成、データの挿入、更新、取得、削除などが行えます。

コミット
→ SQL文を使ったクエリ実行を行なってデータを変更した場合、その変更を確定させるためには、コミットをする必要があります。コミットをせずに操作を終了した場合、その変更は無かったことになります。

データのフェッチ
→ データベースから取得したデータを参照する手順です。基本的には一件ずつ抜き出します。

データベース接続を閉じる
→ データベースとの接続を切断します。

上記の説明をもとに考えると、特定のデータを更新するための手順の流れとしては「クエリを実行し、コミットし、データベース接続を閉じる」が適切であると考えられます。

以下にsqlite3ライブラリを使ってデータを更新するサンプルコードを示します。

import sqlite3

# 接続DBファイルの指定
conn = sqlite3.connect('example.sqlite3')
c = conn.cursor()

# SQL文の実行
sql="UPDATE persons SET name = 'taro' WHERE age = '20' and job = 'doctor'"
c.execute(sql)

# 変更の保存
conn.commit()

# DBから切断
conn.close()

【その他の選択肢】

「クエリを実行し、データをフェッチし、データベース接続を閉じる」
→ データを更新する場合、フェッチは不要です。コミットを行って変更を確定させる必要があります。

「クエリを実行し、データベース接続を閉じる」
→ クエリを実行した後、コミットを行って変更を確定させる必要があります。

「クエリを実行し、データをフェッチし、コミットする」
→ データを更新する場合、フェッチは不要です。また、データベース接続を閉じる手順が抜けています。

 

matplotlibライブラリに関するクイズ

問題:
Python3のmatplotlibライブラリを使用して、散布図を作成する際のコードとして、適切なものはどれか。

選択肢:

(a)
plt.plot(x, y)

(b)
plt.bar(x, y)

(c)
plt.scatter(x, y)

(d)
plt.pie(x, y)


答えを表示する

答え
解説
正解は「plt.scatter(x, y)」です。matplotlibモジュールには、散布図を描画するためのメソッドとしてmatplotlib.pyplot.scatterが用意されています。

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.scatter(x, y)

plt.savefig("example.png")
plt.show()

上記のサンプルコードを実行すると、次のような画像(example.png)が生成されます。

【その他の選択肢】

plt.plot(x, y)
→ 折れ線を作成するメソッドです。

出力された折れ線グラフ

plt.bar(x, y)
→ 棒グラフを作成するメソッドです。


出力された棒グラフ

plt.pie(x, y)
→ 円グラフを作成するメソッドです。また、引数に与えるデータは一つのみです。


出力された円グラフ

Python、プログラミングスキルを高めたい方にオススメの方法!!

さらに高めたい人には、まずは書籍通読やプログラミングスクールがオススメです。エンジニアを目指している方にとっては、この領域については自学自習が求められる世界なので書籍通読にチャレンジしてみると良いでしょう。

非エンジニアの方にとっては、プログラミングスキルはあくまでもメインのスキルではないはずなので、プログラミング教室で誰かに教えてもらうといった手も時間効率の面では良い選択だと思います。

また、手っ取り早く・効率よくPythonスキルを学びたいなら、問題演習形式かつ無料で学ぶことができる本サイトのサービス「スキルテスト」も利用してみましょう。

復習&資格試験への挑戦もオススメ!

スキルテストが提供している「Python3 実力確認テスト」は、無料かつオンライン提供のため、好きなときに何度でも受験することができます。Pythonの知識や実務経験があまりない人でも、豊富な解説を理解しながら問題を繰り返し解いていくことで、確かな実力を効率よく身につけることができます。

また試験で学習した内容は、以下のような有料試験やその他試験でも役立てることができます。

【Pythonエンジニア認定試験】
一般社団法人Pythonエンジニア育成推進協会が主催している試験です。「Python3 エンジニア認定基礎試験」「Python 3 エンジニア認定データ分析試験」「Python 3 エンジニア認定実践試験」の3つの試験区分があります。1つ目は基本的な文法知識、2つ目は統計・数学知識や関連ライブラリを含めたPython知識、3つ目は実践的なプログラミング知識が出題範囲となっており、日本国内では一番有名な試験といえるでしょう。(公式サイトリンク

【Python Institute Certification】
Python Instituteが主催している試験です。こちらもいくつか試験区分があり、試験によって出題範囲や難易度が異なります。ただし、出題言語は英語かスペイン語のみなので、外国語が苦手な人は注意しましょう。(公式サイトリンク