福岡県だけど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)

 

 

言語仕様の勉強を開始

Pythonを勉強する目的はPythonでのweb制作です。

(それが仕事なので…)

 

FlaskというWEBフレームワークを使えるようになるのが目標なのですが、Python関連のフレームワークには日本語の書籍がありません。

(あるけど古過ぎるので無いのと同じ)

 

「言語仕様を覚えた後にwebで使えなかったらどうしよう?」

 

という不安があり、下調べの段階で何度もRubyに浮気しそうになりました。Rubyには日本語のweb関連情報が潤沢に存在します。でもPythonのコード綺麗だし、「Pythonの禅」には共感出来るし、フレームワークやテンプレートエンジンのネーミングが好きだし…などと迷っている時に見つけたツイートがコレです。

PythonでもJavaでもRubyでも良いから、一度ちゃんとマスターするまで使い込もうよ。そうすれば基礎ができるから、あとは何でもできる。お前 らこれ勉強してハズレだったらどうしようとか心配し過ぎなんだよ。基礎はみんな同じなんだからそんな、大ハズレとかないんだよ。

 

思いっきり背中を押されました。

「やろう。とにかく始めてみよう」

これをつぶやいていた方には感謝です。

 

本題に戻ります。

環境構築が終わり、やっとPythonの言語仕様の勉強に入れました。

 

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

 

パーフェクトPython

言語仕様

●2章 Pythonの基本

 

■インデント

Pythonプログラムをコマンドラインから実行

→変数__name__に__main__が設定される。

 

■入出力

ビルトイン関数

→組み込み関数

 

■コメント

コメントは「#」から改行まで。

 

■ドックストリング

"""あいうえお"""

'''あいうえお'''

関数やクラスで最初に書かれた文字列識別子。

定義したテキストは関数やクラスの__doc__に保存される。

help()で確認出来る。

(閉じる時はq)

 

ドットストリングにはインデントは関係ない。

でもインデントは守った方が良さげ。

 

■識別子

識別子 = 名前

大文字・小文字のアルファベット、アンダースコア、数字などが利用可能。

先頭に数字は不可。

 

■変数

アンダースコアで始まる識別子はワイルドカードでのインポートの際に

インポートされない。

 

変数はオブジェクトを割り当てられると名前空間バインディングされる。

バインディング = 束縛

 

spam = 'ham'

 

変数の参照を削除

delキーワードを使う

 

del spam

 

グローバル変数

Pythonにはプログラム全体から使えるグローバル変数は無い。

最大のグローバル変数でもモジュール(ファイル)単位。

関数やクラスの中でglobalというキーワードを使うと

グローバル変数を用いるという指定になる。

 

spam = 'ham'

def egg():

    spam = 'egg'

    print(spam)

 

>>>egg()

egg

>>>spam

'ham'

 

spam = 'ham'

def egg():

    global spam

    spam = 'egg'

    print(spam)

 

>>>egg()

egg

>>>spam

'egg'

 

 

変数をスコープの内側で定義していない場合、

グローバル変数を参照出来る。

 

spam = 'ham'

def egg():

    print(spam)

 

>>>egg()

ham

 

ただし、参照したグローバル変数を操作すると例外が発生する。

(要はglobal宣言をしろということ)

 

・variable = 変数

・assignment = 割り当て

 

■ノンローカル変数

ローカルスコープではない一番近くの変数を利用出来る。

nonlocal count

 

■定数

Pythonに定数はない。

すべて大文字の変数を定義して定数のように利用する場合もある。

そのような変数は書き換えないように注意。

 

予約語

すごく少ないので間違ってこれらを使うことは無いと思う。

 

デバッグ・トレースバック

エラーを遡って表示

下から読んだ方がいい。

 

■メモリ管理

難しいので少し理解出来てからまた読む。

 

 

まだ序盤なので余裕でした。

この調子で最後まで行ければいいなあと…。

 

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

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

 

 

環境構築 virtualenv pyenv pip easy_install

まずは環境を整えようと『パーフェクトPython』の巻末にある「Appendix A 環境構築」を読みながら実践してみる事にしました。

 

挫折しました。

Pythonのインストール自体は簡単だったのですが、

仮想環境のあたりがWindowsで設定するの面倒くさ過ぎです。

 

どう見てもUbuntuで設定した方が楽そうだったので

VirtualboxUbuntuを入れる事にしました。

 

多くの人がUbuntu14.04のリリースを待ちわびている中、

もくもくと13.10をインストールしていました。

インストール後に「Ubuntuの場合」と書かれた箇所を読みながら設定をしてみたのですがvirtualenvだのpyenvだのがなかなか上手くいきません。

 

そこで色々と検索してみるともっと簡単に設定出来そうな方法が見つかりました。

 

Python関連に必要+α

sudo apt-get -y install build-essential zlib1g-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev libbz2-dev libgdbm-dev tcl-dev zip git vim

 

sudo apt-get -y install python-dev

 

(追記↓)

sudo apt-get install gfortran swig liblapack-dev

※これがないと仮想環境にscipyをインストール出来ない!

(追記↑)

 

■Distribute(easy_install)

wget http://python-distribute.org/distribute_setup.py

sudo python distribute_setup.py

 

■pip

wget http://raw.github.com/pypa/pip/master/contrib/get-pip.py

sudo python get-pip.py

 

■virtualenv

sudo pip install virtualenv

 

■pyenv

git clone git://github.com/yyuu/pyenv.git .pyenv

 

vim .bashrc

export PATH="$HOME/.pyenv/bin:$PATH"

eval "$(pyenv init -)"

 

端末(ターミナル)再起動

 

pyenv install 3.4.0

pyenv install 3.3.5

pyenv install 3.2.5

pyenv install 2.7.6

 

インストール後にpyenv rehash

 

pyenv rehashの自動化

git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash

 

■pyenv-virtualenvプラグイン

git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

 

pyenv virtualenv 2.7.6 default27

pyenv virtualenv 3.2.5 default32

pyenv virtualenv 3.3.5 default33

pyenv virtualenv 3.4.0 default34

 

削除

pyenv uninstall default32

 

中に入る

pyenv activate default32

出る

deactivate

 

ディレクトリに仮想環境を参照させる

mkdir default

cd default

pyenv local default32

 

バージョン切り替え

・シェル

pyenv shell 3.4.0

・カレントディレクトリ

pyenv local 3.4.0

・全体

pyenv global 3.4.0

 

(おかしい時は端末(ターミナル)再起動)

 

これで書籍内の「環境構築」で求められている環境が整ったのではないかと…。

 

「flask」のことが収録されてるってだけで買ってしまった『Pythonプロフェッショナルプログラミング』が役に立ちました。ブログを書いて下さっている方々にも感謝の気持ちでいっぱいです。

 

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

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

 

 

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング

 

 

Pythonの勉強を始めます。

1人で自宅兼事務所の会社をやっているつぐです。

 

ずっとやりたいと思っていたPythonの勉強をついに始めることにしました。

学習内容をブログに書くと効率良く学べるらしいので今日からブログをはじめてみました。

 

仕事はWeb制作ですが、

タイプタッチを身につけたのはつい最近です。

それまでは右人差し指だけでキーボードを叩いていました。

超が付くほどのヘビースモーカーなので両手が塞がるようなタイピングは物理的に不可能だった為に覚えようとすらしていませんでした。

 

まだまだタイピングのスピードは遅いですが、

キーボードを見ずに入力が進むというのはとても快適なものです。

 

今仕事で使っているのはPHPで、フレームワークは使っていません。

…っていうか使えません。

 

PHPなんて言語仕様の最初の方だけ読んでしまえば関数を調べながら使えてしまいます。

 

呆れ返るほどの最下層PHPerですが、

仕事の合間を使ってPythonを勉強していきたいと思います。

 

 

 

  

基礎からのPHP (基礎からシリーズ)

基礎からのPHP (基礎からシリーズ)

 

  

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)