初めてのPython ~コーディング編~

# 対象者
[前回の記事](https://qiita.com/kuroitu/items/f632e5c1f7445280fa9a)の続きです。
本記事ではプログラミング初めての方を対象としていますので、ある程度他のプログラミング言語を嗜んでいらっしゃる方は[初めてのPython](#初めてのpython)まで読み飛ばしてください。


# 目次
 - [プログラミングとは](#プログラミングとは)
 - [プログラミングで大切なこと](#プログラミングで大切なこと)
 - [初めてのPython](#初めてのpython)
    - [numpyの使い方](#numpyの使い方)
    - [グラフを描く](#グラフを描く)


# プログラミングとは
プログラミングを始めようとしているあなたにとって、プログラミングとは一体何でしょうか？
「IT業界が今後伸びそうだな〜」「プログラマとかシステムエンジニアとか需要ありそうだな〜」と思って闇雲に勉強を始めようとしていませんか？
**それは挫折フラグです。**
例えば受験勉強で、目標・目的がないまま勉強して辛かった思い出とかありませんか？
人間、目標がないと興味ややる気が続かないものです。
なのでまずはなんでもいいので**目標**を決めましょう。
例えば

 - 機械学習・深層学習について知っていきたい
 - 数値計算で偏微分方程式を解いて、可視化してみたい

などの、**難易度の高いものである必要はありません。**
もっと簡単に、

 - いろんなグラフを表示してみたい
 - ゲームを作ってみたい
 - １００行くらいのコードを書いてみたい

のような、ふとした思いで十分OKです。

**プログラミングとは手段です。それを忘れないようにしましょう。**


# プログラミングで大切なこと
プログラミングをする上で最も大切なことは何だと思いますか？選んでみてください。
(チェックボックスはチェックできませんので注意笑)

 - [ ] センス
 - [ ] 創作意欲
 - [ ] 勤勉さ
 - [ ] 新しいもの・技術への興味
 - [ ] 大規模なコードを書ける体力
 - [ ] 読みやすいコードを書くこと
 - [ ] google先生に聞く力

<details>
<summary>選んだらここをクリック</summary>

あくまで個人的にですが、最後の「**google先生に聞く力**」だと思っています。
もちろん上記全て大切です。それでも、自分一人で解決できない問題に苦しんだ時にその解決策を知る手段を調べたり、今自分が取り組んでいる課題に対してよりスマートに解決する手段はないか調べたりする能力というのは、プログラミングを継続していくためには重要ではないでしょうか。
「好きこそ物の上手なれ」[^1]とか昔の人も言ってますしね。
ということで、google先生をフル活用する方法を少しご紹介します。

## google先生の使い方
### エラーで困った時
まずはエラーで困った時の調べ方です。
もちろんエラー文を読み解いて原因を探り解決できるのが最もいいでしょうが、どうしても自分ではさっぱりわからないことも多いです。
そんな時は**エラー文をまるっとコピペ**してgoogle先生に聞いてみましょう。
**Pythonのエラーの場合は「〇〇Error: [エラー文]」などとなっている部分をコピペします。**
すると、大抵誰かが同じ悩みでどこかに相談していて、既に誰かが解決しています。
(英語のサイトしかヒットしない場合もありますが、それすらもgoogle先生は翻訳という解決策を提示してくれる有能っぷり笑)
ちなみに、エラー文の「〇〇Error」の部分だけで検索するとそのエラーについて包括的に知ることができるので勉強になります。

### 課題解決
あなたが今取り組んでいる課題が一見複雑そうに見える時、例えば解決策はわかるがコードが長くなるとか、いまいちパッとしない、そんな時はキーワードで検索しましょう。
**あなたの課題を端的に3単語くらいで表すならどうなるか**を考えて、**3単語程度**(必要なら増やしましょう)で検索をしてみましょう。
**最初の単語は使用しているプログラミング言語を入れましょう。そしてそれを除いた3単語で検索します。**
きっと誰かがスマートな解決策を提示してくれていますよ！

例：複数のグラフを一つにまとめて表示したい！
→ python グラフ 複数 表示
</details>


# 初めてのPython
さて、ようやくコーディングに移ります(長々と申し訳ない...)。
大抵のプログラミング入門書や入門サイトではまず条件分岐(多くは`if`文など)やループ処理(多くは`for`文や`while`文など)を取り扱っていると思います。
ですが、ここでは最初に別のトピックを扱いたいと思います。
**理由は簡単、面白くないからです。**
ぼくが初めてプログラミングに触れたのは高校1年生の頃だった気がしますが、秒で飽きました。はい。
`if`文？`for`文?はぁ?で、何ができるの?って感じで、**先が見えなかったことが原因**かなぁと思ってます。
あと**シンプルな出力(Hello worldとか)以上のことがあまり出てこなかった**からでしょうか。
~~要するに地味なんですね。~~
ということで、本記事では最初にnumpyの使い方をスーパー簡単に紹介したら、いきなりグラフ描きます。

## numpyの使い方
numpyは他の多くのプログラミング言語には標準搭載されている**配列**というデータ型が存在しません[^2]。
numpyは**Pythonで配列を使えるようにする**パッケージだという認識で最初は構わないでしょう(実際はもっと色々できます)。
何はともあれ実践あるのみ。

<details>
<summary>numpy_calc.py</summary>
<div>

```numpy_calc.py
import numpy as np


# 配列を生成
x = np.arange(10)
print(x)

# 足し算
print(x + 3)

# 引き算
print(x - 3)

# 掛け算
print(x * 3)

# 割り算
print(x / 3)

# 累乗
print(x ** 3)

# 割った時の商
print(x // 3)

# 余り
print(x % 3)
```
</div></details>

とりあえずよく使う演算子の計算を紹介しました。
(他にどんな演算子があるのか気になる人はググってね👍)
ここでは実はnumpyの便利な機能である**ブロードキャスト**というものが使われています。
ブロードキャストとは、簡単にいうとサイズの違う配列同士や配列と数値(スカラ値)の演算の際に、**勝手にサイズを合わせて計算してくれる機能**です。
つまり先のnumpy_calc.pyでは配列と数値の演算なので、数値の方が配列の方にサイズを合わせて計算していることになります。
もっと噛み砕いていうと、出力結果を見たらわかる通り最初の配列`x`の全要素にそれぞれ3が足されたり引かれたりされていると思います。

## グラフを描く
はい、もうグラフを描いちゃいます。
とりあえず以下のコードをjupyter notebookの新規セルにコピペ＆「Shift+Enter」で実行しましょう。

<details>
<summary>graph_plot.py</summary>
<div>

```graph_plot.py
# グラフを表示してみる
import matplotlib.pyplot as plt
import numpy as np


def f(x):
    return x ** 2


x = np.arange(-3, 3, 0.1)
y = f(x)

plt.plot(x, y)
plt.show()

# HW0. 色々調べる(defとは? np.arangeとは? plt.plotとは? etc.)
# HW1. グラフにタイトルを追加する
# HW2. グラフに凡例を追加する
# HW3. グラフにx軸ラベルとy軸ラベルを追加する
# HW4. グラフの線の色を変える
# HW5. なんかグラフ色々書いてみる
```
</div></details>

(読みやすくするための空行やコメントを除けば)たったの８行で二次関数のグラフが描けましたね！
**様々なパッケージを用いるとこんなに簡単に色々できるのがPythonの強みです。**

ところで...コード中にコメントで書かれているHWですが、勉強がてらgoogle先生に聞きながらやってみてください。
解答の一例も載せておきます。
何ができるのか、どうやって動いているのか、どういうことをしている人がいるのか、 etc.
色々考えながら調べ尽くしてみてください。

<details>
<summary>解答一例はこちら</summary>
<div>

```graph_plot.py
# グラフを表示してみる
import matplotlib.pyplot as plt
import numpy as np


def f(x):
    return x ** 2 - x + 2


x = np.arange(-3, 3, 0.1)
y = f(x)

plt.plot(x, y, label='hoge', color='red')
plt.title('test plot')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# HW0. 色々調べる(defとは? np.arangeとは? plt.plotとは? etc.)
#     def: 関数の定義のためのビルドイン
#     np.arange: 配列を生成する関数。他にも色々ある
#     plt.plot: グラフを生成する関数。表示するわけではない
# HW1. グラフにタイトルを追加する
# HW2. グラフに凡例を追加する
# HW3. グラフにx軸ラベルとy軸ラベルを追加する
# HW4. グラフの線の色を変える
# HW5. なんかグラフ色々書いてみる
```
</div></details>

# 初めてのPythonシリーズ記事
 - [初めてのPython ~環境構築編~](https://qiita.com/kuroitu/items/f632e5c1f7445280fa9a)
 - [初めてのPython ~コーディング編2~](https://qiita.com/kuroitu/items/a59389a2e263b339b96c)
 - [初めてのPython ~課題編~](https://qiita.com/kuroitu/items/efc2f025012447555c1a)


[^1]: どんなことであっても、人は好きなものに対しては熱心に努力するので、上達が早いということ。
[^2]: ただ、Pythonには標準でnumpyが搭載されているので実質標準搭載されていると言って良かったりします笑