@blog.justoneplanet.info

日々勉強

Pythonにおける型変換

Pythonにおける文字列の結合はPHPやJavaScriptとは違うので気を付けないといけない。

■文字列と数値の結合

Pythonでは以下のように文字列と数値を結合することはできない。

"hoge" + 2000
#TypeError: cannot concatenate 'str' and 'int' objects

正しい記述

"hoge" + str(2000)
#hoge2000

PHPやJavaScriptでは以下のように文字列と数字の結合ができる。

PHP

print('hoge' . 2000);// hoge2000

JavaScript

document.write("hoge" + 2000);// hoge2000

■比較時の型変換

Pythonは比較時に数字のような文字列が数字に変換されたりはしない。

if(2000 == "2000"):
    print('hoge');
elif(2000 != "2000"):
    print("fuga")
#fuga

従って、PHPやJavaScriptにおける===などの型まで比較する演算子が、Pythonには存在しない。

Pythonでクラスを定義する

Pythonでclassを定義するには以下のように記述する。

class Dog:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print(self.name)

dog = Dog('pochi')
dog.cry()#pochi

■継承

Pythonでclassを継承するには以下のように記述する。

class Animal:
    name = ''
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    talk = 'bow!'
    def cry(self):
        print('this is ' + self.name + '! ' + self.talk)

class Cat(Animal):
    talk = 'mew!'
    def cry(self):
        print('this is ' + self.name + '! ' + self.talk)

dog = Dog('pochi')
dog.cry()#this is pochi! bow!
cat = Cat('doraemon')
cat.cry()#this is doraemon! mew!

■多重継承

Pythonは多重継承をサポートした言語である。自分の中では初めての多重継承((o(^-^)o))。以下のような記述になる。

class Robot:
    color = ''
    def __init__(self, color):
        self.color = color

class Cat:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print('mew!')

class Doraemon(Robot, Cat):
    name = 'Doraemon'
    def intro(self):
        print('My name is ' + self.name + '(' + self.color + ')!')

doraemon = Doraemon('blue')
doraemon.intro()#My name is Doraemon(blue)!
doraemon.cry()#mew!
doraemon.name#Draemon

ドラえもんクラスを作って考えてみることにした。まず、ドラえもんはロボットなので以下のようなRobotクラスを作る。

class Robot:
    color = ''
    def __init__(self, color):
        self.color = color

ドラえもんはネコ型なのでCatクラスも継承するはずなので、以下のように定義する。

class Cat:
    name = ''
    def __init__(self, name):
        self.name = name
    def cry(self):
        print('mew!')

以下のようにドラえもんは量産型なのでクラス化して、RobotクラスとCatクラスを継承する、

class Doraemon(Robot, Cat):
    name = 'Doraemon'
    def intro(self):
        print('My name is ' + self.name + '(' + self.color + ')!')

以下のように、Draemonクラスをインスタンス化して使ってみるする。

doraemon = Doraemon('blue')
doraemon.intro()#My name is Doraemon(blue)!
doraemon.cry()#mew
doraemon.name#Draemon

上述のDaraemonクラスにはコンストラクタが存在しない。このような場合の解決規則は、(継承を記述した部分で)左から右へ探索し解決される。多重継承は非常に注意して使わないと分かりにくくなる。従って多重継承をサポートしない言語が多いということがある。

■プライベート変数

name変数は外から変更できないほうが良い。従って以下のようにアンダースコアを2つ続けて書くことでプライベートにする。

class Dog:
    __name    = ''
    __counter = 0
    def __init__(self, name):
        self.__name = name
    def cry(self):
        print('This is ' + self.__name + '(' + str(self.__counter) + ')')
        self.__count()
    def __count(self):
        self.__counter = self.__counter + 1

dog = Dog('pochi')
dog.cry()#This is pochi(0)
dog.__name#error
dog.__count()#error
dog.cry()#This is pochi(1)

上述の通り、プライベートになり外からアクセスすることが出来なくなる。しかし、Pythonはプライベート変数に外から強引にアクセスすることもできる言語仕様だ。

class Dog:
    __name    = ''
    __counter = 0
    def __init__(self, name):
        self.__name = name
    def cry(self):
        print('This is ' + self.__name + '(' + str(self.__counter) + ')')
        self.__count()
    def __count(self):
        self.__counter = self.__counter + 1

dog = Dog('pochi')
dog.cry()#This is pochi(0)
dog._Dog__name#pochi
dog._Dog__count()
dog.cry()#This is pochi(2)

■クラスの入れ子

Javaと同じようにPythonではクラスを入れ子にすることができる。ちなみにPHPではできない。

class Hoge:
    class Hoge1:
        def __init__(self):
            print 'hoge1'
    class Hoge2:
        def __init__(self):
            print 'hoge2'

hoge  = Hoge()
hoge1 = hoge.Hoge1()# hoge1
hoge2 = hoge.Hoge2()#hoge2

最近心変わりがあって行末にセミコロンを打つのをやめた。(o→ܫ←o)

numpyをインストールする

■環境

Cent OS 5.5 x86_64

前準備

以下のコマンドを実行し、python-develをインストールしておく。

yum install python-devel

■コマンド

以下のコマンドでnumpyがインストールされる。

wget http://sourceforge.net/projects/numpy/files/NumPy/1.5.0/numpy-1.5.0.tar.gz/download
tar xvzf numpy-1.5.0.tar.gz
cd numpy-1.5.0
python setup.py build
python setup.py install

Pythonのリストを触ってみる

list = ['hoge', 'huga', 'baka']
list[0]
#hoge

スライスもできる★

list[0:2]
#['hoge', 'huga']

リストの長さは以下のようにして取得できる。

len(list)
#3

for文を使って以下のように処理できる。

for i in list:
    print i, len(i)
#hoge 4
#huga 4
#baka 4

Pythonの文字列

Pythonでは以下のように文字列を切り出す事ができる。

str = "prepost"
str[:3]#'pre'
str[3:]#'post'
str[:-4]#'pre'
str[-4:]#'post'
str[2:4]#'ep'

C 言語の文字列と違い、Python の文字列は変更できない。JavaScriptと同じだ。

■文字列の結合

文字列は以下のように+演算子で結合する事ができる。

'str' + 'ing'
#'string'

文字列リテラルの場合は以下のように演算子を書かなくても連結できる。

'str' 'ing'
#'string'

しかし以下のようにするとエラーになる。

'str'.strip() 'ing'

pythonで複素数を扱う

以下のように虚部はjを用いる。

1j * 1j
#(-1 + 0j)

以下のようにcomplex関数を使っても生成できる。

complex(1, 5)
#(1 + 5j)

掛け算をもっと。

(2 + 1j) * (4 + 3j)
#(5 + 10j)

割り算してみる。

(2 + 1j) / (4 + 3j)
#(0.44 - 0.080000000000000002j)

しゅごい!(ノ*゚▽゚)ノ

pythonを触ってみる

さっそく触る!((o( ̄ー ̄)o))

from math import sqrt;
sqrt(pow(2, 4))# 4.0

コメントは#から行末までですな。pythonでは;セミコロンを書かなくても良い=3

■関数定義

以下のようにする。

def powpow(x):
    return pow(pow(x, 2), 2)
powpow(2)#16

ふむふむ。

■クラス定義

class Dog:
    def cry(str):
        return 'bow'
pochi = Dog()
pochi.cry()#'bow'

なるほど!ヾ(@^▽^@)ノ

■結論

perlより好きだ★

Pythonで内部エンコーディングを指定する

■コード

先頭に以下の記述をする。

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

エラー

以下のようにreloadしないとエラーになる。

# -*- coding: utf-8 -*-
import sys
sys.setdefaultencoding('UTF-8')
"""
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'setdefaultencoding'
"""

ちなみにPHPだと以下のようになる。

mb_internal_encoding('utf-8');

■入出力の文字コード

標準入出力の文字コードだって指定したい。

import sys
import codecs

sys.stdin  = codecs.getreader('utf_8')(sys.stdin)
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

まぁ、コンナ感じ。

■ファイル

あとはファイルの文字コードがあるね。

import codecs

fin  = codecs.open('hoge.txt', 'r', 'utf_8')
fout = codecs.open('fuga.txt', 'w', 'utf_8')

PHPだとmb_convert_encodingだよね。

■結論

日本語ってめんどい。。。゜(´□`。)°゜