福岡県だけどPythonを勉強する!

他言語を積極的に推奨する福岡県でPythonを勉強していく記録。

型とリテラル その1

今回はmathモジュールなど、

数学的な内容を学習しました。

 

高校の頃から数学が嫌いなのでかなり辛かったです。

対数虚数微分積分・etc…。

ググれなければ詰んでました。

ネットに感謝です。

 

ただ、Decimalクラスとceil floor以外は一生使わないような気が。。。

 

以下、今回の備忘録です。

 

パーフェクトPython

言語仕様

●3章 型とリテラル

 

■オブジェクトについて

オブジェクトとは

・データ

・データを操作する抽象的な塊。

 

全てのオブジェクトは生成されてから廃棄されるまでIDという

オブジェクトを識別する情報を持っている。

 

ID = オブジェクトの格納されるメモリの場所

 

プログラムはオブジェクトのリファレンスから

オブジェクトを操作する。

 

リファレンスは変数やリテラルで表す。

 

リテラル = 文字列・数値などの「データそのもの」を指す。

 

Pythonのリファレンスには予め「型」を指定する必要がない。

Pythonではメモリの解放について考えなくてもいい。

 

■論理型

論理型 = bool

 

boolは論理値を持つ。

論理値は「and・or・not」というキーワードと共に利用し、

それらのキーワードは論理値を変更出来る。

 

イマイチわかりにくかったので調べてみたら

・論理型 = bool型

・論理値 = bool値 = 真偽値

 

要は論理値ってTrueとFalseのことらしい。

 

「真偽値(True/False)を持つ型を論理型(bool型)と呼ぶ」

 

間違ってたら誰かコメントでツッコんで下さい。

 

■数値型

int・float・complexの3つ。

※2系のlongは廃止。

 

x+y    # 和

x-y    # 差

x*y    # 積

x/y    # 商

x//y    # 商、小数点以下切り捨て

-x    # 符号反転

+x    # 符号そのまま

abs(x)    # 絶対値

int(x)    # 整数への変換

float(x)    # 浮動小数点数への変換

complex(re, im) # 実数部re、虚数部imの複素数。imのデフォはゼロ。

c.conjugate()    # 複素数cの共役複素数(実数部に依存)

pow(x, y)    # xのy乗

x**y    # xのy乗

 

 

■int型(整数型)

 

>>>posnum = 12

>>>negnum = -posnum

-12

>>>-negnum 

12

 

intでn進数を表すには

16進数    数字の前に0xを付加

8進数    数字の前に0oを付加

2進数    数字の前に0bを付加

 

>>>0x11

17

(16進数の11は10進数の17)

 

>>>0c12

10

(8進数の12は10進数の10)

 

>>>0b1010

10

(2進数1010のは10進数の10)

 

 

intでn進数に変換する

16進数    hex(x)

8進数    oct(x)

2進数    bin(x)

 

>>>hex(17)

'0x11'

>>>oct(10)

'0o12'

>>>bin(10)

'0b1010'

 

 

int()は整数を生成する。

引数をを渡さない場合はゼロを生成する。

整数に変換出来ない場合はValueErrerを送出する。

 

>>>int()

0

>>>int('5')    # strから変換

5

>>>int('a')    # 'a'は整数に変換出来ないのでエラー

エラー

 

ついでに

>>>int('5.5')    # 本当に整数じゃないと駄目らしい。

エラー

 

int関数は基数(n進数)を指定出来る。

基数は2から36まで指定出来る。

 

>>>int('a' 16)

10

 

 

2系は整数の割り算は整数(切り捨て)になる。

3系は必要に応じて浮動少数点数になる。

 

>>>3 / 2

1.5

 

 

■float型(浮動小数点数型)

浮動小数点数を使った場合の計算がおかしくなるのは

コンピュータが2進数(バイナリ)で保存している為。

 

>>>0.1 + 0.1 + 0.1 == 0.3 

False

 

例)

0.1を2進数で表現すると

0.000110011001100110011....

という循環2進数になる。

 

これはRubyJavaでも同じ。

 

 

■complex(複素数型)

 

複素数とは

複素数(ふくそすう、complex number)は、

実数 a, b と虚数単位 i を用いて

a + bi

と表せる数のことである。

 

虚数単位(i) = 2乗すると「-1」になる数(√-1)。

 

複素数 z = a + bi に対して、

a を z の実部(じつぶ、real part)、

b を z の虚部(きょぶ、imaginary part)といい、

それぞれ記号で Re, Imと表す。

 

 

複素数は実数部と虚数部を用いて生成する。

直に記述する方法と、complex関数を使用する方法がある。

(※iは電流のiと混同しないためにjが使われる)

 

>>>1 + 5j

(1+5j)

 

>>>complex(1.3, 0.5)

(1.3+0.5j)

 

四則演算も出来る。

>>>(1 + 5j) + (2 + 1j)

(3 + 6j)

>>>(1+5j) / 2

(0.5+2.5j)

 

 

■mathモジュール

intとfloatの数学関数計算にはmathモジュールを使う。

mathモジュールはC言語の数学関数へのアクセスを提供。

 

>>> import math

>>> math.pi

3.141592653589793

>>> math.e

2.718281828459045

>>> math.cos(math.pi)

-1.0

>>> math.log(math.e)

1.0

 

以下は近似値

>>> math.sin(0)

0.0

>>> math.sin(math.pi)

1.2246467991473532e-16

>>> math.tan(math.pi)

-1.2246467991473532e-16

 

 

mathモジュールのよく使う関数

 

math.ceil(x)

X以上の最小の整数を返す。

浮動小数点数じゃない場合は整数(Integral値)を返す。

>>> math.ceil(4.5)

5

>>> math.ceil(4)

4

 

math.floor(x)

X以下の最小の整数を返す。

浮動小数点数じゃない場合は整数(Integral値)を返す。

>>> math.floor(4.5)

4

>>> math.floor(4)

4

 

math.factorial(x)

xの階乗

 

※階乗

6の階乗 6×5×4×3×2×1 = 720

 

 

math.exp(x)

e**xを返す。

math.(1) = e

eは2.718281828459045 #近似値

 

math.exp(3)の場合、

2.718281828459045 × 2.718281828459045 × 2.718281828459045

と考えればいい。

 

 

math.log(x,[base])

baseを底としたxの対数を返す。

実際には「[]」を入力しない。

baseを省略すると底がeになる。

 

対数とは

http://oto-suu.seesaa.net/article/167913379.html

対数とはどんな数字か?

http://www.minemura.org/juken/taisu.html

「xはαをyにする指数」

αを底、yを真数と呼ぶ。

 

例)

「xは2を8にする指数」

>>> math.log(8,2)

3.0

xは3

 

>>> math.log(8)

2.0794415416798357

 

 

math.sqrt(x)

xの平方根(square root)を返す。

>>> math.sqrt(9)

3.0

 

 

math.cos(x)

xの余弦を返す。

 

math.sin(x)

xの正弦を返す。

 

math.tan(x)

xの正接を返す。

 

 

■cmathモジュール

省略

 

■numbersモジュール

 

rational number 有理数

有理数・・・「整数」or「有限の小数」or「無限に続くが数が循環している小数」

 

isinstance(x, numbers.Number)

種類は何であれ、数であるということだけチェックが出来る。

 

整数かどうかのチェックにはIntegral

>>> obj = 0.2

>>> isinstance(obj, numbers.Integral)

False

 

実数にはReal

複素数にはComplex

有理数にはRational

 

>>> import numbers

>>> obj = 1

>>> isinstance(obj, numbers.Number)

True

>>> isinstance(obj, numbers.Real)

True

>>> isinstance(obj, numbers.Complex)

True

>>> isinstance(obj, numbers.Rational)

True

 

複素数の場合は有理数や実数として扱えないので以下のようになる。

>>> obj = complex(1, 1)

>>> obj

(1+1j)

>>> isinstance(obj, numbers.Complex)

True

>>> isinstance(obj, numbers.Rational)

False

>>> isinstance(obj, numbers.Real)

False

 

 

■fractionsモジュール

fraction・・・分数、端数の意。

 

fractionモジュールはFractionという有理数を表現するクラスを提供する。

Fractionクラスは自動的に有理数を約分する。

 

>>> from fractions import Fraction

>>> Fraction(-8, 5)

Fraction(-8, 5)

>>> Fraction('3/7')

Fraction(3, 7)

>>> Fraction(16, -10) + Fraction(4, 20)

Fraction(-7, 5)

Fraction(-7, 5)

>>> Fraction(1, 3) ** 2

Fraction(1, 9)

 

 

fractionsモジュールは最大公約数を計算するgcd関数を提供する。

gcdは整数や有理数が使える。

 

gcd(Greatest Common Divisor)

=最大公約数 

 

>>> from fractions import gcd

>>> gcd(Fraction(1,9), Fraction(1,6))

Fraction(1, 18)

>>> gcd(64,24)

8

 

■decimalモジュール

人間と同じような現実世界の数値の使い方を実現するモジュール。

10進数の浮動小数点数にも対応。

会計・帳簿などの金銭を扱うアプリケーションに利用する。

 

floatの0.1とDecimalの0.1は別物。

 

>>> from decimal import Decimal

>>> 0.1 == Decimal("0.1")

False

 

浮動小数点数の計算にはズレがあるので以下のようになる。

>>> 0.1+0.1+0.1

0.30000000000000004

>>> 0.1+0.1+0.1 == 0.3

False

 

Decimalを使えば以下のように厳密に浮動小数点数を計算・比較出来る。

>>> from decimal import Decimal

>>> Decimal("0.1") + Decimal("0.1") + Decimal("0.1")

Decimal('0.3')

>>> Decimal("0.1") + Decimal("0.1") + Decimal("0.1") == Decimal("0.3")

True

 

有効桁数

・加算・・・そのまま

・乗算・・・増える

 

>>> Decimal("1.50") + Decimal("2.50")

Decimal('4.00')

>>> Decimal("1.50") * Decimal("2.50")

Decimal('3.7500')

 

 

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)