Python3入門学習　1回目

さて、前稿に引き続きPython3の簡単な実装を見ていくことにする。
今回主に扱うのは数字や文字列の取り扱い、変数の仕組みについてで、他の言語を一度学んだ人にとって難しいことは何も出てこない。
よって、主に自分が扱っている言語との違いを簡単に見ていけばよい。
プログラミング言語が初めてだという人は、変数の扱いが非常に躓きやすい場所であるので十分に気をつけるように(この記事だけで理解しようとしてはいけない。わからなければ他に山ほどある解説資料を参照するなり、実際に試してみるなりすべきである)。

# 数値、文字列、変数
## オブジェクトと型
数値や文字列を扱うと言いながら、まずはオブジェクトと型について学んでいく。
Pythonではあらゆるデータはオブジェクトとして実装されている。オブジェクトは箱のようなもので、型に応じてどのような値が入るかが変わる。例を挙げると、

- ブール値
    - True (※整数としては1の値を持つ)
    - Flase (※整数としては0の値を持つ)
- 整数(単にintとも)
    - 0,1,2,3……
    - -1,-2,-3……
- 浮動小数点
    - 3.14159265……
    - 10e8 (=100000000.0)
- 文字列
    - 'text'
    - "text data"
    
などである。それぞれ「●」が型を、「○」が値を意味する。

### 型の確認
オブジェクトの型はtypeを使用する

```
>>> type(1)
<class 'int'>
```

## 変数
実際にオブジェクトを作ってみよう。手っ取り早いのは変数を作って値を代入してしまうことだ。値が代入された変数は、printコマンドで中身を確認することができる。

```
>>> a = 7
>>> print(a)
```

結果として7がエコーされているはずです。
同じように文字列変数も作ってみましょう。sampに代入した文字列が表示されるはずだ。

```
>>> samp='This is sample text.'
>>> print(samp)
```

さらっと飛ばしてしまったが、=の記号は左辺の変数に右辺の値を代入するための記号だ。上記の例でいえば変数aというオブジェクトの中に7という値を代入しているということだ。
変数の名前は英数字と/_(アンダースコア)を使用して任意につけることができる。ただし「先頭が数字の変数名は使用できない」「先頭が_の変数名は特別な意味を持つ」ので、注意する必要がある。

## 数値
オブジェクトと型で見てきたように、数値には整数と浮動小数点の2つがある。ここでは単に小数点以下があるか否かの違いであると考えればいい。
整数・負数・0のいずれも表現できる。また、いずれも整数である以上加減乗除が可能だ。

**加法**

```
>>> 1+2
3
>>> 1.0+2.5
3.5
```

**減法**

```
>>> 3-1
2
>>> 6.0-1.0
5.0
```

**乗法**

```
>>> 4*2
8
>>> 1.5*2
3.0
```

**除法**
除法は他の計算と異なり、2種類の計算がある。
一つは結果を浮動小数点で算出するもので、"/"を使用する。
もう一つは結果を整数で算出するもので、"//"を使用する。剰余を求める場合には%を使用する。

```
>>> 6/2
3.0
>>> 6//2
3
>>> 9/2
4.5
>>> 9//2
4
>>> 9%2
1
```

ちなみに商と剰余を同時に求めるにはdivmodを使用する。

```
>>> divmod(9,2)
(4, 1)
```

この結果は上述したいずれの型でもないが、次回以降に紹介するのでここではひとまずそういうものだと思っておいてほしい。

四則演算の優先順位は数学の授業で習った通り、乗除が加減に優先する。

### intの大きさ
これは扱いづらいCからやってきた筆者には驚きなのだが、Pythonでは整数オーバーフローが発生しないらしい。累乗の"**"を使用してみるとすぐに確かめられる。

```
>>> googol=10**100
>>> print(googol)
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>> googol*googol
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
```

## 文字列
文字列を扱うには''(シングルクォート)もしくは""(ダブルクォート)を使用する。

```
>>> 'Where is my pudding!?'
'Where is my pudding!?'
>>> "Sorry, I ate it."
'Sorry, I ate it.'
```

改行を入れることも可能で、その場合は'''(トリプルクォート)で囲む。

```
>>> question = ''' Why did you eat my pudding!?
I wrote my name on the pudding!
I'm angry!'''
>>> print(question)
 Why did you eat my pudding!?
I wrote my name on the pudding!
I'm angry!
```

文字列は+で連結したり、*で繰り返すこともできる。

```
>>> "Sorry, I'm hungry. But it's" + (" very" *4) +" delicious!"
"Sorry, I'm hungry. But it's very very very very delicious!"
```

### 文字列の操作
設定した文字列から文字列を面白おかしく取り出すこともできる。
以下の例は「1文字目から10文字目まで2文字おきに取得」「後方1文字目から-1文字おきに取得」「後方3文字を取得」の例だ。

```
>>> letters = 'abcdefghijklmnopqrstuvwxyz'
>>> letters[1:10:2]
'bdfhj'
>>> letters[-1::-1]
'zyxwvutsrqponmlkjihgfedcba'
>>> letters[-3:]
'xyz'
```

<details><summary>筆者個人の感想</summary><div>
筆者個人の感想になるが、2番目の例でいたく感動した。筆者は以前Cをやっていたのだが、Pythonでは文字のセットから逆順に出すまで2行でいい内容を、Cでは以下のように書かねばならない。

```
const int max=26;
char letters[max+1];
int i;

memset(letters, '\0', sizeof(letters));
strcpy(letters, "abcdefghijklmnopqrstuvwxyz");

for (i=0; i<max; i=i+1) {
    print(letters[max-i]);
}
print(\n);
```

……二度とCに戻りたくなくなるよね……。
</div></details>

また、split関数によって文字列を分割することもできる。関数については後々学ぶ予定なので、とりあえずのところはこういうことができると覚えておけばよい。

```
>>> mathtext = "sin, cos, tan, sec, csc, cot"
>>> mathtext.split(",")
['sin', ' cos', ' tan', ' sec', ' csc', ' cot']
```

### 文字列長の取得
よくある構文だが、文字列の長さはlenを使って取得する

```
>>> len(mathtext)
28
```

# 終わりに
というわけでざっと駆け足で数値と文字列の扱いを見てきたがどうだっただろうか。
1回でやる内容じゃないな。すまんかった。
この辺までは大体どんな言語でも似たような実装があるので、一つでもやったことがあれば何となく雰囲気で書けるんじゃないかと思う。
次回はリストの話をするか、Pythonのソースコードの話をすると思う。

今回も記事を書くにあたってはオライリー・ジャパンより出版されている『入門　Python3』を参考にした。