プログラミング未経験者がpythonを学んでみる Part1 ~基本文法編1~

#概要
プログラミング未経験者がpythonを学んでいく過程を記録していく、自分用メモ的記事

テキストは↓を使用
![59972_ext_06_0.jpg](https://qiita-image-store.s3.amazonaws.com/0/255236/23a90247-f55f-ff59-d867-a7d3f865bc77.jpeg)


短期的な目標は、`Python 3 エンジニア認定基礎試験`の合格
ただ合格するための勉強ではつまらないので、ちゃんと業務に活かせるようにしたい
https://www.pythonic-exam.com/exam/basic

長期的目標としては、`Django`でナウいWEBサービス作ったり
機械学習とかもやってみたり


#諸々のスペック
##書いてる人
30半ばのサラリーマン

工事→オペレータ→構築→設計・運用
と、IT業界の闇を垣間見てきたインフラ系のエンジニア

主にCiscoやJuniperあたりを担当することが多かったが、
現在は所謂WEB系の企業に籍を置いている

最近はネットワークエンジニアでもプログラムを書けなければアカン！
という記事見たり見なかったりしたので
流行りに乗ってpythonなんぞに手を出してみる

ちなみにプログラム経験は**皆無**である

##マシンスペック
MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports)
Intel Core i5　2GHz 
8GB 1867 MHz LPDDR3
macOS High Sierra　10.13.3

バッテリー交換対象なので早めに対応したい
https://www.apple.com/jp/support/13inch-macbookpro-battery-replacement/

##環境
Python 3.6.5

PyCharm　Community　Edition
Version: 2018.1.2
Build: 181.4668.75

色々なサイトでおすすめされてるのでPyCharmが良いらしい

#pythonとは？
割と新しめのオープンソースのプログラミング言語
バージョンは2系と3系があるが、今から学習するなら3系が良さそう
(多少動作が違うらしい)

pythonが優れている点は以下

- 可読性の高さ

pythonはより少ないコードで実行できるよう設計されているので
コードが読みやすく、他の言語に比べれば学習コストは低いらしい

```:java
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
```


```:python
print("Hello, world!")
```

- ライブラリが豊富

ライブラリ(汎用的に使えるプログラムをまとめたもの？)がたくさん公開されているらしい
なんか色々便利に使えるとか何とか


- オブジェクト指向

オブジェクト指向・・・。聞いたことはあるけど、いまいちピンときませんな・・・
ソフトウェアを開発する上で、効率的な開発を行う為の概念らしい。
学習をしていく中で掴んでいこう！


#基本的な文法

##計算について

pythonで計算を行う場合は、以下の演算子を利用することができる

|演算子          |説明          |例          |結果          |
|:---------|:---------|:---------|:---------|
|x + y          |xとyの和          |1 + 2          |3          |
|x - y         |xとyの差          |2 - 1          | 1         |
|x * y          |xとyの積          | 2 * 3         | 6         |
|x / y          |xをyで割った商 |４ / 2          | 2.0         |
|x // y         |xをyで割った商の小数点以下切り捨て | 10 // 3         | 3         |
|x % y          |xをyで割った商のあまり          |  10 / 3        |  1        |
|- x           |xの符号反転          | -1         | -1         |
|x ** y          |xのy乗          | 2 ** 3         | 8         |

数字や文字列などのデータには、それぞれ`型`というものが存在している
整数であれば`int型`
浮動小数点数であれば`float型`
といった具合


|関数          |説明          |例          |結果          |
|:---------|:---------|:---------|:---------|
|abs(x)          | xの絶対値         | abs(-5)         |  5        |
|int(x)          |  xを整数(int型)に変換        | int(3.14)         | 3         |
| float(x)    | xを浮動小数点数(float型)に変換 | float(1)   |  1.0        |
| round(x[,n])  | xをn桁にまとめる(nを省略した場合は0)         | round(3.141592,3)    | 3.142      |

実行例

```
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 
>>> ((500*18)+(400*(8-2))+(700*(21-5)))*0.9
20340.0
>>> 
```

##変数について

###変数とは

`変数`とは、メモリ上に数値や文字列などのデータを一時的に記憶しておく為の領域
`変数`に付けた名前を`変数名`と呼ぶ

###変数を使うには
`変数`に値を記憶するには、`変数名 = 値`と記述する

```
>>> test = 100
>>> print(test)
100
>>> 
```

`変数名`にはアルファベットや数字、`_` (アンダースコア)が使用できるが
数字から始まる`変数名`は使用できない


また、その他にも`_` (アンダースコア)から始まるもの、
`予約語` と呼ばれるものも使用ができない

```:予約語の一覧
and as assert break class continue def 
del elif else except exec finally for from 
global if import in is lambda not or pass
print raise return try while with yield
```


```:変数の使用例
$ cat 001.py
test1 = 2
test2 = 3
result = test1 * test2
print(result)

$ python 001.py
6
```

###print関数で数値に説明を加える
`print関数`を使うことで、処理結果の画面出力ができるが
数値だけではなく、任意のテキストを出力することも可能
その際は、出力したい内容を`"`ダブルクォート、もしくは`'`シングルクォートで囲む
（関数についてはおいおい説明）

`print("これはテストです")`

また、`,`カンマで区切ると、複数の値を出力することが出来たり
`変数`を指定することも出来る

```:print関数の使用例
$ cat 002.py
test = 100
print("これはテストです" ,test)

$ python 002.py
これはテストです 100
```

##文字列について
### 文字列の表現方法
文字列は、`"`ダブルクォート、もしくは`'`シングルクォートで囲み、表現することができる
記号が違うだけで、できることは同じ

では、なぜ２つの記号が使えるのか？
それはクォート自身を文字列で表現したい場合があるから

```
#ダブルクォートを文字列で表現したい場合
print('aaa "bbb" ccc')
aaa "bbb" ccc

#シングルクォートを文字列で表現したい場合
print("aaa 'bbb' ccc")
aaa 'bbb' ccc
```

###特殊文字を使うときのエスケープシーケンスについて
ダブルクォートやシングルクォートを同時に文字列として使用したい場合は
`\`を使って、文字をエスケープすることができる

```
#ダブルクォートの中でダブルクォートを使用
print("aaa \"bbb\" ccc")
aaa "bbb" ccc
```

###三重引用符の利用
複数行にわたって文字列を記述したい場合は、`三重引用符`を使用する
`三重引用符`とは、ダブルクォートやシングルクォートを３つ連続で記述したもの

```
$ cat 003.py
test = """
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
"""
print(test)

$ python 003.py
(空行)
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
(空行)
```

このままでは、文字列の最初の行と最後の行に空行が挿入されてしまう
三重引用符の前後の改行前に`\`を置くことで空行を削除することがでる

```
$ cat 004.py
test = """\
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc\
"""
print(test)

$ python 004.py
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
```

###文字同士の結合
文字列と文字列は、`+`演算子を使うことで結合が出来る

```
$ cat 005.py
test1 = "aaa"
test2 = "bbb"
test3 = test1 + test2
print(test3)

$ python 005.py
aaabbb
```


###文字列に変数の値を埋め込む
文字列を結合するには`str型`（文字列型）同士でなくてはならない
`str型`と`int型`といった結合はエラーが発生してしまう
この場合、`int型`を`str型`に変換する必要がある

`str(数値)`

```:エラーが発生するプログラム
$ cat 006.py
test = 100
print("test" + test)

$ python 006.py
Traceback (most recent call last):
  File "/Users/XXXXXX/PycharmProjects/test/006.py", line 2, in <module>
    print("test" + test)
TypeError: must be str, not int
```

```:エラーが発生しないプログラム
$ cat 007.py
test = 100
test = str(test)　⬅️str型に変換
print("test" + test)

$ python 007.py
test100
```

###format()で値を埋め込む方法
文字列を埋め込みには、`format()`メソッドを使う方法もある
こちらの方が簡潔にプログラムを記述できる
（メソッドについてはおいおい説明）

`"文字列".format(値0, 値1, 値2, ....)`

```
$ cat 008.py
test0 = 1000
test1 = 100
test2 = 1
result = "{0}mm = {1}cm = {2}m".format(test0, test1, test2)

print(result)

$ python 008.py
1000mm = 100cm = 1m
```

###format()で名前付き引数を使う
名前付き引数を指定して、文字列中に埋め込むことも出来る

```
$ cat 009.py
test1 = "{age}才 {job}です"
test2 = test1.format(age=30, job="manager")
print(test2)

$ python 009.py
30才 managerです
```