Python 入門１ (算術演算子, ブーリアン, 関数, etc.)

# はじめに

このシリーズは、プログラミング経験やアルゴリズムとデータ構造などの一定の知識がある方に向けて、Pythonの基礎について解説することを目的としています。

一つの記事あたり大体１５分程度で読み終われるように文章量を調整しています。

また、この記事で取り扱う内容はPython 3を前提としています。

# 目次

- Pythonとは
- 算術型と算術演算子
- ブーリアン型と論理演算子
- リスト
- リスト内包表記
- 関数の宣言
- 参考文献

# Pythonとは
Pythonは、動的型付けを特徴とするマルチパラダイム言語です。

Pythonを用いるメリットの一つとして、疑似コードと見間違えられるような洗練されたシンプルな文法が挙げられます。

他のプログラミング言語では冗長で複雑になってしまうような場合でも、可読性を失わず簡潔なコードを記述できることは、多くのプログラマーにとって魅力的に映ることでしょう。

# 算術型と算術演算子

#### 整数型の宣言

```int.py
x = 3
x += 2   # 複合代入演算子
print(x, type(x))
```

実行結果
> 5 \<class 'int'\>

Pythonは、C++やJava等の言語とは異なり、文の終端にセミコロンを付ける必要がありません。

#### 浮動小数点型の宣言

```float.py
y = 5.13
y *= 1.98   # 複合代入演算子
print(y, type(y))
```

実行結果
> 10.157399999999999 \<class 'float'\>

#### 算術演算子

Pythonの算術演算子は他のプログラミング言語のものとほとんど違いがありません。

しかし、Pythonにはインクリメント演算子やデクリメント演算子が存在しないので、その点については注意しなくてはなりません。

```arith_operators.py
print(x + 5)     # 加算
print(x - 10)    # 減算
print(x * 30)    # 乗算
print(y / 2.4)   # 除算
print(x ** 2)    # 累乗 (二乗)
print(x ** 3)    # 累乗（三乗)
```

実行結果
> 10
> -5
> 150
> 4.23225
> 25
> 125

上の例で挙げたように、Pythonには累乗を求める専用の演算子があり、その演算子を用いると簡潔に書くことができます。

```
x ** y   # xのy乗を求める
```

# ブーリアン型とブーリアン演算子

Pythonのブーリアン演算子は、C言語などで使われている&&や||などの記号の代わりに、andやorなどのアルファベットを用いて論理演算を記述します。

```bool_operators.py
a, b = False, True
print(a and b)       # 論理積
print(a or b)        # 論理和
print(not a)         # 論理否定
print(a != b)        # 排他的論理和  この演算だけ記号を用いて記述する
```

実行結果
> False
> True
> True
> True

# リスト
リストとは、Pythonで最もよく用いられるデータ構造の一つです。

リストには異なる型のデータを同時に保存することができます。また、保存されたデータはその値を更新することができます。

要素には順番があり、添え字（インデックス）を使って要素にアクセスすることができます。

```ls.py
ls_num = [1, 2, 3, 4, 5]
ls_str = ["Apple", "Google", "Microsoft"]
ls_mix = [1, 4, 4.32, "Java", "C++", 94]   # 複数のデータ型を保存可能

print(ls_num)
print(ls_str)
print(ls_mix)

ls = ls_num + ls_str   # リストの結合
print(ls)
```

実行結果
>[1, 2, 3, 4, 5]
>['Apple', 'Google', 'Microsoft']
>[1, 4, 4.32, 'Java', 'C++', 94]
>[1, 2, 3, 4, 5, 'Apple', 'Google', 'Microsoft']

# リスト内包表記

```
[式 for 任意の変数名 in イテラブルオブジェクト]
# イテラブルオブジェクトとは、配列やリストのような繰り返しの処理によって順番に要素を取り出すことができるオブジェクトのことを言います。
```

リスト内包表記の目的は、イテラブルオブジェクトの各要素に対して特定の処理を繰り返した後、結果を新規のリストに保存するという一連の作業を簡潔に記述することにあります。

```ls_comprehensions_num.py
num = [1, 2, 3, 4, 5]
squared_num = [n ** 2 for n in num]   # リストnumの各要素を二乗した結果を新規のリストに保存する
print(squared_num)
```

実行結果
> [1, 4, 9, 16, 25]

```ls_comprehensions_str.py
ls_str = ["I", "like", "Okinawa", "HELLO"]
ls_lower = [str.lower() for str in ls_str]   # lower関数を使って大文字を小文字に変換

print(ls_str)   # 変換前
print(ls_lower)   # 変換後 (大文字 -> 小文字)
```
実行結果
>['I', 'like', 'Okinawa', 'HELLO']
>['i', 'like', 'okinawa', 'hello']

また、リスト内包表記では、イテラブルオブジェクトの全ての要素に対して無条件に処理を行う代わりに、if文で指定された条件を満たす要素だけを対象とすることもできます。

この場合、下記のような表記方法を用いることができます。

```
[式 for 任意の変数名 in イテラブルオブジェクト if 条件式]
```

```ls_comprehensions_if.py
num = [1, 3, -3, -4, 5, 10]
squared_plusnum = [n ** 2 for n in num if n > 0]   # n > 0 の要素だけが二乗され、新規のリストに保存される
print(squared_plus_num)
```

実行結果
> [1, 9, 25, 100]

numの要素nが正の整数のとき真となる条件式を付け加えた結果、numに含まれる全ての正の整数のみを二乗して得られるリストを作成することができました。

# 関数

Pythonでは、関数を以下の形式で宣言します。
```
def 関数名(引数１, 引数2, ...):  #引数リストの直後に:を付与する
   処理１
   処理２
   ...
```

```func.py
def min(a, b):
   return a if a < b else b   # 三項演算子

# テストコード
a, b = -3, 5
print(min(a, b))
```

実行結果
> -3

注意しなくてはならないのは、引数リストにおいて名前だけ指定している点です。

また、初心者は引数リストの直後にコロンを付け加えることを忘れがちなので、その点においても気を付ける必要があるでしょう。

次に、より複雑な関数を定義してみます。

今回はクイックソートを実装します。

```quicksort.py
def quicksort(arr):
  if len(arr) <= 1:
    return arr
  pivot = arr[len(arr) // 2]   # 配列の中心の要素pivotを求める 
  left = [x for x in arr if x < pivot]   # pivotより小さな値はleftリストに保存する
  middle = [pivot]
  right = [x for x in arr if x > pivot]  # pivotより大きな値はrightリストに保存する

  return quicksort(left) + middle + quicksort(right)   # 左側の配列と右側の配列に対してそれぞれ再帰的にquicksort関数を呼び出す

# テストコード
num = [1, 4, 0, -11, 43, -33, 5]
print(quicksort(num))
```

実行結果
>[-33, -11, 0, 1, 4, 5, 43]

四行目では、配列の真ん中の要素を求めるために、対応する添え字(インデックス)を求めています。その際に、//演算子を効果的に利用してコードの簡略化を行っています。

//演算子は、除算を行った上で、得られた商の小数部を切り捨てます。

この演算子を用いたことで、中心の要素の添え字（整数値）を求める手順を簡潔に実装してます。

# 参考文献
[Pythonチュートリアル (英語版)](https://colab.research.google.com/github/cs231n/cs231n.github.io/blob/master/python-colab.ipynb)

[リストの基本](https://atmarkit.itmedia.co.jp/ait/articles/1905/31/news015.html)

[リスト内包表記](https://www.javadrive.jp/python/list/index16.html)

[関数の定義](https://www.python.jp/train/function/index.html)