100日後にエンジニアになるキミ - 25日目 - Python - Python言語の基礎2

今日もPython言語の続きです

前回はこちら

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)


## インデックス

[![表示されなかったらすみません](https://img.youtube.com/vi/jicCr_agJ1c/0.jpg)](https://youtu.be/jicCr_agJ1c)

インデックスとはプログラム上で何番目？というのを表す数字です。

インデックスを用いることでプログラムでは様々なことが行えます。

**インデックスの表記**

`[]` 四角カッコで囲みその中に数値を入力する

```
[5]
```


文字のインデックスの例

```
print('はじめの一歩'[5])
```
歩

文字列は複数の文字からなるデータなので
インデックス番号の文字を取り出すことができる。





**インデックスの数え方**

インデックスは `0` から始まるので

文字列の最初の文字を取りたい場合インデックスは `0`　
２番目を取りたい場合インデックスは `1`になる

`n`番目のインデックス値は`n-1`
1つズレるので注意

最後の文字を指定する場合は　`-1` で指定でき
マイナスを付けると末尾から数えることができる。

```
# 最初
print('あいうえお'[0])

# 2番目
print('あいうえお'[1])

# 最後
print('あいうえお'[-1])

#  最後から数えて3番目
print('あいうえお'[-3])
```
あ
い
お
う

また
存在しないインデックス値を指定するとエラーになります。

```
print('あいうえお'[7])
```
IndexError Traceback (most recent call last)
<ipython-input-3-35481bea2f07> in <module>()
----> 1 print('あいうえお'[7])
IndexError: string index out of range

`IndexError`はインデックス値が範囲外の場合に起こるエラーのことで
`index out of range`とは
インデックス値が存在しない値を参照している意味です。

インデックスは必ず存在する値を指定してあげないといけません。






















































































**スライス**

Pythonではインデックスを使って
範囲指定でデータを取り出すことができる機能があり
「スライス」と呼んでいます。

スライスの書き方：

`[n:m]` n番目からm番目まで
`[n:]` n番目以降
`[:n]`  n番目まで
`[n:m:o]` n番目からm番目までo個とばして

```
# 3番目から5番目
print('あいうえおかき'[2:5])

# 2番目以降
print('あいうえおかき'[1:])

# 3番目まで
print('あいうえおかき'[:3])

# 最初から最後の1つ手前まで
print('あいうえおかき'[0:-1])

# 最初から最後の1つ手前までで1つ飛ばして
print('あいうえおかき'[0:-1:2])
```
うえお
いうえおかき
あいう
あいうえおか
あうお











































## 変数

[![表示されなかったらすみません](https://img.youtube.com/vi/rOgiB-Yjevg/0.jpg)](https://youtu.be/rOgiB-Yjevg)

プログラムでは入力されたデータを使い回す機能があります。
それが変数という概念です。

変数を用いることで入力したデータを再利用できるようになります。

**変数の宣言と値の代入**

`変数名 = 値`

`=` は代入を表す演算子（代入演算子）
`=` の左側に右側を代入する。

```
a = 12345
b = 23456
```

個数が合えば複数同時に宣言と代入が行える。

```
a,b,c = 4,5,6
d,e,f = '10','20','30'
```


**変数名に使用できる文字**

`a - z` のアルファベット(大文字と小文字)
`0 - 9` までの数字
`_` (アンダースコア)


変数名は自分で考えて付けるものなのでなんでも良いですが
中に格納するデータがどんなものかを考えて名称をつけるのが良いでしょう

この講義ではアンダーバーで
2つ以上の英単語を用いることを推奨します。

```
# 例：
magic_spell_name
attack_point
```

なお変数名は`予約語`や`組み込み関数名`に該当するものでなければ
なんでも付けることができます。

`予約語`などについては次項で

**変数の使い方**

宣言した後は、その変数を入力すれば使うことができます。

```
# 変数 a に 数値の12345　を代入する
a = 12345
# 変数 b に 数値の23456　を代入する
b = 23456
# 変数 a と b を足した結果を出力する
print(a + b)
```
35801

```
# 変数c にa + b の結果を代入する
c = a+b
# 結果
print(c)
```
35801

同じ変数名に値を代入すると上書きされます。

```
# 変数 a　に数値の123を代入
a = 123
print(a)

# 変数 a に数値の234を代入
a = 234
print(a)
```
123
234

```
a,b = 12345,23456
print(a)
print(b)

# a + b の結果を再度 a　に代入する(上書き)
a = a+b
print(a)
```
12345
23456
35801

プログラムではデータの形も重要です。文字と数値は一緒に計算できません。

```
a = '文字'
b = 1
print(a + b)
```
TypeError Traceback (most recent call last)
<ipython-input-7-2c4cb487c08a> in <module>()
1 a = '文字'
2 b = 1
----> 3 print(a + b)
TypeError: Can't convert 'int' object to str implicitly

`TypeError` : 変数 a と b　のデータの形が違うので
計算できない(変換できない)という意味合いのエラーです。

数値の型と文字の型ではデータの形が違うため一緒にすることができません。

**データの形の確認**

`type`関数を使って変数のデータ型を確認する

`type(変数名)`

```
# 変数aとcは数値、bは文字列を代入
a,b,c = 1 , '3' , 4
print(type(a))
print(type(b))
print(type(c))
```
`<class 'int'>`
`<class 'str'>`
`<class 'int'>`

`int` は整数の型
`str` は文字列の型を表す言葉です。

変数に格納したもののことを「オブジェクト」と呼んだりもします。
`変数` = `データの型` = `オブジェクト`
という関係性になるので、呼び方や概念を覚えておきましょう。

## 予約語

[![表示されなかったらすみません](https://img.youtube.com/vi/eHxPrTeuG0Q/0.jpg)](https://youtu.be/eHxPrTeuG0Q)

`予約語`というのはプログラム内であらかじめ使われてしまっている
言葉のことで、プログラムの中では特別な意味を持つ言葉になります。

**予約語一覧**

```
# 予約語の一覧を出す
__import__('keyword').kwlist
```

```
False
None
True
and
as
assert
break
class
continue
def
del
elif
else
except
finally
for
from
global
if
import
in
is
lambda
nonlocal
not
or
pass
raise
return
try
while
with
yield
```

Pythonの予約語はこれだけあります。
この予約語は変数名や関数名などに用いることはできません。

`jupyter notebook`上で`予約語`を使うと
緑色に表示が変わるので、気付けるかと思います。

```
for in with
```

<img width="335" alt="スクリーンショット 2020-04-14 18.14.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/b79db6cb-0b62-645d-f255-60c25a0d8cb0.png">

**組み込み関数一覧**

```
# 組み込み関数を表示する
dir(__builtins__)
```

```
ArithmeticError
AssertionError
AttributeError
BaseException
BlockingIOError
BrokenPipeError
BufferError
BytesWarning
ChildProcessError
ConnectionAbortedError
ConnectionError
ConnectionRefusedError
ConnectionResetError
DeprecationWarning
EOFError
Ellipsis
EnvironmentError
Exception
False
FileExistsError
FileNotFoundError
FloatingPointError
FutureWarning
GeneratorExit
IOError
ImportError
ImportWarning
IndentationError
IndexError
InterruptedError
IsADirectoryError
KeyError
KeyboardInterrupt
LookupError
MemoryError
NameError
None
NotADirectoryError
NotImplemented
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
PermissionError
ProcessLookupError
RecursionError
ReferenceError
ResourceWarning
RuntimeError
RuntimeWarning
StopAsyncIteration
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TimeoutError
True
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
__IPYTHON__
__build_class__
__debug__
__doc__
__import__
__loader__
__name__
__package__
__spec__
abs
all
any
ascii
bin
bool
bytearray
bytes
callable
chr
classmethod
compile
complex
copyright
credits
delattr
dict
dir
divmod
dreload
enumerate
eval
exec
filter
float
format
frozenset
get_ipython
getattr
globals
hasattr
hash
help
hex
id
input
int
isinstance
issubclass
iter
len
license
list
locals
map
max
memoryview
min
next
object
oct
open
ord
pow
print
property
range
repr
reversed
round
set
setattr
slice
sorted
staticmethod
str
sum
super
tuple
type
vars
zip
```

これを変数名に用いてしまうと、その関数の機能を
変数で上書きしてしまいその関数が使えなくなってしまいます。

間違えて使用してしまったらノートッブックを再起動しましょう。

変数名の宣言は英単語2個以上にすることで
こういった問題を回避することができたりするので推奨します。

```
# 例：
magic_spell_name
attack_point
```


## データ型

[![表示されなかったらすみません](https://img.youtube.com/vi/kqihAd7juIA/0.jpg)](https://youtu.be/kqihAd7juIA)

プログラム言語で取り扱うデータにはデータの型があり
書き方などが決まっています。
変数などで取扱う際も、データの型に合わせて書く必要があります。

**Pythonのデータ型を調べる方法**

`type`関数を用いる
`type(データ型)`

**整数型**

整数値を取扱うための型で
`int`型とも言います(integer の略)
四則計算を行うことができるデータ型です。

```
num = 1234
print(type(num))
```
<class 'int'>

プログラムでは通常の数値を書くと10進法で解釈されますが
その他に2,8,16進法を用いることができます。

数値の前に以下をつける
`0b`2進法 
`0o`8進法
`0x`16進法

```
# 2進法
num = 0b11000100
print(num)

# 8 進法
num = 0o777
print(num)

# 16進法
num = 0xffff
print(num)
```
196
511
65535

10進法は0から9まで数えて10までいくと１つ桁が繰り上がります。
2進法は0 , 1　で2つ数えて繰り上がり、
8進法は0から7まで行ったら繰り上がり
16進法は0から9までいったら次は英語のabcdefまでいくと
繰り上がるというものです。

**小数型**

整数型は小数点を取り扱えませんが
小数型は小数点も取扱うことができます。
浮動小数点型、`float`型ともいいます。

```
num = 1.234
print(type(num))
```
`<class 'float'>`


指数表記も使えます。

指数表記は英文字の`e`をつけ数値でn乗を表します。

`e3`は10の3乗を表し`-`を付けると逆に-n乗になります。

```
# 1.2の10の3乗
num = 1.2e3
print(type(num))
print(num)

# 1.2の10の -3乗
num = 1.2e-3
print(num)
```
<class 'float'>
1200.0
0.0012

同じ数値でも、整数型と小数型では違う形なので注意が必要です。
小数型と整数型の計算結果は小数型になります。

```
# 整数割る整数
print(10/4)
# 整数割る整数(余りなし)
print(10//4)
# 整数割る小数
print(10//4.0)
# 小数割る小数
print(12.3/4.0)
```
2.5
2
2.0
3.075

**論理型**

真偽値を取扱うための型で
`boolean`を略して`bool`型とも言います。
`True` か　`False`　どちらかの値が入る型です。

```
answer = True
print(answer)
print(type(answer))
```
True
`<class 'bool'>`

計算の判定結果はbool型になります。

`==`を用いると`==`の左側と右側が等しいかどうかを判定できます。

```
1==2
```
False

等しいかどうかを判定した場合、正しければ`True`
正しくなければ`False`という結果になります。

**文字列型**

文字列を取扱うための型で`string`型とも言います。
文字列(str)は`"`ダブルクォート 
または `'` シングルクォートで囲む必要があります。

```
# 文字列型
print(type('12345'))

# こちらは数値
print(type(12345))
```
`<class 'str'>`
`<class 'int'>`

数字をそのまま書くと整数型、もしくは小数点型になるので
文字列として扱いたい場合は`'`などが必要です。

**文字と数値の変換**

文字列を整数型に直す場合は
`int('数字')`

整数型や小数型を文字列に直す場合は
`str(数値)`

```
# 文字列を整数型に
a = '12345'
# 文字を数値に変換したので計算できるようになる
print(int(a) + 12345)
```
24690

```
# 小数点を文字列に変換
b = 2.5
# 数値を文字列に変換したので文字列として加えられる
print('江頭' + str(b) + '分')
```
江頭2.5分

**byte型**

`バイト列`として扱いたい文字列の `"..."` や `'...'`
の前に `b` または `B` を記述して、バイト列(bytes)であることを示すと
byte型になります。

```
byte_st = b'0123456789abcdef'
print(byte_st)
print(type(byte_st))
```

b'0123456789abcdef'
`<class 'bytes'>`


`b` がついていたら byte型で文字列型とは別物になります。

## まとめ

Python言語に関わらず、プログラム言語には様々なデータ型が存在します。
プログラムはデータを取扱うのでデータの型に合わせて書く必要があります。

プログラムでは変数を用いてデータの使い回しをしていきます。
変数の取り扱い方をデータ型と一緒に押さえておきましょう。

複数のデータが格納されるデータ型は
インデックスを用いて値を取り出すスライス機能が使えるので
取り扱い方を押さえておきましょう。

インデックスは様々なところで多用されるので
早めに覚えておく必要があります。


君がエンジニアになるまであと75日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython