【Python】Bubble Sortを学びながらPythonの基礎を身につける記事
当ページのリンクには広告が含まれています。
✓目次
Bubble Sortとは
ソートアルゴリズムの一種です。
要素の1番目と2番目を比較し、順番が逆であれば入れ換える。
次に2番目と3番目を比較して入れ換える。
これを最後まで行うと、最後の数だけが最小または最大の数として確定するので、確定していない部分について1つずつ減らしながら繰り返す。
詳しくは以下のWikipediaを参照ください。
本記事では、プログラミングにおけるアルゴリズムの練習として、Bubble Sortアルゴリズムを実装したいと思います。
いきなり実装に入る前に、実装する上で必要なpythonの基礎もまとめていきたいと思います。
Pythonの基礎
Bubble Sortをコーディングするために必要な、基本的なPythonの基礎をまずはまとめていきます。
[Python基礎]関数定義
基本的な関数定義としては以下のようなコードがあります。注意点としては、def say_something()
前にsay_something()
と書いた場合、”関数定義がされてないよ”とエラーになります。pythonは、コードを上から読み込まれるためです。あと()
をちゃんとつけましょう。
1 | def say_something(): |
ちなみに、print(type(say_something))
とすると、say_somethingが何者なのかを確認することができます。
1 | def say_something(): |
返り値を返したい場合は、以下のようにreturn
を用います。以下の例だと、s
にhi
が入り、返してくれます。
1 | def say_something(): |
引数を用いれば、何度もif文を返さなくてOKになるので便利です。
1 | def what_is_this(color): |
[Python基礎]関数の引数と返り値の宣言
関数は引数と返り値を明示的に宣言することができます。
1 | def add_nums(a: int, b: int) -> int: |
ここで、引数にあえてstringを入れてみます。
1 | def add_nums(a: int, b: int) -> int: |
結果は、ab
という文字列を返します。
何を言いたいかというと、関数定義の際に、明示的にa, bにはintを宣言しているにも関わらず、aとbにstringを入れても、pythonはエラーを返してくれません。
この点は気をつけておきましょう。
[Python基礎]関数アノテーション
Python3.0i以降では、関数アノテーションという仕組みが導入されました。
関数の引数や返り値にアノテーション(注釈)となる式を記述することができます。
1 | from typing import Union, List |
あくまでも注釈なので、コードが実行される際に型チェックは行われたりしません。
つまり、アノテーションで指定した型以外の引数を渡してもエラーになりません。
[Python基礎]__name__
と__main__
よく「おまじない」としてスルーされがちなコードですね。
pythonで関数を用いたコードを記述する際に、編集しているpythonファイルが他のコードからimportされて実行されないようにif __name__ = '__main__':
を用いることが良しとされています。
作成しているコードが、プロジェクトの一部で使われることが想定される場合、関数を用いる場合は、以下のようにif __name__ = '__main__':
を記述して関数を指定しましょう。
1 | def main(): |
詳しくは、Pythonのif name == “main“ とは何ですか?への回答 - Python学習チャンネル by PyQを参照ください。
[Python基礎]内包表記
内包表記は、リストの要素を操作した上で、新しいリストを作成するための記法です。
通常、そのような処理はforやwhileによるループを使用しますが、内包表記を用いると、簡潔に記述することができます。内包表記は、以下の形式で記述します。
新たなリスト = [ 要素への処理 for 要素 in リスト]
- リスト内の要素を1つ1つ取り出して、要素への処理を実行した上で新しいリストを作成します。
1 | a = [1, 2, 3, 4, 5, 6] |
Bubble Sortのコーディング
まずは、数値のlistを扱いたいので、from typing import List
としておきます。
丁寧にアノテーションでlistを受け付けて、listを返す関数であるということを明示的に示しておきます。先述したとおり、指定した型に従った変数でなくてもエラーは返しません。
1 | from typing import List |
そして、数値のリストを作成し、bubble_sort()に引数として渡してあげます。
1 | from typing import List |
Bubble Sortの仕組みを考慮し、リストのindexの数を取り出したいので、lenメソッドを使い、indexの数を取り出し、それをprintします。
1 | from typing import List |
len_numbersを用いてループを回したいので、for文使います。
1 | from typing import List |
2つの数字を比較する回数は、今回でいうと6つの数字に対して、5回比較を行うため、len_numbers - 1
回行えば良いことがわかります。
さらに、その回数は1回ずつ減っていくことから、len_numbers - 1 -i
とすれば良いことがわかると思います。最初iには、0が入り、len_numbersには6が入るので、初期値は5になります。そしてループが回るごとに4, 3, 2, 1、となりますね。
1 | from typing import List |
もう少し大きな数字でもやってみます。内包表記を用いてlist内部で処理を記述します。
1 | from typing import List |
まとめ
本記事では、Bubble Sortというソートアルゴリズムを学びながら、以下のPythonの基礎を学びました。
- 関数定義
- 関数の引数と返り値の宣言
- 関数アノテーション
__name
と__main__
- 内包表記
アルゴリズムをより詳しく学びプログラミング力を高めたい方
- 以下の、Udemyのコースがおすすめです。セール時は、1200円で購入可能です。セール時でなくても、講師の方に、Twitterでクーポンコードの発行をお願いすれば、10$(1200円)で受講可能となります。30日間の返金保証もついているので、是非試してみてください。
- 本記事も、以下のコースで学んだ内容をもとに作成しております。