)

NomoLog

Log of my life and program

俺的Python気になった所まとめ2

Posted in Python Tagged as Python

俺的Python気になった所まとめ1の続き

リストの内包表記

forとかifとかを使ってぴゃっ!とリストが作れるっぽい。 こんな感じ

1
2
3
4
5
6
7
8
9
10
11
vec = [2,4,6]
[3*x for x in vec if x > 3]
> [12,18]

[[x,x**2] for x in vec]
> [[2,4],[4,16][6,36]]

vec1 = [2,4,6]
vec2 = [4,3,-9]
[x*y for x in vec1 for y in vec2]
[8,6,-18,16,12,-36,24,18,-54]

さらにネストしたリストの内包表記なんてのもある。

1
2
3
4
5
6
7
8
mat = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
  ]

print [[row[i] for row in mat] for i [0,1,2]]
[[1,4,7],[2,5,8],[3,6,9]]

これはこのコードと同値らしい

1
2
3
4
for i in [0,1,2]:
  for row in mat:
    print row[i],
  print

集合型

  • 重複する要素がない、順序づけられてない要素の集まり
  • 結合(Union), 交差(Intersection), 差分(Difference), 対称差(Symmetric difference)といった演算をサポート
1
2
3
4
5
6
7
basket = [ "apple", "orange", "apple", "pear", "orange", "banana"]
fruit = set(basket)
> set(["orange", "pear", "apple", "banana"])
'orange' in fruit                 # 高速なメンバシップテスト
> True
 'crabgrass' in fruit
 False

二つの単語の文字を例にした集合間の演算

1
2
3
4
5
6
7
8
9
10
11
12
a = set('abracadabra')
b = set('alacazam')
a                                  # a 内の一意な文字
>set(['a', 'r', 'b', 'c', 'd'])
a - b                              # a にあって b にない文字
>set(['r', 'd', 'b'])
a | b                              # a か b にある文字
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
a & b                              # a と b の双方にある文字
set(['a', 'c'])
a ^ b                              # a または b の片方だけにある文字
set(['r', 'd', 'b', 'm', 'z', 'l'])

辞書

おなじみkey-value型。keyは変更不可能な型になる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
tel
> {'sape': 4139, 'guido': 4127, 'jack': 4098}
tel['jack']
> 4098
del tel['sape']
tel['irv'] = 4127
tel
> {'guido': 4127, 'irv': 4127, 'jack': 4098}
tel.keys()
> ['guido', 'irv', 'jack']
'guido' in tel
> True

論理和論理積

&, | とand, or が使える

.pycファイル

バイトコンパイルされたpythonファイル

パッケージ

sysモジュールのpath内に記述されているサブディレクトリをパッケージと呼ぶらしい。 ただし、ただpath内にディレクトリを置くだけではパッケージとしては認識されず、 各ディレクトリにinit.py(空でよい)を置いておく必要がある。

以下パッケージのディレクトリ構造例

1
2
3
sound/
   effects/
     echo.py

次のようにimportし、使う

1
2
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7,atten=4)

もしくは

1
2
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)

もしくは

1
2
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)

モジュール、パッケージのインポート

1
from package import module

の形式で行える。が、

1
2
3
4
5
6
./
  main.py
  sub1.py
  dir1
    dir2
      sub2.py

のようなディレクトリ構造のときに sub1.pyはmain.pyに

1
import sub1

と記述することででインポートできるがsub2.py

1
from dir1.dir2 import sub2

としてもインポートできない。なんでだろう…

一応sys.path.append('dir1/dir2')としたりPYTHONPATHdir1/dir2/を追加することで対応できたけど、いちいちそんなことするのめんどくさすぎる。

なにか他に解決策はないものか…

追記

上記の上手くインポート出来ない原因はvimのquickrunプラグインによるものだった。

通常のpythonコマンドを使った実行ならば正常に動作した

ifname==“main

そのpythonファイルがメインで実行された時、if__name__=="__main__"以下が実行される。 そのpythonファイルがモジュールとして他のモジュールに取り込まれた時は実行されない。

if__name__=="__main__"以下をみればその関数をどのように動かせばよいかわかるので注釈としても便利


俺的Python気になった所まとめ3へ続く…

Comments