ホーム 戻る
第6章 関数(function) メソッド 文字列メソッド
"白石かずこ さん"の詩集「浮遊する母、都市から」 から美しいコトバを拾ってみました。
てのひらにのせてあげるから こっちへ
むかうみちは そこでとぎれている
ひらり ひらひら 雪のふる夜は
ひらひら 雪よりひらひら ひいやり
ひらひら雪泣きやめず
ふり ふり ふりつづけ
コンセプト関数とは
関数:決まった仕事を繰り返しできるように、コマンドをまとめておく方法。
pythonで用意された関数は組込関数という。
自分で必要な関数をつくるには、モジュールという仕組みを使う。
関数名:変数と同じ規則。英単語で区切りたい場合はアンダースコアを使う
引数: 複数の引数を書きたい場合はカンマで区切る。デフォルト値を持つ引数
は「引数名=値」として引数定義の最後に記述する。
戻り値:return文を使う。複数の値を戻す場合はreturn文でリストなどを返す。
関数:サブルーチン・プロシージャ:コードの再利用:プログラムの分割:プログラ
ムの行うべき処理作業に対応し、「対象物」に対応しない。「対象物」に対
応するのは「クラス」:関数もオブジェクト
ビルトイン関数:pythonにあらかじめ用意されている関数:組込関数
関数:len(y)のように名前(引数,・・・)の形式で表現する。
ファンクション:名前があり、呼び出す際に引き渡す引数のリストがある。処理を
実行した結果を呼び出し側に返す機能を備える。
関数名:関数オブジェクトへの「リファレンス」になる
呼び出し側:関数が呼び出されると関数の処理が終わり、呼び出し側に制御が
戻されるまで、中断される。
引数:関数に引数が渡されるとき「代入」の処理が行われる:オブジェクトへのリ
ファレンスが渡される:呼び出し側のコードと関数はリファレンスにより同
じコードを共有する
サブルーチン:プログラムの部分、手続き。プログラムの一部を切り離したもの。引数(入力)を得て、何らかの、手続きを実行して、戻り値(出力)を返すという全体として一つの関数として機能する。
サブルーチン:関数:function:機能:あるプログラムの一部を何回も使いまわ
す。
呼び出し側:関数が呼び出されると関数の処理が終わり、呼び出し側に制御が
戻されるまで、中断される。
引数:関数に引数が渡されるとき「代入」の処理が行われる:オブジェクトへのリ
ファレンスが渡される:呼び出し側のコードと関数はリファレンスにより同
じコードを共有する
関数の定義 def文とreturn文
def hai_ko(kei):
if kei <= 400000 :
return 380000
elif kei < 750000 :
return 380000-(kei-380000)
elif kei < 760000 :
return 30000
range関数
>>> range(100,105)
[100, 101, 102, 103, 104]
>>> range('101','105') 数値のみを使う。文字はエラーみなる。
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
range('101','105')
TypeError: range() integer start argument expected, got str.
>>>
(1)関数を作って使う def :
>>> def number(x,y,z):
menseki=(x+y)*z/2 台形の面積
return menseki 戻り値menseki
>>> number(3,4,6) 引数3,4,6
21
>>> def times(x,y): 関数オブジェクト作成: times:関数名
return x*y ボデイ部分:呼び出されると実行
>>> times(2,4) 呼び出し:関数名():引数(オブジェクト)指定:変数
に代入される
8 戻り値
>>> x=times(3.14,4) 戻り値を変数に代入して利用する場合
>>> x
12.56
>>> times('ni',4) 文字列を繰り返す
'nininini'
>>> def sum(n1=0,n2=0,n3=0) : 引数が省略されたときのデフォルト値を設定
return n1+n2+n3
>>> print sum(2,5,7)
14
>>> print sum(3,8)
11
>>> print sum(4)
4
>>> print sum()
0
>>> def digits(k=0,h=0,d=0,n=0) : キーワード引数
return k*1000+h*100+d*10+n 与えられた引数を特定
>>> print digits(5,8,4,3)
5843
>>> print digits(k=2,d=9)
2090
>>> print digits(3,n=6) 引数が指定されないとき最初の
引数に代入される
3006
>>>
>>> def muladd(a,b) : 複数の値を返す
return a*b,a+b
>>> print muladd(3,2)
(6, 5) タプルにまとめている
>>> i,j = muladd(4,5) 2以上の値を2以上の変数に同時に代入
>>> print i,j
20 9 それぞれの変数の値
>>> a,b,c=[3,2,1] リストの3つの要素を3つの変
数に同時に代入できる
>>> print a
3
>>> print c
1
>>> print c
1
>>> def times2(n) :
n *= 2
print "inside",n
>>> n=3
>>> times2(n)
inside 6 関数のなかのローカル変数の値
>>> n=3
>>> print "outside:",n グローバル変数には影響がない
outside: 3
>>>
>>> def times2(a) :
global n グローバル宣言をしたので、外部のn変
数にアクセスできる
>>> n=3 nはグローバル変数
>>> times2(n)
inside 6
>>> print "outside",n
outside 6 ファンクション内部の変数nが外部の変
数nと同じになる:トラブル原因:実際に
は使わない。
>>> def changelist(l) : lは小文字のエル
l[3] = 3
>>> alist =[1,2,3,4,5]
>>> print "before:", alist
before: [1, 2, 3, 4, 5]
>>> changelist(alist)
>>> print "after:",alist
after: [1, 2, 3, 3, 5] 引数として与えたリストの内容が変更されて
いる。リストを引数として渡すと「ポインタ」が
渡される。要素がリストの場合だけ内容が変
更できる。
>>>
>>> def sanjyo(x) : xは仮引数 関数の名前部分
return x**3 関数の本体
>>> print sanjyo(3) 3は実引数 関数の呼び出し
27
>>> def even_odd(x):
if x % 2 ==0:
print x ,' is even.'
else:
print x, ' is odd.'
>>> even_odd(33)
33 is odd.
>>> even_odd(22)
22 is even.
>>> def sum(data): dataは仮引数
total=0
for x in data:
total=total+x
return total
>>> print sum([1,2,3]) 1,2.3は実引数
6
>>> >>> def func(x): x仮引数、局所変数、funcの専用変数
x = x +1
print 'func:= ',x
>>> x=10 メインプログラム
>>> y=10
>>> func(y)
func:= 11
>>> print x,y メインプログラムのx、yの値は変わらない
10 10
(2)メソッドを使う
print ' to be or not tobe'
to be or not tobe
この場合のprintメソッドのオブジェクトはプログラム自体。
1・クラスオブジェクトを使う
>>> class Myclass: Myclass. iとMyclass.fが属性参照として有効
'A example class'
i = 12345
def f (self): クラスのインスタンス化:関数表記:
クラスオブジェクトを、クラスのイン
スタンスを返す引数の
ない関数のように書く
return 'hello world'
>>> x = Myclass() 新しいクラスが生成されローカル変数xに代
入される
>>> x.f() 属性参照形式:オブジェクト・name:
第1引数としてインスタンスのオブジェクトが
渡される:x.fのコールはMyclass.f(x)と等
価。
'hello world'
2・インスタンスメソッドを使う
>>> "10,20,30,40".split(",")
['10', '20', '30', '40'] リストのインデックスを返す
>>> [1,2,3,4,5,6].index(3) リストの3のインデックスは0から数えて2
2 インデクス
3。クラスメソッドを使う
関数的メソッド:レシーバの状態によって結果が変わらない。
>>> print "hello"
hello
4.メソッドの定義
>>> def hello(): メソッドの名前
print "hello python" メソッドの本体
>>> hello() メソッドを呼び出す
hello python
>>>
>>> def volume(x,y,z): 仮引数 x y z 名前
return x*y*z メソッド本体
>>> print volume(2,3,4) 実引数2,3,4
24
>>> print volume(10,20,30)
6000
>>> def area(x,y,z):
xy=x*y
yz=y*z
zx=z*x
return (xy+yz+zx)*2
>>> print area(2,3,4)
52
>>> print area(10,20,30)
2200
>>> def sum(x,y):
x+y
print x+y
>>> sum(45,87)
132
>>> def diff(x,y):
i=x-y
print i
>>> diff(54,23)
31
メソッドの形式:オブジェクト名.メソッド名(引数・・・)
オブジェクト>レシーバ>オブジェクトにメソッドを送る>オブジェクトはメッセージを受け取る>引数とともにメッセージを送る
4.メソッド特選
(1)pow() 累乗算
>>> y=0
>>> val =pow(x,y)
>>> x = 2
>>> for y in range(0,11):
print pow(x,y)
1 2の0乗は1
2
4
8
16
32
64
128
256
512
1024
>>>
(2)sys dir (__ builtins__)組み込み関数のリストを表示
>>> import sys sysモジュールを呼び出す
>>> print dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__debug__', '__doc__', '__import__', '__name__', 'abs', 'all', 'any', 'apply', 'basestring', 'bool', 'buffer', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
(3) さらなる演算メソッド
>>> print 5**2 **2は2乗のこと。
250
>>> print 5**0.5 **0.5は平方根をもとめる。
2.2360679775
>>> print 7/3 /では、剰余は出力されない。
2
>>> print 7 % 3 剰余が出力。
1
>>> 365/7
52
>>> print 365%7 一年が52週間と1日
1
>>> print abs(5-2) abs()は絶対値を返します。
3
>>> print abs(2-5)
3
>>> math.sqrt(5)
2.2360679774997898 #5の平方根を出力する。
>>> import math mathモジュール
>>> print math.pi 円周率
3.14159265359
>>> angle=45.0*math.pi/180 45度をラジアンに変換
>>> print math.sin(angle) サイン関数
0.707106781187
5.文字列 関数 メソッド
center(n) ljust(n) rjust(n)
swapcase() upper() lower() capitalize()
reverse() find() ord() chr() .split() join()
len() str() eval() raw_input() rstrip() lstrip() strip()
(1)文字列の書式
返される文字列の長さを受け取り、文字列を左寄せ、右寄せにして余白をスペースで埋める。
>>> ' aunty habart is '.center(7)
' aunty habart is '
>>> 'sit in the food rack '.center(30)
' sit in the food rack '
>>> 'she is eating a card and a hoee '.center(35)
' she is eating a card and a hoee '
>>> 'a spider came there '.center(50)
' a spide came there '
>>> 'sit on her side '.center(3)
' sit on her side '
>>> 'a poor dog run away'.center(30)
' a poor dog run away '
(初めてのプログラミング・Chris Pine著・西山伸訳・オライリージャパン)
>>> str ='---> sentence <---'
>>> print str.ljust(10)
---> sentence <---
>>> print str.center(50)
---> sentence <---
>>> print str.rjust(20)
---> sentence <---
>>> print str.ljust(10) +str.rjust(30)
---> sentence <--- ---> sentence <---
(2)大文字と小文字の操作’アルファベット変換操作)
uper()メソッド lower()メソッド swapcase()メソッド
capitalize()メソッド
>>> letters='aAbBcCdDeE' 文字列を作ります。
>>> letters.upper() 文字列を大文字にします。
'AABBCCDDEE'
>>> letters.lower() 文字列を小文字にします。
'aabbccddee'
>>> letters.swapcase() lettersをコピーして大文字を小文字に小
文字を大文字にしたものを返す
'AaBbCcDdEe'
>>> letters.capitalize() 最初のアルファベット文字を大文字に
残りを小文字に。
'Aabbccddee'
(3)文字列の置き換え
reverse() リストの並びを反転し、リスト自体を書き換える。
>> a = [1234,456,789]
>>> a.reverse()
>>> a
[789, 456, 1234]
>>> s1 = ['deliver','rapaid','desert']
>>> s1.reverse()
>>> s1
['desert', 'raoid', 'deliver']
(4)部分文字列の取得
>>> digits='123'
>>> digits[2] インデックスを使って文字列を取り出す
3
>>> str='Humpty Dempty'
>>> str[2]
'm'
>>> str[7:4]
''
>>> str[0:7]
'Humpty '
>>>
(5)文字列の検索
>>> digits='123'
>>> digits.find('23')
1 要素2に存在
>>> digits.find('76') 要素は不存在
-1
>>> str='Albert Einstain'
>>> str.find('Ei')
7
>>> str.find('bert')
2
(6)文字とキャラクターコード変換
>>> str='Martin'
>>> ord(str[1]) キャラクタコードに変換
97
>>> ord(str[0])
77
>>> str2=str+chr(77) 文字に変換
>>> str2
'MartinM'
(7) コンマ区切り :共通フォーマットに対応した文字列を作る
>>> c = " "
>>> s = 'a short string '
>>> import string
>>> print string.split(s,c)
['a', 'short', 'string', '']
>>> import string
>>> times="MORNING:EVENING:AFTERNOON"
>>> periods = string.split(times,":")
>>> print "Good ----",periods[1]
Good ---- EVERNING 配列1はEVENING
0はMORNING
2はAFTERNOON
split() join()
split()文字列メソッド
>>> y=['a,b,c','d,e,f','g,h,i']
>>> y[0]
'a,b,c'
>>> y[0].split(',')
['a', 'b', 'c']
>>> y[1]
'd,e,f'
>>> y[1].split(',')
['d', 'e', 'f']
join(seq)文字列メソッド 連結したseqを返す
>>> x=['a','b','c']
>>> ch=',' ch減数
>>> ch.join(x)
'a,b,c'
>>> ch=':'
>>> ch.join(x)
'a:b:c'
>>> ':'.join(x) 変数を使わずに
'a:b:c'
>>> ','.join(x)
'a,b,c'
>>> s=':ok:'
>>> t=s.join('qwerty')
>>> print t
q:ok:w:ok:e:ok:r:ok:t:ok:y
(9)文字列の字数カウント
len(container) 一連の内容に含まれているアイテムの数を返す。
str(obj) objの簡潔で判読可能な文字列表現を返す。
>>>print '貴方のフルネームは何ですか'
貴方のフルネームは何ですか
>>> name = raw_input('>')
>Mitiya Tobari
>>> len(name)
13 nameの文字数です。
>>> str(name)
'Mitiya Tobari'
>>> str(len(name))
'13'
>>> print '貴方の名前が' + str(len(name)) + '文字だって'
貴方の名前が13文字だって
>>> print '知っていました? '+str(name) + 'さん'
知っていました? Mitiya Tobariさん
(10)文字列メソッド特選
(a) raw_input:("prompt'') :
標準出力にプロンプト(">等")を書き出し、標準入力から一行を読み取りその行を文字列として返す。
>>> print raw_input("何か入力してください.。>")
>何か入力してください。> かっこ内の文字列をそのまま、出力
しユーザの入力を待つ。
(b)メソッド
>>> def say_goodnight(name): メソッドの名前
return 'good night' +name メソッドの本体
>>> print say_goodnight (" Mori Hnae san")
good night Mori Hnae san
>>>
(c)eval関数 文字列でpythonの式を受け取って実行する
>>> eval('"a,b,c".split(",")')
['a', 'b', 'c']
>>> x=1
>>> eval('x+1')
2
(11)オブジェクト
(a)pythonはあらわれるすべてのデータを、それぞれの個性を一旦無
視して、すべてを一律「もの」とみなす。
(b)変数にはどんな「もの」も入れることができる。
(c)「もの」をオブジェクトという。
>>> a='x,y,z'
>>> a
'x,y,z'
>>> a.split(',')
['x', 'y', 'z']
>>> dir()
['__builtins__', '__doc__', '__name__', 'a']
>>>b=10
>>> def f(a,b) : f メソッドの名前
return a+b
>>> import sys
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'b', 'f', 'sys']
>>> a
'x,y,z'
>>> b
10
>>> f
<function f at 0x00CB77B0>
>>> sys
<module 'sys' (built-in)>
>>>
(d)文字列両端の空白を刈り込む
>>> s =' model '
>>> s.rstrip()
' model'
>>> s.lstrip()
'model '
>>> s.strip()
'model'
コンセプト
メソッドとは
メソッド:手続きをモジュール化して再利用する仕組み:クラスの中に書いた関数を普通の関数と区別してメソッドと呼ぶ:普通の関数とは違って、メソッドの第一引数には特別の意味があって、このメソッドが呼び出されたときのインスタンスが渡ってくる:この引数はどんな名前で定義してもよいが、慣習的にselfという名前をつけることが強く推奨されている(上平・即効python)
メソッド゙:あるオブジェクトが別のオブジェクトにメッセージを渡す。受け
取ったオブジェクトがメッセージに対応する操作をする。この
操作をメソッドという。オブジェクトを扱うための手続き。
メソッドに渡す情報を引数という。
メソッド:クラス専属のファンクションメソッドは名前.名前(引数,・・・)。
動詞のようなもの:関数のようなもの
オブジェクト:対象物:名詞のようなもの。文字列、数値、時刻など様々
なデータすべてのメソッドにはオブジェクトが必要である。
プログラム全体もオブジェクトである。
シーケンスとは
有限数の要素アイテムを一つずつ取り出すことのできるコンテナー
インデクシング、スライシング、len()に渡せるもの。
すべての反復可能体はループ文、min,max・zip、sum、str、join等で使える.