メモ (データと関数)~python~
ソフトウェアは、データと関数によって構成されている。
データとは
コンピューターの世界では、コンピューターの中で処理、保存される、特別な順序の数字や記号のことをデータと呼ぶ。
全てのデータは2進数によって構成される、最も基本的な数字の並びに基づいている。
コンピューターサイエンスにおけるデータ型(data type)は以下のような種類がある。
- 整数型
- 浮動小数点型
- 文字型
- 文字列型
- ブーリアン型
「データ型が異なる」と、「コンピューターでのデータの扱いが異なる」。
ブーリアン型
0,1の2通りで表せるデータ
- 真(=true)を1
- 偽(=false)を0
として、真偽値をデータに表現することができる。
このようにtrue,falseの2値をとるデータ型をブーリアン型(boolean data type)と呼ぶ。
print(True)
→ True
type() を使ってデータ型を調べることができる
print(type(True))
→<class 'bool'>
料金が(支払われた / 支払われていない)
クレジットカードが(有効 / 無効)
画面サイズが 800px (より大きい / 以下)
ユーザーが(有料ユーザー / 無料ユーザー)
ユーザーがアンケートに(回答した / 未回答)
などに使われる
整数型
2進数
表現できるデータの最小単位をbitと言う。
1bit
0,1
2bit
00, 01, 10, 11
3bit
000, 001, 010, 011, 100, 101, 110, 111
このように、bitが増えると2^n通りの組み合わせができる。
8bitのことを、byteと言う。
1バイトは2^8=256通りの0,1の表現ができる。
2つの数値だけで表す表現を2進数(binary number)と言う。
2進数と10進数を相互に変換することによって、コンピュータで整数を取り扱えるようになる。
2進数と10進数の計算
例 1101
-
2進数を10進数に変換
1 1 0 1
× × × ×
2^3 2^2 2^1 2^0
= = = =
8 + 4 + 0 + 1 = 13 -
10進数を2進数に変換
13 ÷ 2 = 6 ... 1 ↑
6 ÷ 2 = 3 ... 0 ↑
3 ÷ 2 = 1 ... 1 ↑
1 ÷ 2 = 0 ... 1 ↑
1101
整数型(integer type)はint型と表記される。
print(10)
→ 10
print(type(10))
→ <class 'int'>
2進数を10進数で表すには、先頭に0bをつける
print(0b1111)
→ 15
print(0b11)
→ 3
一般的に、整数型は4バイト、つまり32ビットの長さがある。
32ビットは、4,294,967,296(=2^32)漏洩の二進数の表現が可能。
正の数だけであれば、0~4,294,967,296の数値を扱える。
通常整数では負の扱うため、正負のどちらかを識別するために1ビット使用し、-2,147,483,648 ~ 2,147,483,647の数値が扱える。
- int 型(符号付き整数型): -2,147,483,648 ~ 2,147,483,647
- 符号なし整数型 : 0 ~ 4,294,967,295
pythonやRubyはint型の上限が設定されていない。
一方で、javaやphpのような言語には上限がある。
System.out.println(2147483647);
→ 2147483647
System.out.println(2147483648);
→
Main.java:17: error: integer number too large
int型の範囲を超える数を扱うには、言語によっては8バイト、つまり64ビットの長さのデータを扱う。
(long型と呼ぶ)
- 符号つき long 型 : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
- 符号なし long 型 : 0 ~ 18,446,744,073,709,551,615
データの大きさは、int型が4バイト、long型が8バイトなので、int型の倍のメモリを扱う。
そのため、大きな整数を扱わないことがわかっている場合はint型を使用する。
Lを末尾につける。
System.out.println(2147483648L);
→ 2147483648
16進数
コンピューターにとって読みやすいが、人間には読みにくい2進数、
コンピューターは読めないが、人間には読みやすい10進数
双方の可読性を両立させたのが16進数。
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}の16個の記号で数値を示す。
16進数の1桁を、2進数では4桁(4bit)で表す。
10進数と16進数の計算
例 12A
-
16進数を10進数に変換
1 2 A
× × ×
16^2 16^1 16^0
= = =
256 + 32 + 10 = 298 -
10進数を16進数に変換
298 ÷ 16 = 18 ... 10(A) ↑
18 ÷ 16 = 1 ... 2 ↑
1 ÷ 16 = 0 ... 1 ↑
12A
16進数を10進数で表すには、先頭に0xをつける
print(0xB)
→ 11
print(0xFF)
→ 255
2進数と16進数の計算
- 2進数から16進数に変換
例 101111
16進数の1桁を2進数は4桁で表すため、
左の桁から、4桁ずつに分離する。(足りない場合は0をつける)
0010 1111
分離した値から、10進数の値を求める。
基準値は、8,4,2,1(2^3,2^2,2^1,2^0)。
0010 → 8×0 + 4×0 + 2×1 + 1×0 = 2
1111 → 8×1 + 4×1 + 2×1 + 1×1 = 15 = F
2F
データ型と識別子
識別子(identifier)とは、特定の人、場所、もの、または考えを識別するための名前。
単語、数字、文字、記号またはこれらの任意の組み合わせで構成される。
「ID」は「identifier」を指すことがおおい。
*どの集合(データの塊)のデータなのかということを意識することが必要。
ビット列は識別子として使用することができる。
ビット列「01000001」を文字「A」と定義すれば、このビット列はAと言う文字をプログラム中の他の文字と区別するための識別子として使用することができる。
文字型
コンピューターは文字列と同じように二進数に文字を対応させることで、文字を表現する。char型と呼ぶ。
世界的に決められた対応表を文字コード(character encoding)と呼ぶ。
代表的な例として、ASCIIとUnicodeがある。
ASCIIは1963年に西欧圏で使用されることを意図して作られた。
7ビット(2^7=128通り)の文字及び記号のみにしか対応していなかったため、日本語や中国語のような複雑な文字をビットを用いて表すことはできなかった。
Unicodeは世界中のすべての文字を表現できるようにした規格。
一つの文字に対して符号位置(コードポイント)が割り振られている。
現在符号位置は、U+0000~U+10FFFFのような16進数による番号によって表され、単純計算で100万個を超える番号が準備されている。
この符号位置をコンピューターが理解できる2進数にしたのがUTF。
Unicodeは符号化文字集合といい、UTF-8などは文字符号化方式という。
Unicodeにマイナー言語や過去に使われていた言語が追加されていき、表現しきれなくなってきてからUTF-8,UTF-16,UTF-32などの符号化方式が設定された。
文字 | ASCIIコード(10進数) | ASCII文字コード(7bit) | Unicode | UTF-8 文字コード |
---|---|---|---|---|
A | 65 | 1000001 | U+0041 | U+3042 |
あ | - | - | 0x41 | 0xE38182 |
文字コードの違いによる文字化け
日本語に適したShift-JISという文字コードもある。
UTF-8で表現した文字をShidt-JISで表現しようとすると、意図しない文字を出力することがある。
コ:0xE382B3
ン:0xE383B3
ニ:0xE3838B
チ:0xE38381
ハ:0xE3838F
これは、Shift-JISの以下に対応する。
繧:0xFFE382
ウ:0xB3
繝:0xFFE383
ウ:0xB3
繝:0xFFE383
九:0x8BE3
メ:0x8381
繝:0xFFE383
(未使用):0x8F
文字列型
Helloのような特定の文字の並びを文字列型(string data type)と呼ぶ。str型と表記される場合もある。
Discussion