目次
Python
py.exe
since 2022-11-01
https://peps.python.org/pep-0397/
https://docs.python.org/3/using/windows.html#python-launcher-for-windows
Python 3.11.0 で確認したら "-V" オプションで Anaconda なども選べるようになっていた
>py -0p -V:3.11 * C:\Users\nishimotz\AppData\Local\Programs\Python\Python311\python.exe -V:3.10 C:\Users\nishimotz\AppData\Local\Programs\Python\Python310\python.exe -V:3.9 C:\Users\nishimotz\AppData\Local\Programs\Python\Python39\python.exe -V:3.7-32 C:\Users\nishimotz\AppData\Local\Programs\Python\Python37-32\python.exe -V:2.7 C:\Python27\python.exe -V:ContinuumAnalytics/Anaconda39-64 D:\anaconda3\python.exe >py -V:ContinuumAnalytics/Anaconda39-64 Python 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.io/activation Type "help", "copyright", "credits" or "license" for more information. >>> > py -3.11-64 Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
末尾に -64 をつける方法は廃止されるらしい。arm64 と amd64 があるから、だろうか。。
- Windows で Python を使う4つの方法(2019年9月)
過去の記事
以下は最近更新された情報
-
- Source をクリックして「Pythonのビルド手順(Unix)」
- make altinstall
以下は最近更新されていなかった情報
- ポータル python
-
- 充実した日本語資料
- 巨大な epub ファイルが配布されていたのだがいつの間にか消えた。。
-
昔のバグ
- Windows の日本語ログイン名で tempfile のアクセスに失敗する。NVDA がインストールできない原因。
- 非 BMP 文字の問題。2.7.4 のリリースノートで触れられている。
よく使う書き方
ループ
ループを回す : xrange を使って。
>>> for i in xrange(3): ... print i ... 0 1 2
型キャスト
s = "1.23" float(s) s = "2" int(s)
逆はフォーマット演算子でできる。
"%.1f" % 1.234
改めて文法の基本
「Python チュートリアル」初版 p.33 あたり
シーケンス ('y', 'ye', 'yes') これはタプル
obj.methodname() : メソッド呼び出し
メソッドの仮引数 (a, *b, **c)
- b: 可変個数の引数をタプルで受け取る
- c: ディクショナリを受け取る
* 演算子 : リストやタプルからアンパックする ** 演算子 : ディクショナリからキーワード引数にアンパックする
- 関数(メソッド):括弧が必要
- 式
- 文:括弧が不要
docstring http://www.python.jp/doc/contrib/peps/pep-0257.txt
ラムダ式:無名関数の生成
return lambda x : x + n
文字コードを変換して logfile に書き込みを行う関数のオブジェクト print_log を作る:
logfile = open(outwavfile + '.log', 'w') print_log = lambda s : logfile.write(s.decode('shift_jis').encode('utf-8')) # print_log('text: ' + s)
データ構造
p.41 あたり
リスト
リスト: [ xxxxxxxxxx ]
- append extend insert remove pop index count sort reverse
- スタックとして使うには append / pop
- キューとして使うには append / pop(0)
- len(オブジェクト) は要素数を取得。文字列の場合は文字数を取得。
シーケンスに関数を適用する
- filter(関数, シーケンス)
- map(関数, シーケンス)
- reduce(関数, シーケンス)
リスト内包
[式 for x in vec] vec = [1,2,3] として 式 = 3*x とすると [3,6,9] が得られる >>> vec = [1,2,3] >>> v2 = x * 2 for x in vec SyntaxError: invalid syntax >>> v2 = [x * 2 for x in vec] >>> v2 [2, 4, 6]
del文 : リストのインデックス指定された要素を削除する
del a[0]
配列は足し算できる:
>>> b = [1,2,3] >>> c = [4,5,6] >>> d = b + c >>> d [1, 2, 3, 4, 5, 6]
ソートには sort() メソッドが使える:
>>> d += b >>> d [1, 2, 3, 4, 5, 6, 1, 2, 3] >>> d.sort() >>> d [1, 1, 2, 2, 3, 3, 4, 5, 6] >>> d.sort(reverse=True) >>> d [6, 5, 4, 3, 3, 2, 2, 1, 1]
参考 http://mglab.blogspot.com/2008/06/python-sortsorted_3738.html
タプル
タプルとは:カンマで区切られた値。イミュータブルなオブジェクト。
カッコはタプルの生成を意味するわけではないらしい。
t = 1, 2, 3 # パッキング 要素数0のタプル : t = () 要素数1のタプル : t = (1,) x,y,z = 1,2,3 # タプル・パッキングされた右辺を、シーケンス・アンパッキングして左辺へ
- シーケンスデータ型 : インデックス参照やスライス演算ができる
- 文字列
- リスト
- タプル
集合
集合(set) : 重複しない順不同の要素
存在判定(membership testing) ⇒ in 演算子
s = set([ xx, xx, xx ]) で生成する
'xx' in s : True or False
ディクショナリ
ディクショナリ(ハッシュ):キーの唯一性
空のディクショナリ : {}
生成 d = { xx:xx, yy:yy }
keys() メソッド:すべてのキーのリスト
存在判定
- メソッド has_key()
- in 演算子
コンストラクタ
dict() コンストラクタ ← キーワード引数からも生成可 [(k1,v1), (k2,v2), .... ] リストから生成
ループをまわす
for k,v in xxx.iteritems(): print k,v
シーケンスのループのための関数
enumerate() zip() reversed() sorted()
条件
a > 1 and a < 3 #=> 1 < a < 3 比較の連鎖 a = s1 or s2 or s3 #=> 空でない最初の値 シーケンス要素の比較
条件による値の振り分け
>>> print "hoge" if True else "fuga" hoge >>> print "hoge" if False else "fuga" fuga
モジュール
p.55
import 文
import モジュール名 #=> モジュール名.関数() # グローバル変数 __name__ にモジュール名が入る
モジュールのインポートとは実行である
モジュールはプライベートなシンボル表を持つ
一つ上のディレクトリにある scripts を path に加えるおまじない:
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../scripts")
from 文
インポートする側のシンボル表に直接取り込むのがfrom文
from モジュール名 import 関数 from モジュール名 import * # _で始まる名前は取り込まない
from future で将来バージョンの機能を有効にする:
from __future__ import print_function print('hoge')
path
sys.path ← PYTHONPATH 環境変数
dir関数
http://www.python.jp/doc/2.5/tut/node8.html
「組込み関数 dir() は、あるモジュールがどんな名前を定義しているか調べるために使われます」
>>> import re >>> dir(re) ['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']
コンパイル
- pyc : プラットフォーム非依存
- pyo : -O オプションつき実行(assert を除く)
ビルトイン関数 dir(モジュール)
パッケージ __init__.py
クラス
「全てのクラスメンバ (データメンバも含む) は public (公開されたデータ) 」 「メンバ関数はすべて 仮想関数 (virtual) 」 「属性=ドットに続く名前すべて」「属性は読取り専用にも、書き込み専用にもできる」 「クラス定義から普通に (定義の終端に到達して) 抜けると、 クラスオブジェクト (class object) が生成されます。 クラスオブジェクトは、基本的にはクラス定義で作成された名前空間の内容をくるむラッパ (wrapper) です。 生成されたクラスオブジェクトは復帰したローカルスコープにクラス定義のヘッダで指定した名前で結び付けられます。」 x = MyClass() # クラスの新しいインスタンス (instance) を生成し、そのオブジェクトをローカル変数 x へ代入 クラスのインスタンスを生成すると、新しく生成されたクラスインスタンスに対して自動的に __init__() を呼び出す。 「インスタンスオブジェクトが理解できる唯一の操作は、属性の参照です。 有効な属性の名前には二種類(データ属性およびメソッド)あります。 」 「クラス・オブジェクトでは2種類の演算: 属性参照とインスタンス生成をサポートしています」 「メソッドについて特別なこととして、オブジェクトが関数の第 1 引数として渡される」 「__spam (先頭に二個以上の下線文字、末尾に高々一個の下線文字) という形式の識別子は _classname__spam へと置換される」
構造体
slots を使うと ruby の struct のようなことができる。
とはいってもイコール演算でプロパティの値を比較してくれるわけではない。。
>>> class Hoge(object): ... __slots__ = ('a', 'b') ... >>> o = Hoge() >>> o.a = True >>> o.b = False >>> p = Hoge() >>> p.a = True >>> p.b = False >>> o == p False >>> o == o True
namedtuple はイコール演算子で比較できるが、プロパティの値を更新できない。
>>> from collections import namedtuple >>> Foo = namedtuple('Foo', 'a b') >>> o2 = Foo(True, False) >>> p2 = Foo(True, False) >>> o2 == p2 True >>> q2 = Foo(True, True) >>> o2 == q2 False >>> o2.a True >>> o2.b False >>> o2.b = True Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can't set attribute
外部プログラムとのインタフェース
シェルスクリプト的に使う
os.system() が使える。
from os import * system("platex nishimoto.tex")
Logger
ruby の Logger クラス http://www.ruby-lang.org/ja/man/html/logger.html のようなことをするには?
logging.Logger でログファイルを簡単に扱える。
ファイル操作
glob や shutil が使える。
ruby の FileUtils.mkdir_p のようなものを探したら見つけた
http://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python
import os import errno def mkdir_p(path): try: os.makedirs(path) except OSError as exc: if exc.errno == errno.EEXIST: pass else: raise exc
- os.path.exists() で調べて os.mkdir() する方がお行儀がよい。。
ディレクトリのファイルを別のディレクトリに移す。
import glob import shutil shutil.rmtree('logs') mkdir_p('logs') for f in glob.glob("out\\*.logs"): shutil.move(f, "logs")
PATH文字列
- os.pathsep は PATH 環境変数のセパレータ
- Windows では ;
- os.sep はファイルパス文字列のセパレータ
- Windows では \
find 的な操作
since 2011-11-10
カレントディレクトリの下を探して、ファイル名の末尾が ~1~ ~2~ などであるものを見つけて、(os.remove の行が有効の場合)削除する。
import os, re for root, dirs, files in os.walk('.'): for f in files: if re.match(".+~\d~", f): s = root + os.sep + f print s # os.remove(s)
ファイル入出力
文字コード変換をするファイルコピー
since 2011-12-20
def convert_file(src_file, src_enc, dest_file, dest_enc): with open(src_file) as sf: with open(dest_file, "w") as df: while 1: s = sf.readline() if not s: break df.write(s.decode(src_enc).encode(dest_enc))
オブジェクトの永続化
pickleを使う http://python.g.hatena.ne.jp/muscovyduck/20080820/p1
<html> <hr> <div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311442X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51PD65oIzgL._SL160_.jpg" alt="Pythonチュートリアル 第2版" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311442X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Pythonチュートリアル 第2版</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/487311442X/r4wh-22/ref=nosim/" title="Pythonチュートリアル 第2版" target="_blank">amazlet</a> at 10.10.24</div></div><div class="amazlet-detail">Guido van Rossum <br />オライリージャパン <br />売り上げランキング: 89762<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-review" style="margin-top:10px; margin-bottom:10px"><div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-3-0.gif" alt="3.0" /></div><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-3-0.gif" alt="3" /> 気軽に読めるのは良いが、説明不足感はある<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311442X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div> </html>
<html> <hr> <div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51wSTTIQtgL._SL160_.jpg" alt="エキスパートPythonプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">エキスパートPythonプログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4048686291/r4wh-22/ref=nosim/" title="エキスパートPythonプログラミング" target="_blank">amazlet</a> at 10.10.24</div></div><div class="amazlet-detail">Tarek Ziade <br />アスキー・メディアワークス <br />売り上げランキング: 10775<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-review" style="margin-top:10px; margin-bottom:10px"><div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5.0" /></div><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> Pythonハッカーになるために必要な事を網羅的に紹介した本<br /></div><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048686291/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div> </html>
<html> <hr> <div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798032948/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41bZDMzzeTL._SL160_.jpg" alt="Pythonプロフェッショナルプログラミング" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798032948/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Pythonプロフェッショナルプログラミング</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798032948/r4wh-22/ref=nosim/" title="Pythonプロフェッショナルプログラミング" target="_blank">amazlet</a> at 12.05.13</div></div><div class="amazlet-detail">ビープラウド <br />秀和システム <br />売り上げランキング: 13666<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798032948/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div> </html>