[Python3 入門 3日目]2章 Pyの成分： 数値、文字列、変数 （2.2〜2.3.6）

#2.2 数値
Pythonには整数（5や10000000などの小数点以下がない数値）と不動小数点数（3.12121,14.99,1.32e3など）、虚数のサポートが組み込まれている。

##2.2.1 整数
四則演算。

```py
>>> 5
5
>>> 0
0

#数字の前にゼロを置いてはならない。
>>> 09
  File "<stdin>", line 1
    09
     ^
SyntaxError: invalid token  
>>> 123
123
>>> +123
123
>>> -123
-123
>>> 5+9
14
>>> 100-7
93
>>> 4-10
-6
>>> 5+9+3
17
>>> 4+3-2-1+6
10
>>> 6*7
42
>>> 7*7
49
>>> 6*7*2*3
252

#浮動小数点数（10進）徐算を行う
>>> 9/5  
1.8

#整数（切り捨て）徐算を行う
>>> 9//5  
1
>>> 9/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 9//0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
```

C言語と同じルールなので割愛したいところだが。。。

```py
>>> a=85
>>> a
85
>>> a-5
80
>>> a
85
>>> a=a-3
>>> a
82
>>> a
82
>>> a=95
>>> a-=3
>>> a
92
>>> a +=8
>>> a
100
>>> a *=3
>>> a
300
>>> a/=3
>>> a
100.0
>>> a=12
>>> a=13
>>> a//=4
>>> a
3
>>> 9%5
4

 #（切り捨てされた）商と剰余をまとめて手に入れられる
>>> divmod(9,5) 
(1, 4)
```

##2.2.2 優先順位
他言語と同様に加減より乗除の方が優先順位が高い。

```py
>>> 2+3*4
14
>>> 2+(3*4)
14
```

##2.2.3 基数
整数はプレフィックスで特に基数を指定しない限り、10進(基数10)とみなす。

基数とは「桁上がり」するまで何個の数字を使えるかを示す。
ex.2進の場合、数字は0と1だけになる。
0は10進の0と同じ意味で、1も10進の1と同じ意味だが1に1を加えると10になる（1個の10進数2と0個の1）

```py

#2進数の場合、1個の10進数2と0個の1という意味
>>> 0b10  
2 

#8進数の場合、1個の10進数8と0個の1という意味
>>> 0o10  
8

#16進数の場合、1個の10進数16と0個の1という意味
>>> 0x10  
16
```

##2.2.4 型の変換
### int()関数
Pythonの整数以外のデータ型を整数に変換する時に使う。
整数部だけ残し、小数部を切り捨てる。

```py
>>> int(True)
1
>>> int(False)
0
>>> int(98.6)
98
>>> int(1.0e4)
10000
>>> int('99')
99
>>> int(''-213)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
>>> int('-123')
-123
>>> int(12345)
12345

#数値に見えないものを変換しようとするとエラー発生
>>> int('9aaaaaa')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '9aaaaaa'  
>>> int('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>> int('98.6')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '98.6'

#指数部や浮動小数点数を含む文字列は処理しない。
>>> int('1.9e2')  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1.9e2'
>>> 4+7.4
11.4

#Trueは1または1.0として扱われる
>>> True +2
3 

#Falseは0または0.0として扱われる 
>>> False+3.5
3.5  
```

##2.2.5 intはどれくらい大きい?
64ビットよりも大きな数値を表現できる。（任意のサイズでOK）

##2.2.6 浮動小数点数
整数は小数点数以下がない数値だが、浮動小数点数は小数点以下の値を持つ。

```py
>>> float(True)
1.0
>>> float(False)
0.0
>>> float(45)
45.0
>>> float('45')
45.0
>>> float('98.6')
98.6
>>> float('-1.2')
-1.2
>>> float('2.0e5')
200000.0
```

#2.3 文字列
Pythonの文字列はイミュータブルであり、文字列をその場で書き換えることができない。しかし、文字列の一部を他の文字列にコピーは可能。

##2.3.1 クォートを使った作成
対話型インタープリタは文字列をエコー表示する時にシングルクォートを付けるが、どちらのクォートを使って作ってもPythonは全く同じように扱う。

```py
>>> 'Snap'
'Snap'
>>> 'Crackle'
'Crackle'
>>> "Crackle"
'Crackle'
>>> "'Ue'mura"
"'Ue'mura"
>>> '"Ue"mura'
'"Ue"mura'
>>> ''
''
>>> """"""
''  #空文字列
```

##2.3.2 str()を使った型変換
str()関数を使えば、Pythonの他のデータ型を文字列に変換できる。
Pythonは文字列ではないオブジェクトを引数としてprint()呼び出しが発生した時や文字列の展開を行う時に、内部的にstr()関数を呼び出す。

```py
>>> str(98.6)
'98.6'
>>> str(1.9e4)
'19000.0'
>>> str(True)
'True'
```

##2.3.3 \によるエスケープ
Pythonは文字列に含まれる一部の文字をエスケープして他の方法では表現しにくい効果を実現する。

```py

#\nは改行の意味
>>> palindorome = "A man,\nA plan,\nA canal:\nPanama" 
>>> print(palindorome)
A man,
A plan,
A canal:
Panama

#\tはテキストの位置を揃えるために使われる
>>> print('\tabc')  
	abc
>>> print('a\tbc')
a	bc
>>> print('abc\t')
abc

#文字列内でクォートを使いたい場合には、それらの前に\を入力する。
>>> testimony = "\"I did nothing! \""  
>>> print(testimony)
"I did nothing! "
>>> testimony = "I did nothing! \\"
>>> print(testimony)
I did nothing! \
```

##2.3.4 +による連結
以下のように+演算子を使えばリテラル文字列、文字列変数を連結できる。

```py
>>> 'a' + "a"
'aa'
#リテラル文字列の場合は順に並べるだけでも連結できる
>>> 'a'  "a"  
'aa'
>>> a="Duck."
>>> b=a
>>> c="Great Duck."

#スペースがない
>>> a+b+c
'Duck.Duck.Great Duck.'  

#スペースが自動で入る
>>> print(a,b,c)
Duck. Duck. Great Duck.  
```

##2.3.5 *による繰り返し
*演算子を使うと文字列を繰り返すことができる。

```py
>>> start ="Na" * 4 + "\n"
>>> start 
'NaNaNaNa\n'
>>> middle="Hey" * 3 + "\n"
>>> middle
'HeyHeyHey\n'
>>> end = "goobye."
>>> print(start + start + middle + end)
NaNaNaNa
NaNaNaNa
HeyHeyHey
goobye.
```

##2.3.6 []による文字の抽出
文字列の中の一つの文字を取り出したい時には、文字列名の後ろに角かっこ([])で囲んだ文字のオフセットを続ける。
オフセットの数え方は
先頭（最も左）のオフセットは0、その右が1....
末尾の文字の（最も右）オフセットは-1、その左が-2....

```py
>>> letters = 'abcdefghijklmnopqrstuvwxyz'
>>> letters[0]
'a'
>>> letters[-1]
'z'
>>> letters[-2]
'y'
>>> letters[25]
'z'
>>> letters[4555]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
```

IndexError: string index out of range  #文字列の長さ以上のオフセットを指定するとエラーが発生する。（オフセットは[「0」から「長さ-1」までの範囲になることを忘れないように。）

```py

#文字列はイミュータブルなので文字列に直接文字を挿入したり、指定したインデックスの位置の文字を書き換えたりできない。
>>> name="Henny"
>>> name[0]=P  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'P' is not defined
>>> name[0]='P'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

#文字列関数replace()やスライスの組み合わせを使う必要がある。
>>> name.replace('H','P') 
'Penny'
>>> 'P'+name[1:]
'Penny'
```

#感想
この章もC言語で学習したことがある部分が大半だった。
明日も頑張ろう。

######参考文献
「Bill Lubanovic著 『入門 Python3』(オライリージャパン発行)」