Pythonを学ぶ その4
知っていると便利な型
タプル
タプルもリストと似ていて、ひとつの型のなかに複数のデータを格納します。ただ、その目的は異なっていて、「決まった数の複数のデータがひとつの意味を持つもの」にタプルは使われます。
会員情報>氏名、生年月日、住所
タプルの作成はタプルの要素となる値を()で囲むことで作成できます。
a = ('taro','1986','tokyo')
参照するにはa[0]
要素を一気に取得する(b,c,d) = a
リストと異なり、一度作成されたオブジェクトを変更することはできません
セット
集合という概念を実現するための型 - 順序 - 重複 がない
set()
関数:空のセットのオブジェクトの作成
>>>a = set() >>>b = set([1,3,5,7]) >>>print(b) set([1,3,5,7]) >>>b.add(2) >>>b.remove(5) >>>print(b) set([1,2,3,7])
要素の存在を確認する
データをリストにするlist(a)
>>>3 in a True
ハッシュ
ある要素を指定するとハッシュ値を返す関数のこと 集合はハッシュが使われている(?)
辞書型(連想配列、マップ)
重複が許されないKeyとそのValueが対応付けられたデータ型。 セットにおけるハッシュ値にValueを対応しているもの
辞書オブジェクトの生成にはdict()
関数か、{key:value}
を使う
keyの取得にはc[]
keyの存在を確認するのはセットと同じ
has_key()
,get()
関数を使ってアクセスすることもできる
keys()
キー一覧
values()
値一覧
>>> a = dict() >>> type(a) <type 'dict'> >>> b = {} >>> type(b) <type 'dict'> >>> c = {"apple":"red","lemon":"yellow"} >>> type(c) <type 'dict'> >>> c['apple'] 'red' >>> c['apple'] = "green" >>> c['apple'] 'green' >>> 'apple' in c True >>> c.has_key('apple') True >>> c.get('apple') 'green'
関数型
関数も型の一種です
>>> def test(): ... return1 File "<stdin>", line 2 return1 ^ IndentationError: expected an indented block >>> def test(): ... return 1 ... >>> type(test) <type 'function'> >>> test2 = test >>> type(test2) <type 'function'>
インデント必要なので注意
関数を引数にすることができるってこと?(関数を引数に持つ関数を高階関数と呼ぶ)
def fun1(fun,x): fun(x) def fun2(x): print('fun2:' + str(x)) fun1(fun2,5)
クロージャ
テンプレートとなる関数からカスタム関数を生成する?
ef adder(x): def fun(y): return x + y return fun adder5 = adder(5) print(adder5(10)) adder7 = adder(7) print(adder7(10))
adderの引数を内部で作成する関数で利用している
面白いw 数学やってるみたいだ。。。
演習1
リストから重複を取り除く関数をセットを使って作成してください
print("enter the list as follows: x1,x2,...") x = raw_input() # x = "1,2,3,3,4" x = x.split(',') print(x) print(type(x)) def nodupli(x): y = set() for a in x: y.add(a) z = [] for a in y: z.append(a) return z print(nodupli(x))
ああ、set(x)
でよかったんだ
演習2
標準入力を使って生徒の成績を管理するツールを作ってください。"save 生徒名 点数"とするとその生徒の点数を保存します。"get 生徒名"とするとその生徒の点数を表示します。生徒が登録されていない場合は"Error"と出力させて処理を継続させます(※ 終了はCtrl-Dなどで強制終了してかまいません)。
sdata = {'sai':'100','hikaru':'10','akari':'20'} while(True): print('''to save student's score: enter 'save student_name score', to get student's score: enter 'get student_name' ''') x = raw_input() x = x.split() print(x) if(x[0] == 'get'): print(x[1]) print(sdata[x[1]]) elif(x[0] == 'save'): sdata[x[1]] = x[2] print(sdata) elif(x[0] == 'quit'): break else: print('error')
アラがあるけど、とりあえずできた。
演習3
英語の文章の単語出現数をカウントするプログラムを書いてください。たとえば'hello python hello world'というテキストを与えると{'hello':2, 'python':1, 'world':1} が返ってきます。なお、当然ながら辞書オブジェクト内のキーの順序は問いません。
#x = "hello python hello world" print("write a sentence") sentence = raw_input() x = sentence.split() print(x) lenx = len(x) print(lenx) y = dict() i = 0 j = 0 while((i < lenx) == True): # key wo kakunousuru y[x[i]] = 1 print(y) i += 1 #value wo ireru #kasanattara plus 1suru i = 0 while((i < lenx) == True): j = i + 1 while((j < lenx) == True): if(x[i] == x[j]): y[x[i]] += 1 j += 1 i += 1 print(y)
Keyを入れるのと、Valueを入れるので別の操作にしてみた
解答はスマートだなぁ。。。。愚直にやりすぎてる。。。 それと、もっと関数を定義してやるべき。 あと、条件分岐もC風にやってしまったけどはいけない。 今日はここまで