読者です 読者をやめる 読者になる 読者になる

Pythonメモ

僕はC言語からプログラミングを学び,JavaAndroidアプリ作ったり,RubyScheme,Common Lispなんかを触ったりして,最近PythonをはじめたPython初級者です。

この記事は勉強していく中で「へーそんな書き方あるんかー」と思ったPythonのコードの作法をメモしたものです。(備忘録というやつです)
勉強しながら適宜更新していく予定です。

リスト内包表記

リスト内でfor文を使ってリストを初期化する 。

たとえば数値列の累積和のリストをつくるには以下のように書ける。

num_l = [1 , 2 , 3 , 4]
sum = 0
cumsum_l = [num+sum for num in num_l]

また奇数だけの累積和リストを取りたい場合(そんな場合があるかは知らんが)以下のように条件付けできる。

num_l = [1 , 2 , 3 , 4]
sum = 0
cumsum_l = [num+sum for num in num_l if num % 2 !=0]

ジェネレータ

リスト内包表記ではfor句,if句を使って条件に合う項すべてを含んだリストを生成する。 これではリストサイズが大きい場合にメモリ,処理時間が多くなってしまう。 そこで一度にリストを作るのではなく,要素を一つずつ逐次生成するのがジェネレータである。
ジェネレータではreturn文は用いずにyield文によって指定した値を生成して返す。
なのでメソッドの中にyield文があったならそいつはジェネレータだ。
例としてジェネレータを用いてFizzBuzzを実装してみよう。

  • FizzBuzz:1から数を数え挙げていき、3の倍数のときに"Fizz",5の倍数のときに"Buzz",15の倍数のとき"FizzBuzz"と出力するナベアツ的なやつのこと。
def fizzBuzzGen():
    i = 0
    while(True):
        i += 1
        if i % 15 == 0:
            yield "Fizz Buzz" 
        elif i % 3 == 0:
            yield "Fizz"
        elif i % 5 == 0:
            yield "Buzz" 
        else:
            yield i

g = fizzBuzzGen()
for i in range (20):
    print g.next()
->1
  2
  Fizz
  4
  Buzz
  Fizz
  7
  8
  Fizz
  Buzz
  11
  Fizz
  13
  14
  Fizz Buzz
  16
  17
  Fizz
  19
  Buzz

文字列操作

文字列中に特定の部分列を含むか判定する。

str = 'This is a string'
str.find('string')

組み合わせ

組み込みモジュールの中に itertools というものがあり,これを使うと組み合わせや順列などを扱える。
組み合わせには itertools.combinations( iteratable , r) を用いる
これによりリストなどからn個の要素を取り出すときの組み合わせを生成するジェネレータを返す

string = "ABC"
#string(ABC)から任意の2文字を選ぶ
[c for c in itertools.combinations(string , 2) ]
-> [('A','B') , ('A','C') ,('B','C')]

順列

順列には itertools.permutations( iteratable , r) を用いる。 これによりリストなどからn個の要素を取りだし並べるときの順列を生成するジェネレータを返す。

string = "ABC"
#string(ABC)から任意の2文字を選びならべる。
[p for p in itertools.permutations(string , 2) ]
-> [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]

文字列リストの連結

L = ['The ','length ','of ','this ','list ','is ','seven.']
print ''.join(L)
-> 'The length of this list is seven.'