【超初学者】python研修を終えたので概要のまとめとおすすめ自己学習


勤務先でPythonの研修をおこないました。
ちょっと前まで私は技術のギの字も分からず怯えていた人間なので、超初学者に貢献できるような情報源になればと思い書いてみます。

構成は以下の通りです。

+ 研修でやったこと
 ├Pythonはどういう言語か
  └基本文法
+ おすすめ自己学習

さっそく、いってみましょう。

# 研修でやったこと

研修では、大きく二つの内容を扱いました。

+ Pythonはどういう言語か
+ 基本文法

それぞれ自分なりにまとめを試みていきます。
基本文法の部分はみなさんも実際に動かしながら見てもらえると、よりわかりやすくなると思います。

もしもわかりにくいと感じた人は、変に熟読せず読み飛ばしちゃってください。
<font color="#FF0000">（私の文章よりも、おすすめ自己学習で紹介する**Atcoder**の方がわかりやすいと思うのでそちらに時間を割いたほうがよいです）</font>

また、とにかく初心者でも知識を飲み込めるようにしたいと思っているので、ざっくりとした説明が主になります。
だいたいこういうことだ！という理解を目指しているので、もしベテランの方で内容に厳密さを欠いていると思われてもどうかご容赦ください。


### Pythonはどういう言語か

一言でいうと、**シンプルに書けるやつ**です。
また、**インデント**<font color="#FF0FFF">（字下げのこと）</font>がコーディングの中身に影響を与えるため、誰が書いても読みやすさが担保されます。

つまり、書きやすいし読みやすい。
初心者におすすめ…らしいです。

その他にも以下のような特徴があります。

+ オブジェクト指向
+ インタープリタ
+ マルチプラットフォーム

それぞれ解説していきます。


**・オブジェクト指向**

世の中にあるモノを**オブジェクト**<font color="#FF0FFF">（モノの別名だと思ってください）</font>と考えて、それらを組み合わせてシステムを構築する設計思想です。
オブジェクトは**属性**<font color="#FF0FFF">（モノが持つ特性）</font>と**処理**<font color="#FF0FFF">（モノがする行動）</font>を持つらしい。

例えば車をオブジェクトとしたら「走行速度」や「積載量」が属性で、「走行する」という動きが処理として考えられます。

オブジェクト指向ではこの「車」というオブジェクトの他に、「道路」とか「信号機」とか「交差点」とかを組み合わせて、最終的に交通のシステムにするという感じです。

それができるからなんやねんって感じかもしれませんが、これにはメリットがあります。
もし「車」というオブジェクトがあれば、後で「スポーツカー」や「リムジン」を作りたくなった時に便利になるのです。「車」をちょちょいと改変すればいいだけなので。

そういうわけで、オブジェクト指向はコードの書きやすさに寄与していたりします。


**・インタープリタ**

ソースコードをバイトコードに変換し、PVM（Python仮想マシン）がバイトコードを１命令ずつ実行することです。

何言ってるかわからないですね。

そもそも機械は、我々が読める文字のコードをそのまま読み込んでいるわけではありません。機械語に翻訳されて、はじめて実行ができます。
その翻訳を一遍にやるか、ちまちまやるかの派閥があるのですが、インタープリタはちまちまやる方です。

ちまちまやってると何がいいのかというと、作成途中のコードでもその場でエラーを確認できるそうです。つまり、デバック<font color="#FF0FFF">（自分の作っているものがちゃんと動くかの確認）</font>がしやすいらしいです。
正直、経験が浅すぎて私も実感がありません！
そういうもんなんだ～と思ってくれればOKです。多分。

**・マルチプラットフォーム**

様々なプラットフォームで使えることです。
環境ごとに専用のPVMがあり、それによってマルチプラットフォームが実現しています。
つまりプラットフォームごとに、そのプラットフォームへ特化した通訳を用意しているイメージです。

ゲームで例えましょう。
あなたはニン〇ンドースイッチで好きなゲームがあります。友達にもおすすめしたいと思い、カセットを持っていきました。しかし、その友達の家にはプレイス〇ーション5しかないことが判明！
異なるゲーム機に同じカセットを挿すことなんてできないじゃないか！と、あなたは失望します。

ところが、なんとそれができるのです。
同じカセットでニン〇ンドースイッチでもプレイス〇ーション5でも、でもXb〇xでも遊べちゃう！
これがマルチプラットフォームです。

この例ではゲーム機がOSやデバイス、カセットがPythonの代わりになっています。
つまるところ、どんなパソコンでも使えるんだな～って思ってくれればOKです。




# 基本文法

ここからは実践になります。
研修ではgoogle colaboratoryを使ってpythonがどう動くか見てきました。
無料で使用できるので、pythonをとりあえず触ってみたい人は覗いてみてください。

https://colab.research.google.com/?hl=ja

google colaboratoryの始め方は以下の通りです。


1.URLをクリックしたら、左上の**ファイル**から**ドライブの新しいノートブック**をクリック。
2.Googleへのログインが求められるので適当なアカウントでログインします。
3.ログインしたら、入力ができるようになります。
4.**+コード**を押すことでコードセルを増やせるので、複数種類のコーディングを同時におこなえます。


ここまでできたらいよいよコーディングです！
今回おさえておきたいのは以下の4つ。

+ 変数
+ print
+ input
+ 四則演算

さっそく見ていきましょう。

**・変数**

まずは変数です。
`好きな名前 = 数字や文字`で、自分が宣言した名前に数字や文字を代入できます。
下では、`num`という名前に`10`を代入し、そのあと出力することで`10`が返ってくるコードになっています。（下のコードでわからないところがあっても気にしないでいいです。ほ～んと思ってください。）
```python:変数
#numに10を代入
num = 10

#numを出力
print(num)

#実際にやったら10が返ってくる
```
つまり、**`=`があったら、なんか同じものになるんだな**と考えてください。
では以下の場合はどうでしょう。

~~~python:変数上書き
#numに10を代入
num = 10

#numに1を代入
num = 1

#numを出力
print(num)
~~~
この時、返ってくる数字は1になります。
プログラムは上から下へ順番に処理されていくルールがあるため、**最初に代入した`num=10`を、そのあと`num=1`が上書きしている**のです。

さらに、文字も代入できます。
文字を代入する時は、数の代入と同じく`=`を使います。ただし、`=`の後は文字をそのまま入力するのではなく、**シングルクォーテーション`' '`かダブルクォーテーション`" "`で文字を囲みましょう。** 両者に違いはないので、好きな方でOKです。
~~~python:変数に文字を代入
#engにhello,Qiitaを代入
eng = 'hello,Qiita'

#jpにこんにちは、キータを代入
jp = "こんにちは、キータ"

#engを出力
print(eng)

#jpを出力
print(jp)
~~~
これで`hello,Qiita`が出力され、改行して`こんにちは、キータ`も出力されます。

以上が変数です。
`=`でつなげたら、数字や文字と同じになると覚えておいてください。

**・print**
さっきから頻出している`print`について説明します。
勘のいい人はお気づきかもしれませんが、これは**出力をする時に使用します。**

使用する時は`print()`の形で書きます。
（）の中に数や変数を入れると、その（）の中のものを出力します。

~~~python:print( )で出力
#1を出力する
print(1)

#こんにちはを出力
print("こんにちは")
~~~

上の場合だと、`1`と`こんにちは`が出力されます。
`print`がなければコードを実行しても結果を出力してくれないため、しっかり覚えておきましょう。


**・input**
実行すると、**入力を受け付ける**ようになります。
先ほどまでの例では、プログラム内ですでに出力したい数字や文字が決まっていました。しかし、電卓のように使用する都度で入力する数字が変化していく場合も考えられます。そんな時に`input`を使えば、実行するたびに入れたいものを受け付けてくれます。

書き方は`input()`で、()の中に値を入れると入力する箇所の隣に値を出力できます。これを使えば、`数字を入力してください`のように、ユーザーに対してメッセージを表示する場合に使ったりできます。
( )の中に値を入れなかった場合は、そのまま入力フォームが出現します。
~~~python:input( )で入力
#「ここに入力」の隣に入力フォームが出る
input('ここに入力->')

#inputしたら、printなしでも入力したものが返ってきます
~~~
また、`input`と変数を組み合わせて、入力したものを代入させることが可能です。

~~~python:inputと変数を組み合わせる
#xにinputで記入したものが代入される
x = input('ここに入力->')

#xが入力したものに置き換わって出力される
print('あなたが入力したものは',x,'です')
~~~

**入力を受け付けた～い、って場合はinput( )** と覚えてください。


**・四則演算**
プログラムというからには計算ができます。
四則演算をさせてみましょう。

足し算をするには`+` を使います。

~~~python:足し算
#1と1の足し算で2が出力される
print(1+1)

#計算式は" "で囲ったら計算されず文字として出力されるので要注意
print("1+1")
~~~
引き算には`-`を使います。 
~~~python:引き算
#5から1を引いて4が出力される
print(5-1)

#負の数になる計算もちゃんと出力してくれます
print(1-5)
~~~
掛け算には`*`を使います。
~~~python:掛け算
#2と5をかけて10が出力される
print(2*5)

#どの計算でも変数を使うことができます
num = 3
ten = 10

#numは3、tenは10なので、30が出力される
print(num * ten)
~~~
割り算はふたつあります。
`/`が電卓でやるような割り算の結果を返してくれて、小数まで出力してくれます。
`//`では整数のみを出力し、小数部分は切り捨てます。 

~~~python:割り算
#/だと小数点まで。3.5を出力
print(7 / 2)

#//だと小数点以下は切り捨て。3を出力
print(7 // 2)
~~~
また、演算子たちは`print`や変数と組み合わせることも可能です。

~~~Python:演算子応用
#xとyに数を入力します。
#intで囲むことによって、inputでもらった入力は整数型だと宣言します
x = int(input('数1を入力 ->'))
y = int(input('数2を入力 ->'))

#zにはxとyで入力した数の合計を代入します
z = x + y

#zを出力
print(z)
~~~
上の例で`int`というのが出てきましたが、これは **`input`からの入力を整数型に変換** しています。
説明していませんでしたが、プログラムには **データの種類** があり、それを**型**と言います。

例えば`1`や`5`は整数型`int`で、`こんにちは`や`Hello`は文字列型`str`になっています。
これがどうして重要なのかというと、プログラムが型を見ながら処理を判別しているからです。

先ほどの例では、`input`で入力された数のことを`int`型だと宣言していました。`input`は通常、`str`型として入力を受け付けています。つまり、`int`で囲わなかった時、プログラムは入力を数ではなく文字であると解釈してしまいます。

~~~Python:inputを計算に使いたい場合はintで囲む
#xとyに数を入力します。
#今回はintで囲わず、文字としてプログラムに処理させてみます
x = input('数1を入力 ->')
y = input('数2を入力 ->')

#intで囲った場合は「数 + 数」だったため足し算がおこなわれていました
#今回は「文字 + 文字」であるため、数1の後にそのまま数2が並んで表示されます
z = x + y

#1 + 3 なら13、10 + 5 なら105といった具合に出力されます
print(z)
~~~
よくわからないという人は、ざっくり **`input`で数を扱うなら`int`、文字ならそのまま** と考えてください。
ちなみに、異なる型同士で計算をおこなうことはできないため、宣言には注意しましょう。

~~~Python:型が異なると計算できない
#xには数、yには単位を入力します。
#xには整数が、yには文字が入っているとプログラムは解釈します
x = int(input('数1を入力 ->'))
y = input('単位を入力 ->')

#このとき、xとyは型が違うので、演算子での計算をするとエラーが発生します
print(x+y)
~~~
もし整数と文字をつなげたいなら`,`を使います。

~~~Python:,を使えば数と文字をつなげて出力できる
#xには数、yには単位を入力します。
#xには整数が、yには文字が入っているとプログラムは解釈します
x = int(input('数1を入力 ->'))
y = input('単位を入力 ->')

#1 と 個 を入れた時、1個と出力されます
print(x,y)
~~~


基本文法は以上です。
研修では他にもfor文やif文をやりましたが、ひとまずここまで。
おもしろいナ～と思った人はこのあと紹介する**AtCoder**で遊んでみてください。

# おすすめの自己学習

プログラミングとか何もわからないよ～って人向けです。
私が入社前にちまちまやっていてよかったと思うこと、今やっていることを紹介します。

まずは **AtCoder** です。

こちらは競技プログラミングサイトなのですが、プログラミング未経験者の人向けの入門講座が用意されています。
確認問題が一問一答でクイズのように学べて、とにかく楽しいです。
説明も簡潔だったので、この記事で「？」が浮かんだ人もぜひ覗いてみてください。




私はプログラミングのことを全く知らないマンだったのですが、入社前にAtCoderでプログラミングの基礎に触れていたのが研修の助けになりました。

ちなみに、研修でやるのはPythonなのにC++入門をやっていました。
言語が違っても考え方が育まれるのでやって損はなかったです。

https://atcoder.jp/contests/APG4b

上のC++入門 AtCoder Programming Guide for beginners (APG4b)を2章までやっていました。
実はPython入門もあるので最初から「Pythonがやりた～い♪」って人はこちらをぜひ。

https://atcoder.jp/contests/APG4bPython

どちらもweb上で全部完結するので、環境を用意したり、PCをいじくる必要がありません。
情報系に自信がない人にも試してほしいです。


次に **「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典** （以下、わわわ）を紹介します。
こちらはIT系の調べものをしたいという時におすすめです。

https://wa3.i-3-i.info/index.html

私がよくぶち当たった壁として **Aの説明文にBという用語が使われていてBの説明がほしくなる問題** がありました。クイズの答えがまたクイズ、みたいな。

例えば「Python」を調べようとして、「Pythonとはオブジェクト指向のインタープリタ言語です」って言われても、なるほどとはなりません。
オブジェクト指向？ インタープリタ？ と、疑問が増えるだけでした。
もちろん、それはそれで調べつつどうにかしますが、全部調べ終えた後に知識を統合して「じゃあPythonって結局なんだったんだ」を考えるのがとても面倒！！

調べることに脳のリソースを割かれるなら、一旦はなんとなくの理解で覚えて引き出しを増やしたほうがいいじゃないか！ というのが個人的な考えです。

そこで先ほど紹介した「わわわ」さんの出番。
とにかく簡略化した説明と豊富な図によってなんとなく用語を飲み込めます。
しかも説明にユーモアがあるので、学習意欲も出る。
最近は困ったらまず「わわわ」で調べ、そこから深く掘り下げてみるという流れを実践しています。

ちなみにPythonの記事はこちら。

https://wa3.i-3-i.info/word14243.html

詳しいことは理解できなくても「プログラミング言語なんだな～」とわかるはずです。
それがわかっていれば日常会話くらいどうにかなるだろって部分が一言でまとまっているのでタイムパフォーマンスもいいかもしれないですね。

人によって賛否あるかもですが、個人的にはおすすめです。

結局、自己学習って継続が一番だと思うので楽しめる方を選んだらいいのではと思います。
みなさんもぜひ、楽しみながらPythonなどを触ってみてください。