Python変数と組込型

## 数値を使う

数値は、プログラムのなかで数量を記録するために利用します。

Pythonにかぎらず、プログラムではたくさんの数値を活用し、処理を行います。

Pythonでは、数値を扱うためのデータ型として、**整数型**と**浮動小数点型**が別に用意されています。



- 整数型

小数点以下の値を含まない、「100」のような数値を扱うために利用します。

- 浮動小数点型

小数点以下の値を含む、「3.14」のような数値を扱うために利用します。



Pythonには、実はもう1つ、**複素数型**という数値型がありますが、特に必要なし



### 数値を使った四則演算

「+」「-」「*(×)」「/(÷)」といった**演算子**を使った四則演算が可能です。

三角関数などを使った、より高度な演算も可能です。



```python
>>> 1867 - 1603
264
```

引き算例



累乗を計算するためには「**」を使います。ここでは、2を20乗してみます



```python
>>> 2 ** 20
1048576
```

累乗の例



Pythonでは、次のような演算子を使って数値の計算ができます。

このような計算を行うための演算子を**算術演算子**と呼びます。



「+」・・・足し算をする

「-」・・・引き算をする

「*」・・・掛け算をする

「/」・・・割り算をする(//を使うと小数点以下切り捨ての割り算)

「%」・・・割り算のあまりを求める

「**」・・・累乗を計算する



### 四則演算と優先順位

Pythonでは、足し算や掛け算がまじった式では、掛け算や割り算を先に計算します。

例えば、「2と3を足した結果に5をかける」という計算



```python
>>>  2 + 3 * 5
17
```

**計算の優先順位1**



5×5は25になるはずですが、期待どおりの計算結果が表示されません。掛け算や割り算を先に計算するからです。

期待通りの計算結果を得るために、丸括弧()をつかって優先順位を明確にします。

```python
>>> (2 + 3) * 5 #2+3をｓ先に計算、その結果に5をかける
25
```

**計算の優先順位2**



### 変数を使った演算と複合演算子

コードのなかに数値をそのまま書くとリテラルとして扱われることはすでに書きました。

リテラルや計算結果は、イコールの右側において変数に代入することができます。



```python
>>> length = 10 #サッカー場の長さ
>>> length * 0.9144 #メートルに変換
100.584
```

**変数を計算に使う**



このコードでは、1行目で変数への代入を行っている。

2行目で、変数を使って計算しています。計算すると**結果**が返ってきます。



```python
>>> a = 1 #変数aに1を代入
>>> a = a + 1 #変数aに1を足す
>>> a #aの内容を表示
2
```

**変数の数値を増やす**



aという変数に1を足たいだけなのに a = a + 1と書くのは面倒なので、そんなときは「+=」という演算子を利用すると便利です。



```pytyon
>>> a = 1 #変数aに1を代入
>>> a += 1 #変数aに1を足す
>>> a #aの内容を表示
```

**複合演算子の利用**



Pythonでは「+=」のほかに「-=」や「*=」「/=」という演算子も利用できます。

このような演算子は、計算と代入を行うので**複合演算子**と呼ばれている。



### 数値演算を使ったプログラム



```python
from turtle import *

degree = 1     #角度の初期値
distance = 50  #距離の初期値

for i in range(40):  #40回繰り返す
    forward(distance) #distance分進む
    right(degree)    #degree分右に曲がる
    degree += 2     #角度を2足す
    distance -= 1   #距離から1を引く
input()
```

**turtle2.py**



## 文字列を使う



Pythonで文字や文章を扱いたいときには**文字列**を使います。プログラムで扱う文字列には「abc」や「あいうえお」のような短いものもあれば、小説みたいな長い文章もあります。インターネットで使われているRSS,やjson、xmlやhtml、メールのようなデータも文字列として扱われています。



Pythonにでは、文字列を順番に並べて文字列として扱えます。

文字列の中の文字には「0」から始まる番号(**インデックス**)が振られます。このインデックスを指定することで、文字列のなかの特定の文字を取り出すことができます。

複数の要素を持っていて、インデックスで要素を指定できる種類のデータ型を、Pythonで**シーケンス型**と分類しています。

文字列もシーケンス型の仲間です。シーケンス型の仲間には、**リスト型**などがあります。



プログラムの中には、「文字列のなかから特定の文字列を検索する」「文字列を分類する」といった処理をよく実行しています。

Pythonの文字列はオブジェクトです。



### 文字列を定義する



インタラクティブシェルを使って、文字列を変数に代入



```python
>>> a = "Spam! Lovely spam!" #変数に文字列を代入
>>> a #変数の内容を表示
"Spam! Lovely spam!"
```

**変数に文字列を代入する**



**ダブルクオテーション**で囲まれた部分が、文字列データを定義している。

一方、イコール(=)の左側にあるむきだし、で書かれた英字をPythonでは**変数**として扱います。

Pythonでは代入すると変数を定義しますので、１行目では「a」という名前の変数を自動で用意します。

その後、イコールの右側にある文字列を変数に代入しています。２行目では、変数名だけを入力して、変数の内容を表示しています。



### 文字列リテラルの定義方法



文字のなかにダブルクオテーションが含まれる場合は、どのように文字列リテラルを書けばいいでしょうか。そのままリテラルを書いてしまうと、文字列の定義のなかにダブルクオーテーションがあるので、クオテーションの対応が取れなくなりエラーとなります。



```python
>>> s = "What do you mean "Urrgghh"?"

SytaxError: indvaid sytax
```

**ダブルクオテーションを内包する文字列リテラル**



よく見ると、1行目の**mean**の後に2番めのダブルクオテーションがあります。

Pythonは、ここで**文字列リテラルが終わった**と判断します。リテラルの文字列のあとに文字が続いているため、エラーを起こしています。

こんなときに、ダブルクオテーションのかわりに、**シングルクオテーション**('記号)を使います。

この場合、Pythonは「'」と「'」の間を文字列として扱おうとするので、リテラルにダブルクオテーションをおいてもエラーになりません。

```python
>>> s = 'What do you mean "Urgghh"?'
>>> s
'What do you mean "Urgghh"?'
```

**シングルクオテーションを使う**



クオテーションの書き方についてはもう1つ。

文字列を定義するときに、ダブルクオーテーションまたは、シングルクオテーションを3つ重ねて書く。

この場合、3重クオテーションに囲まれた部分の改行は、そのまま変数に格納されます。改行を含んだ文字列や、長い文字列を定義したい場合に便利です。

```python
>>> htmlbody = """<body>
...<h2>Page Title</h2>
...<p>
...Page body.
...</p>
...</body>
..."""
```

**「"""」による文字列リテラルの定義**



試しに、変数htmlbodyに格納された文字列を表示してみましょう。

さきほどのコードに続けて、以下のコードを他インタラクティブシェルに入力、実行してみてください。



```python
>>> print(htmlbody)
<body>
<h2>Page Title</h2>
<p>
Page body.
</p>
</body>
```

**文字列を表示する**



改行がそのまま表示されることがわかります。



### 文字列の連結と繰り返し

文字列と文字列で足し算を行うと、**複数の文字列をつなげる**ことができます。変数似文字列を代入して試してみましょう。



```python
>>> nstr = "1234" #数字だけの文字列を定義
>>> result = nstr + "5678" #文字列同士の足し算
>>> result #結果を表示
'12345678'
```

**文字列の足し算**



文字列の中身が数字であっても、**順番に並んだ文字**として処理し、文字列同士をつなげます。数値の足し算にならないことに注意

文字列と数値を組み合わせて掛け算を行うと、**文字列の繰り返し**になります。

掛け算を行う演算子(*)の後ろに、繰り返す回数を数字で指定します。

しきり線のような文字列を表示したいときに使うと便利です。



```python
>>> linestr = "-" * 20 #”*”を20個を繰り返した文字列を代入
>>> linestr
'--------------------'
```

**文字列の掛け算**



### 文字列と数値の型変換

数字列と数値の足し算をしようとするとどうなるでしょうか。

Pythonでは「文字列と数値は連結(concatenate)できない」というエラーになります。

```python
>>> nstr = "1234" #数字だけの文字列を定義
>>> nstr + "5678" #文字列と数値を足し算

TypeError: cannot concatenate ....
```

**文字列と数値の足し算**



異なる型ののオブジェクトを足し算するときには、Pythonではオブジェクトの型を揃えるようにします。

数値同士の足し算であれば、加算をしたいのだ！ということが明確になります。

文字列同士の足し算であれば、加算をしたいのだということが明確になります。

Pythonでは型を揃えるには、**組み込み関数**を使います。

ここで言う「組み込み」というのは「特別な宣言の必要がなく、いつでも利用できる」という意味です。



#### 文字列を数値に変換する

文字列の数値に変換するためには、**int()**という組み込み関数を使います。丸括弧のなかに、数字だけで構成された文字列を引数として与えると、数値に変換した結果がかえってきます。

**型キャスト**という言葉になります。

```python
int(文字列)
```



数字だけで構成された文字列として数値の足し算をしたい場合は、int()関数を使って文字列を数値(整数)に変換して足し算をします。

文字列を数値に変換して足し算をするので、数値同士の足し算をすることになります。



```python
>>> nstr = "1234"
>>> int(nstr) + 5678 #文字列を数値(変数)に変換
6912
```

**int()関数の利用例**



int()関数を使うときに気をつけるこおｔがあります。

int()は、小数点のついた文字列を変換できません。

小数点の付いた文字列を数値(浮動小数点型の数値)に変換するためには、**float()**という別の組み込み関数を利用します。



```python
float(文字列)
```



#### 数値を文字列に変換する



数値を文字列に変換するときには、**str()**という組み込み関数を使います。



```python
str(数値)
```

次の例では、今度は数値を文字列に変換したので、文字列同士の連結をすることになります。



```python
>>> nstr = "1234"
>>> nstr + str(5678) #数値を文字列に変換
’12345678'
```

**str()関数の利用例**



### 文字列の長さを調べる



Pythonで文字列の長さを調べるためにには、**len()**という組み込み関数を使います。

丸括弧のなかに、引数として文字列を渡して呼び出すと、文字列の長さを返します。



```python
len(文字列)
```



文字列の長さを調べてみましょう。結果として、文字列の長さが数値になって返ってきます。

日本語を引数として渡した場合も、日本語の長さが返ってきます。



```python
>>> word =  "abcdefg" #英語で「無価値」とみなすこと
>>> len(word)
9
>>> len("あいうえお")
5
```

**len()関数の使用例**



len()関数は、文字列だけでなく、リストやタプルなど、複数の要素を持つオブジェクトの要素変数を調べるためにも利用できます。



### 文字列の置き換えや検索を行う



プログラムでは、文字列のなかに特定の文字が含まれているかどうかを調べる**検索**や、文字列や置き換える**置き換え**といった処理をよく使います。

文字列を操作するときによく実行する処理は、文字列オブジェクトにあらかじめ用意されているメソッドや演算子を使うと便利です。



#### 演算子を使った処理

Pythonで文字列の検索を行うにはどうすればよいでしょうか。

例えば「大阪市北区梅田」のなかに「北」という文字が含まれているか調べたいときき、**in演算子**を使います



```python
address = "大阪市北区梅田" #大阪の住所を代入
"北" in address #文字列に「北」があるかどうかを調べます
"町" in address #文字列に「町」があるかどうかを調べます
```



address という変数に文字列を代入し、そのなかに特定の文字が含まれているかどうかを調べてみました。2行目では、in演算子を使っています。

in演算子を真ん中にはさんで、検索したい文字列を左側に、検索対象となる文字列を右に書きます。

```python
検索したい文字列 in 検索対象の文字列
```



最初の例では文字列が見つかったので「true」という結果が返ってきます。

2番目では文字列が見つからなかったので「false」という結果が返ってきます。



#### メソッドを使った処理



Pythonの文字列はオブジェクトですので、文字列のメソッドを使うにはオブジェクトのメソッドを呼び出す方法を従います。

文字列に続けてドット(.)を書き、その後にメソッドを付けてメソッドを呼び出します。

ドット(.)の前は、文字列の入った変数でもいいですし、リテラルでもかまいません。



文字列を置き換えをしたいときいは、**replace()**を使います。

```
文字列.replace(検索文字列,置き換え文字列)
```



```
address = "大阪市北区梅田"
address.replace("梅田","天満")
```

**replace()メソッドを使った置き換え**



replace()メソッドには2つの引数を文字列で渡します。

「置き換えたい文字列(検索文字列)」と「置き換える文字列(置き換え文字列)」の2種類の情報を、カンマ(,)で区切って引数として渡します。



ここで、気をつけてもらいたいものが、置き換えを行うためのreplace()メソッドを呼び出しても、元の変数は変わらない。



文字列を利用する場合、replace()メソッドのようにデータ変更をともなう捜査の結果は、元の文字列を書き換えません。置き換えた結果は**別の文字列オブジェクト**として返ってきます。



置き換えた結果を後で利用するためには、変数に代入するなどをして保存しておきます。



```
address = "大阪市北区梅田"
address = addrss.replace("梅田","天満")
address

```

**replace()メソッドの戻り値を変数に代入する**



### インデックスを利用して要素を取り出す



Python文字列オブジェクトでは、文字を順番に並べてデータを格納しています。

**インデックス**と呼ばれる通し番号を使えば、順番に並んだ文字の一部を取り出すことができます。

インデックスの先頭の文字の番号は「0」になります。



文字列オブジェクトから1文字だけ取り出すにはカッコ([])のなかに数値を入れてしています。



```
digits ="1234"
digits[2]
```

**文字列のインデックスを使う**



1文字の文字列を文字コード(キャラクタコード)相当の数値に変換したい場合は組み込み関数**ord()**使います。

```
ord(文字列)
```



文字コード(数値)から1文字の文字列を得たい場合は、組み込み関数**chr()**を使います。

```
chr(数値)
```

```pyhon
digits = "1234"
ord(digits[2]) #変数の3文字目を文字コードに変換
chr(52) #文字コード52を文字列に変換

```

**ord()関数とchr()関数**



## リストを使う



Pythonの**リスト型**というデータ型を使うと便利です。

リスト型のオブジェクトには、数値や文字列などに順序を付けて入れておくことができます。

Pythonのリストには**どんなオブジェクトも入れることができます**。

数値、文字列はもちろん、**リストそのもの**を要素として入れることができます。

## 変数



プログラムでは、利用するデータを一時的に保管するために**変数**という入れ物を使います。

プログラムを実行する手順は複雑です。プログラムのなかでは、一時的にデータを保存したり、データを加工するために、たくさんの変数を利用します。



プログラムで利用するデータをPythonでは**オブジェクト**と呼びます。

Pythonには、数値や文字列をはじめとして、いろいろな種類のオブジェクトがあります。

Pythonの変数には、どんな種類のオブジェクトでも入れることができます。



### 変数を作る



Pythonでは、変数に「名前」を付けます。

変数に付けた名前のことを**変数名**と呼びます。品物を分類するために、入れ物に名前を書き込んだタグを付けるようなものだと思ってください。



```python
#変数aを作り、変数の1を代入する
a = 1
#変数aの内容を確認する
a
```



1行目で変数に「a」という名前を付けて、新しい変数を作っていきます。

変数の右にはイコール(=)を書いて「1」という数値を変数に入れています。

このようにイコールを使って変数に数値のようなオブジェクトを入れること**代入**といいます。



2行目では、定義した変数だけを打ち込んで改行しました。直後の3行目では、Pythonが変数の内容を表示しています。



### 変数を使って計算する



変数にイコール(=)を使って代入しました。イコールの右側は数値のようなリテラルである必要はありません。変数や、変数を使った計算式を代入することもできます。



イコールの右側に、「a」という変数を使った足し算を入力してみます。

変数aに入っている数値を使って計算を行うというわけです。

```python
a = 1
a = a + 1 #変数aに1を足す
a #変数aの中身を確認する

a = a + 1
a = a + 1
a #変数aの中身を確認する

```

**変数による計算①**



変数aには「1」が代入されていますので、2行目は、変数aに、「変数a(中身は1)に1を足した数値」を代入するという意味になります。

同じことを繰り返すと、変数に入っている数値も変化します。変化のなかには入っているオブジェクトの中身を見ながら、計算処理を行っていることがわかります。



アポロ計画で使われたサターンロケットの最高速度を音速に変換してみます。



```python
mach = 1225 #音速(km/h)
topspeed = 40000 #サターンVの最高速度
topspeed / mach #音速に換算
```

**変数による計算②**



### 変数に文字列を入れる



同じ変数に別の種類のデータを入れてみる。

先ほどの数値を入れていた変数に、今度は「abc」という文字列オブジェクトを代入する。



```
a = "abc" #変数aに文字列"abc"を代入する

```

**文字列代入**



数値が入っていたaという変数ですが、今度は中身が文字列に入れ替わりました。変数に入っているオブジェクトの種類が変わったわけですが、エラーも起こさず、中身を入れ替えることができたようです。

この例がわかるとおり、pythonは変数に入れるオブジェクトの種類を自由に入れ替えることができます。

数値や文字列だけでなく、Pythonには多くの種類のオブジェクトがあります。



### 変数名の付け方



Python3では、変数名に日本語を含むいろいろな文字が使えるようになりました。



```python
ねこ = "にゃー"
いぬ = "わん"
print(いぬ,ねこ)
```

**日本語の変数名を使う**



ただし、特別な理由がないかぎり、変数名には英字と数字だけを使いましょう。

Pythonでは、変数名として利用すべき文字に簡単な決まりがあります。



#### アルファベット、数字、アンダースコア(下線)を組み合わせて変数を作る

基本アルファベットから始まる名前を使いましょう。空白(スペース)やドット(.)、カンマ(,)のような記号は変数名としては利用できません。単語を区切りたいときには「firstName」のように大文字を使うか、「first_name」のようなにアンダースコア(_)を使います。



#### はじめの1文字はアルファベット、またはアンダースコア

変数名を数字で始めることはできません。数字から始めると、数字そのものと区別がつきにくいためです。



#### アルファベットの大文字と小文字を区別する

「python」と「Python」は区別されて、別の名前とみなされます。



#### 約30個ほど、利用できない名前がある

「予約語」と呼ばれる英単語は利用できません。

例えば、「and」「not」のような単語は利用できないようになっています。