ラベル 数値 の投稿を表示しています。 すべての投稿を表示
ラベル 数値 の投稿を表示しています。 すべての投稿を表示

2009年10月17日土曜日

演算子のオーバーロード

クラスに特殊メソッドを定義する

# -*- coding: utf-8 -*-

class A:
    # 二項算術演算
    def __add__(self, i):
        return 10 + i
    def __sub__(self, i):
        return 10 - i
    def __mul__(self, i):
        return 10 * i
    def __div__(self, i):
        return 10 / i
    def __truediv__(self, i):
        return 10 / i
    def __floordiv__(self, i):
        return 10 // i
    def __mod__(self, i):
        return 10 % i
    def __divmod__(self, i):
        return (10 / i, 10 % i)
    def __pow__(self, i):
        return 10 ** i
    def __lshift__(self, i):
        return 10 << i
    def __rshift__(self, i):
        return 10 >> i
    def __and__(self, i):
        return 10 & i
    def __xor__(self, i):
        return 10 ^ i
    def __or__(self, i):
        return 10 | i
    # 単項算術演算
    def __neg__(self):
        return -10
    def __pos__(self):
        return +10
    def __abs__(self):
        return abs(10)
    def __invert__(self):
        return ~10
    # 比較演算
    def __lt__(self, i):
        return 10 < i
    def __le__(self, i):
        return 10 <= i
    def __eq__(self, i):
        return 10 == i
    def __ne__(self, i):
        return 10 != i
    def __gt__(self, i):
        return 10 > i
    def __ge__(self, i):
        return 10 >= i

a = A()

print a + 2
print -a
print a < 4

# 2 + a
# 逆を出来るようにするには r をつけた特殊メソッドを定義する
# __radd__, __rsub__, __rmul__, __rdiv__, __rtruediv__
# __rfloordiv__, __rmod__, __rdivmod__, __rpow__, __rlshift__
# __rrshift__, __rand__, __rxor__, __ror__

# a += 2
# += などを出来るようにするには i をつけた特殊メソッドを定義する
# __iadd__, __isub__, __imul__, __idiv__, __itruediv__
# __ifloordiv__, __imod__, __ipow__, __ilshift__
# __irshift__, __iand__, __ixor__, __ior__

詳細はドキュメントで

2009年10月14日水曜日

数学関数

# -*- coding: utf-8 -*-

import math

# 三角関数
angle = 30
h = 50
a = math.sin(math.radians(angle)) * h
b = math.cos(math.radians(angle)) * h

# 数値の平方根(ルート)を取得する
st = math.sqrt(2)

# 数値の絶対値を取得する
ab = abs(-5)

# シーケンス内の最大数値を取得する
mx = max(10, 20, 30)

# シーケンス内の最小数値を取得する
mn = min(10, 20, 30)

# 商と剰余のタプルを取得する (5/2,5%2)と同じ
dm = divmod(5, 2)

# べき乗 (3**3 でもできる)
pw = pow(3, 3)

# 数値を四捨五入する
rd = round(3.45, 1)
s = "%0.1f" % 3.45

# シーケンス内の合計
sm = sum(range(10))

print "h:", h
print "a:", a
print "b:", b
print
print ">>> math.sqrt(2)"
print st
print ">>> abs(-5)"
print ab
print ">>> max(10, 20, 30)"
print mx
print ">>> min(10, 20, 30)"
print mn
print ">>> divmod(5, 2)"
print dm
print ">>> pow(3, 3)"
print pw
print ">>> round(3.45, 1)"
print rd
print ">>> sum(range(10))"
print sm

実行すると
h: 50
a: 25.0
b: 43.3012701892

>>> math.sqrt(2)
1.41421356237
>>> abs(-5)
5
>>> max(10, 20, 30)
30
>>> min(10, 20, 30)
10
>>> divmod(5, 2)
(2, 1)
>>> pow(3, 3)
27
>>> round(3.45, 1)
3.5
>>> sum(range(10))
45

詳細はドキュメントで

2009年10月4日日曜日

乱数を取得する

# -*- coding: utf-8 -*-

import random

# float型で取得する
f = random.random()
f = random.uniform(0, 100)

# int型で取得する
i = random.randint(0, 100)

# ランダムなリストを取得する
ls = random.sample(range(100), 10)

# シーケンスからランダムに要素を取得する
i = random.choice(ls)

# シーケンスの要素をシャッフルする
random.shuffle(ls)

# ガウス分布で取得する  引数(平均, 偏差)
f = random.gauss(50, 20)

# シードを設定する
random.seed(10)

詳細はドキュメントで

2009年9月29日火曜日

数値を区切りの付いた文字列に変換する

localeモジュールを使う

# -*- coding: utf-8 -*-

import locale

# ロケールを設定する
print locale.setlocale(locale.LC_ALL, "")

# 数値を区切りの付いた文字列に変換する
print locale.format("%d", 123456789, grouping=True)

# 数値を通貨記号の付いた文字列に変換する
print locale.currency(123456789, grouping=True)

# ロケールをen_USに変更する
print locale.setlocale(locale.LC_ALL, ("en_US", "utf-8"))
print locale.format("%d", 123456789, grouping=True)
print locale.currency(123456789, grouping=True)

実行すると
ja_JP.UTF-8
123,456,789
¥123,456,789
en_US.UTF8
123,456,789
$123,456,789.00

Linuxならlocaleコマンドでロケールの情報を取得できる
$ locale -a
C
POSIX
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
ja_JP.utf8

詳細はドキュメントで

2009年9月27日日曜日

文字列を数値に変換する

# -*- coding: utf-8 -*-

# 文字列を数値に変換する
i = int("123")
f = float("1.23")
l = long("123l")
c = complex("123")

# 数値を文字列に変換する
s = str(123)
us = unicode(123)

# クラスに特殊メソッド __int__ __long__ __float__ __complex__ を定義すると
# int() long() float() complex() の引数として渡すことが出来る
class A:
    def __int__(self):
        return 10
    def __long__(self):
        return 100l
    def __float__(self):
        return 1.2
    def __complex__(self):
        return complex(10, 23)

a = A()

print int(a)

詳細はドキュメントで

文字コードを文字に変換する

# -*- coding: utf-8 -*-

c = chr(97)

# Unicodeの場合
uc = unichr(97)

# 文字を文字コードに変換する
i = ord('a')

詳細はドキュメントで

整数を16進数、8進数、2進数に変換する

# -*- coding: utf-8 -*-

# 数値をX進数に変換する
s = format(123, 'b')
s = oct(123)
s = hex(123)

# 文字列の2進数、8進数、16進数を整数に変換する
i = int("0101", 2)
i = int("01234567", 8)
i = int("0x0123456789abcdef", 16)

# クラスに特殊メソッド __oct__ __hex__ __format__ を定義すると
# oct() hex() format() の引数として渡すことが出来る
class A:
    def __oct__(self):
        return "01234567"
    def __hex__(self):
        return "0x0123456789abcdef"
    def __format__(self, f):
        return "format " + f

a = A()

print hex(a)

詳細はドキュメントで