[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#menu(howto/MenuBar)
* howto/python [#i439c96a]
#contents
** コメント [#ffd23d8f]
- "Fortran, C ユーザに向けた実践的 Python プログラミング"...
-- 基本、NumPy, SciPy, MPI並列, ライブラリ(.so等)内の関数...
- pythonでは i++はできないので、i+=1 -- &new{2021-08-26 ...
- numpy.linspace(0,10,5) # 0と10を含む5要素のリスト -- ...
- デコレータ(@hogehoge) https://qiita.com/mtb_beta/item...
(例)
from functools import wraps
def trace( func ):
@wraps( func ) # 問題を起こさないように、wrapsでメ...
def wrapper( *args, **kwargs ):
result = func( *args, **kwargs )
print( f"{func.__name__}( {args}, {kwargs} ) -> ...
return result
return wrapper
@trace
def fib( n ):
"""return fibonacci number"""
if n in ( 0, 1 ):
return n
return fib(n-2) + fib(n-1)
#fib = trace(fib)
#trace(fib)(4)
print( fib(4) )
help( fib )
print( fib )
- アインシュタインの和の規則みたいなものをする numpy.eins...
- assert( 条件式 ) が使える -- &new{2021-09-08 (水) 17:...
- pythonのオブジェクト解説 https://postd.cc/pythons-objec...
- try、Tkinter、浅いコピー、簡易テキストエディタ作成、Num...
-- プログラミング演習 Python 2019 (喜多 一) https://repos...
-- プログラミング演習 Python 2019(コラム編) (同) https://...
- イテレータからイテレータを呼んでいる例 -- &new{2021-09...
def myg( itarg ):
for i in [ 0, 1, 2, 3, 4 ]:
try:
yield str(i)+"+"+next(itarg)
except StopIteration:
print( "STOP in myg" )
break
except:
print( "OTHER" )
def myf():
for i in [ "a", "b", "c", "d"+"e" ]:
yield i
it = myg( myf() )
for i in range(0,10):
try:
o = next( it )
print( o )
except StopIteration:
print( "STOP" )
break
except:
print( "OTHER" )
- del インスタンス #インスタンスを削除する -- &new{2021...
- a[0][:,0] と a[0][:][0] は違う結果になるようだ。 -- &n...
- ブロードキャスト: たとえば、サイズの異なる配列間の演算...
- numpyにloadtxtというのがあり、列ごとにコンバーター conv...
- クラスについての説明と名前空間の話し(python.org) https:...
(例)
#import copy
class Warehouse:
purpose = 'storage'
region = 'west'
tricks = [ 'init' ] #全てのインスタンスで共有され...
#オブジェクトのポインタが代入...
#名前空間と関係するようだが、...
#tricks = copy.deepcopy( [ 'init' ] ) #オブジェクト...
#self.tricks = [ 'init' ] #文法エラー
def add_trick( self, t ): self.tricks.append( t )
def initialize( self ):
self.purpose = 'storage'
self.regaion = 'west'
self.tricks = [ 'init' ]
self.__init__()
def __init__( self ):
self.floor = '2F'
w1=Warehouse()
w2=Warehouse()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init'])
-> ('storage', 'west', '2F', ['init'])
w2.region = 'east'; w2.floor = '5F'; w2.add_trick( "play...
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init', 'play'])
-> ('storage', 'east', '5F', ['init', 'play'])
w2.initialize()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
w1.initialize()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init', 'play'])
-> ('storage', 'east', '2F', ['init'])
-> ('storage', 'west', '2F', ['init'])
-> ('storage', 'east', '2F', ['init'])
- goto文の代用 -- &new{2022-06-28 (火) 11:12:12};
-- https://note.nkmk.me/python-break-nested-loops/
-- [[https://www.web-dev-qa-db-ja.com/ja/python/pythonに...
- print(*map(lambda x: '"{}"'.format(x), '日月火水木金土'...
- (memo)Visual Studio Code -- &new{2022-06-29 (水) 17:...
-- https://qiita.com/kusanoiskuzuno/items/c323446f2707f99...
-- https://code.visualstudio.com/#alt-downloads
-- https://code.visualstudio.com/docs/supporting/requirem...
-- https://qiita.com/IntenF/items/dbfe1bef4568719a0133
- 字句/構文解析ライブラリ https://qiita.com/shinsa82/ite...
- scikit-learnライブラリ https://utokyo-ipp.github.io/7/7...
- 数値が整数か小数かを判定 https://note.nkmk.me/python-ch...
- a is None #変数aがNoneであればTrueを与える -- &new{20...
- numpy、配列の比較 https://nishidy.hatenablog.com/entry/...
- Pythonプログラミング入門 https://utokyo-ipp.github.io/ ...
- gnuplotの呼び出し -- &new{2022-09-08 (木) 18:22:14};
>>>>import subprocess
>>> p=subprocess.Popen( ['gnuplot' ], bufsize=0, stdin=s...
#bufsize=0 で、下で p.stdin.flush() は不要になる。
#stdout=None, stderr=None(デフォルト)のときは、サブ...
>>> a=input()
plot tan(x)
>>> p.stdin.write( a.encode() ); p.stdin.write( "\n".enc...
>>> a=input()
quit
>>> p.stdin.write( a.encode() ); p.stdin.write( "\n".enc...
その他のメモ
>>> subprocess.call( [ 'gnuplot' ] ) #gnuplotのプロン...
>>> subprocess.call( [ 'gnuplot', "-e", "plot sin(x); pa...
#スクリプトの実行など(scriptNのファイルの中は print "...
#- の標準入力のときには gnuplotのプロンプトが来る。
- https://repo.anaconda.com/ -- &new{2022-11-09 (水) 11:...
- PyQt4 https://myenigma.hatenablog.com/entry/2016/01/24/...
- tkinter https://myenigma.hatenablog.com/entry/2017/09/1...
- Qt Desinger https://showa-yojyo.github.io/notebook/pyth...
- PyQt5 https://ops.jig-saw.com/tech-cate/pyqt_graph (ウ...
- たぶん再掲(pythonによるParaViewの操作) -- &new{2022-...
-- https://www.opencae.or.jp/wp-content/uploads/2015/06/c...
-- https://ss1.xrea.com/penguinitis.g1.xrea.com/study/Par...
-- https://www.rccm.co.jp/icem/pukiwiki/?%E6%93%8D%E4%BD%...
- PyQt5, Quick Guide https://www.tutorialspoint.com/pyqt5...
- PyQt5など -- &new{2022-11-22 (火) 12:38:44};
-- https://qiita.com/montblanc18/items/0188ff680acf028d4b63
-- https://www.sejuku.net/blog/75467
-- https://www.xsim.info/articles/PySide/how-to-layout.html
-- https://www.naka-sys.okinawa/python-pyqt-gui-devlop/
-- https://myenigma.hatenablog.com/entry/2016/01/24/113413
-- https://zetcode.com/gui/pyqt5/
-- https://www.riverbankcomputing.com/static/Docs/PyQt5/ ...
-- https://github.com/diego0020/tutorial-vtk-pyqt (VTKと...
- from apackage import * を使用したとき、パッケージの__in...
- hoge.pyをfrom hoge import * することもできる。 -- &new...
- matplotlibのAPI説明など https://matplotlib.org/stable/a...
- Tcl/Tk の Python インタフェース https://docs.python.org...
- os.listdir().sort() のオブジェクトには、iterateのメソッ...
- subprocess.runの例 -- &new{2023-04-01 (土) 17:27:11};
a = "input-data-hogehoge"
r = subprocess.run( "cat", shell=True, input=a.encode(),...
print( "a=", a )
print( "stdout=", r.stdout.decode() )
print( "stderr=", r.stderr.decode() )
- emacsでリージョンのインデントを変更する -- &new{2023-0...
C-c < M-x python-indent-shift-left インデント変更
C-c > M-x python-indent-shift-right インデント変更
- jupyter notebookでinteractiveにグラフを変更する -- &ne...
import numpy, matplotlib.pyplot, ipywidgets, math
@ipywidgets.interact( m=(-20,20,1) ) #min,max,step
def f(m=2.0):
x=numpy.linspace(-10,10)
y=numpy.power(x,m)
#print(x)
#print(y)
#matplotlib.pyplot.xlim(-10,10)
matplotlib.pyplot.plot(x,y)
- その他interactiveの例
-- https://ebi-works.com/jupyternb-gui/
-- https://toyoki-lab.ee.yamanashi.ac.jp/~toyoki/lectures...
- 実例つき、QWidget 逆引きリファレンス https://tadosuke.c...
- https://ja.wikipedia.org/wiki/PyQt -- &new{2023-07-21 ...
- https://riverbankcomputing.com/software/pyqt/ から-> "P...
- QWidgetを継承した画面開発のテンプレート https://tech.nk...
- フーリエ変換の例 -- &new{2023-08-03 (木) 17:09:18};
import cmath
N = 8
x = []
for k in range(0,N):
x.append( 1/cmath.sqrt(N) ) #区間[0,1]をN等分して、...
y = [] #フーリエ変換
for k in range(0,N):
a = 0.0
for j in range(0,N):
a = a + 1/cmath.sqrt(N)*x[j]*cmath.exp( 1J*2*cm...
y.append( a )
print( "FT" )
a = 0.0; b = 0.0
for k in range(0,N):
print( "{: >5d} {: >20.4f} {: >20.4f}".format( k, x[...
a = a + cmath.polar( x[k] )[0] **2
b = b + cmath.polar( y[k] )[0] **2
print( "power = {: >15.4f} {: >15.4f}".format(a, b) )
x = [] #逆フーリエ変換
for j in range(0,N):
a = 0.0
for k in range(0,N):
a = a + 1/cmath.sqrt(N)*y[k]*cmath.exp( -1J*2*c...
x.append( a )
print( "Inverse FT" )
for k in range(0,N):
print( "{: >5d} {: >20.4f} {: >20.4f}".format( k, x[...
- Python3簡易資料 https://blackknight.ics.nara-wu.ac.jp/p...
- openしたときのストリームインスタンスの型とreadlineメソ...
python仮想環境で
(py3913) allium$ python3
>>> f=open("hoge.vti","r") #"rt"と同じでテキストモード...
>>> type(f)
<class '_io.TextIOWrapper'>
>>> type(f.buffer)
<class '_io.BufferedReader'>
>>> f.encoding #encoding属性を持つ(_io.BufferedReader...
'UTF-8'
>>> f=open("hoge.vti","rb") #バイナリモード読込
>>> type(f)
<class '_io.BufferedReader'>
同じく仮想環境で、
(py3913) allium$ python -m pydoc _io.TextIOWrapper
(py3913) allium$ python -m pydoc _io.BufferedReader
により f.readline() と f.buffer.readline()のドキュメント...
_io.TextIOWrapper の readline
Read until newline or EOF.
Returns an empty string if EOF is hit immediately.
_io.BufferedReader の readline
Read and return a line from the stream.
If size is specified, at most size bytes will be read.
The line terminator is always b'\n' for binary files; f...
files, the newlines argument to open can be used to sel...
terminator(s) recognized.
- 色空間変換パッケージ https://pypi.org/project/colorspac...
- バイトコンパイル・コンパイル -- &new{2024-04-04 (木) 1...
バイトコンパイル
$ python3 -m compileall *.py
__pycache__に.pycが作られる。
マシンコードにコンパイルすることもできるようであるが、
通常のpythonで使える文法の範囲が極端に狭まってしまうよう...
- ver 3.7未満でファイルの先頭で if sys.version_info < ( 3...
- f-stringsを使えないバージョンのpythonで、バージョンが古...
# check python version
dummy_f_string = f"PLEASE USE PYTHON 3.7 OR LATER if you...
import sys
if sys.version_info < ( 3, 7 ) :
sys.exit( "ERROR: python -v < 3.7" )
- ネットワーク(ノードとエッジ図)のインタラクティブな可視...
- p=1e+14; print( f'{p: >+12.2g}') #f文字列と書式の例(.f...
- disモジュール(逆アセンブルの結果を見る) https://qiita...
- べき乗は**を使う 2.73*10**2 #mathematicaは 2.73*^2 -- ...
- Pythonでは、プログラムを起動したディレクトリが自動的にP...
#comment
//-------------------------------------------------------...
** ドキュメント [#dca7f077]
- Python標準ドキュメント http://www.python.jp/
(メニューのドキュメントに和訳ドキュメントがある。全モジ...
- Python早見帳 https://chokkan.github.io/python/index.htm...
- 特殊メソッドの一覧 https://qiita.com/y518gaku/items/079...
( __add__ が + 演算子であるなど)
- pydoc オンラインヘルプ
python -m pydoc -n `hostname` -p 8801 #その後 webブラ...
python -m pydoc sys
- ヘルプ関係の関数など
dir( hoge ) #オブジェクトの属性を調べる。引数無しだと、...
help( hoge ) #オブジェクトのドキュメントを調べる(ドキュ...
type( hoge ) # オブジェクトの型を知る。
# type, function, methodなどが返ってきたら...
type( hoge ).mro() # 何のクラスのインスタンスかが出るよ...
hoge.dtype #numpy.ndarray型のオブジェクトであるhogeの要...
-- 例
>>> b=open( "hogehoge.readme", "r" )
>>> c=b.read(16); print(c); b.close() #readで16文字読...
>>> help( b.read ) #説明
-- オブジェクトがどのクラスインスタンスであるかであるか知...
a = Hoge() # クラスHogeのインスタンスとして、オブジェク...
type(a) == Hoge # aがクラスHogeのインスタンスの場合、真...
isinstance( a, Hoge ) # aが、クラスHoge又は Hogeを継承...
・https://www.lifewithpython.com/2014/06/python-check-obj...
・https://docs.python.org/ja/3.7/library/inspect.html # i...
-- オブジェクトがどのクラスインスタンスであるかであるか知...
from pyscf import gto, scf
mol=gto.M( atom='H 0 0 0; H 0 0 1.4', basis='sto-3g' )
mf=scf.RHF( mol )
mf.kernel()
type( gto ) # moduleと返るので、モジュール
type( scf ) # moduleと返る
gto.__file__ # moduleがどのファイル(ディレクトリ階層と_...
type( gto.M ) # functionと返るので、関数
# def Mの定義は、ディレクトリ階層内や__in...
type( mol ) # pyscf.gto.mole.Moleと返るので、その...
type( mol ).mro() # 何のクラスのインスタンスかが出るよ...
=> [pyscf.gto.mole.Mole, pyscf.lib.misc.StreamObject, ob...
#type( gto.mole.Mole ) # typeと返り、クラスらしい(イン...
type( scf.RHF ) # functionと返るので、関数
type( scf.RHF ).mro()
=> [function, object]
type( mf ) # pyscf.scf.hf.RHFと返るので、このクラス...
type(mf).mro()
=> [pyscf.scf.hf.RHF, pyscf.scf.hf.SCF, pyscf.lib.misc.S...
type( mf.kernel ) # methodと返るので、クラスメソッド
type( mf.kernel ).mro()
=> [method, object]
** 命名の慣例 [#iac36e1f]
2022/06/26+α
pythonでの命名の慣例
* 先頭に _ をつけたものは外部から書き換え禁止。
* 先頭に __ をつけたものはアクセス禁止。
* 関数名は すべて小文字でスネークケース(単語をつなげる...
* 変数は すべて小文字でスネークケース。
* クラス名は アッパーキャメルケース(大文字から始め、単...
クラスのメソッドの第1引数は selfにする
* 定数は すべて大文字でスネークケース。
* 破棄変数として _ 名のみの変数がある。eg) for _ in rang...
* 名前の末尾 _ は名前衝突を避けるために使用される(末尾 ...
* 名前の先頭と末尾 __...__ はpythonが特別な用途として使...
* パッケージ名は すべて小文字の短い名前で _ は使わない。
なお、パッケージ名はディレクトリ名やファイル名に対応し...
eg) import tkinter の tkinter
eg) import turtle の turtle
* モジュール名は すべて小文字の短い名前で _ を使ってもよ...
なお、モジュール名は拡張子を除いたファイル名に対応して...
eg) import tkinter.font の font
[ref]~
https://qiita.com/shiracamus/items/bc3bdfc206b39e0a75b2 ~
https://mako-note.com/ja/python-underscore/ ~
https://python.softmoco.com/basics/python-naming-conventi...
** tkinerモジュール [#xd2790e9]
(注) python2は Tkinter、python3は tkinterを importするよ...
%%お気楽 Python/Tkinter 入門%%
%% http://www.geocities.jp/m_hiroi/light/pytk01.html %%
1. Hello world!
http://www.shido.info/py/tkinter1.html
PythonのTkinterを使ってみる
https://qiita.com/nnahito/items/ad1428a30738b3d93762
** 実行時間を測る、sleepする [#l5cdfcc5]
>>> import time
>>> time1 = time.clock()
>>> time2 = time.clock()
>>> print( time2 - time1 )
0.0009600000000000164
>>>
>>> help( time ) #ドキュメントをみる
>>> time1 = time.clock(); time.sleep(10); time2 = time.c...
4.599999999999049e-05
time.clock()は3.8?から廃止されているので time.time()を...
sleepを使う。import time しておいて、time.sleep(2)など
** いくつかの例 [#r7174bd4]
インタプリタ起動
$ python #たいていpython2が起動するらしい
$ DISPLAY=hostname:0 python3 -B #python3を起動、バイト...
$ export PYTHONDONTWRITEBYTECODE=t #これでもバイトコン...
スクリプトの実行
$ DISPLAY=hoge:0 python3 -B filename.py #filename.pyを...
$ DISPLAY=hoge:0 ./filename.py #filename.pyを...
いくつかの例
>>> from turtle import *
>>> for i in range(6): #図形が表示される
... forward(100)
... right(60)
...
>>> a = "Python3 is awsome!"
>>> a . lower()
'python3 is awsome!'
>>> len(a)
18
>>> (1+2J)/5J
(0.4-0.2j)
>>> for item in [ 'a', 'b', 'c' ]:
... print( item )
...
a
b
c
>>> for c, item in enumerate( [ 'a', 'b', 'c' ] ):
... print( c, item )
...
0 a
1 b
2 c
>>> f=open("temp.txt", "w")
>>> for c in range(1,101): #1から100までの数字をファ...
... f.write( str(c) )
...
>>> f.close()
>>> [ord(s) for s in "Python"] #内包記法で文字コード...
[80, 121, 116, 104, 111, 110]
>>> val=10; [ x for x in range(1,val+1) if val %x == 0 ]...
[1, 2, 5, 10]
#二次元配列を作る
>>> a = [ [ str(i)+str(j) for j in range(8)] for i in r...
>>> a
[['00', '01', '02', '03', '04', '05', '06', '07'], ['10'...
['20', '21', '22', '23', '24', '25', '26', '27'], ['30',...
['40', '41', '42', '43', '44', '45', '46', '47']]
>>> a[4][5]
'45'
>>> int(a[4][5])
45
>>> for i in range(5):
... a[i]
...
['00', '01', '02', '03', '04', '05', '06', '07']
['10', '11', '12', '13', '14', '15', '16', '17']
['20', '21', '22', '23', '24', '25', '26', '27']
['30', '31', '32', '33', '34', '35', '36', '37']
['40', '41', '42', '43', '44', '45', '46', '47']
>>> i = { "GMT" : "+000", "BST" : "+100", "EET" : "+200"...
>>> i
{'BST': '+100', 'EET': '+200', 'JST': '+900', 'GMT': '+0...
>>> i.items()
dict_items([('BST', '+100'), ('EET', '+200'), ('JST', '+...
### dict_items( ) が付く意味はなに? 辞書型インスタンス...
>>> import os
>>> os.walk("./")
>>> i=os.walk("./")
>>> next(i)
('./', ['QCLObot', 'ProteinDF_bridge', 'ProteinDF', 'Pro...
['2dn2.pdb', '1omb-mod.pdb', 'LOG_kiku.tar', 'p3.py~', '...
>>> next(i)
('./QCLObot', ['.git', 'qclobot', 'scripts'], ['.gitigno...
### 現在作業中のディレクトリ、作業中ディレクトリ内のディ...
### ファイルのタプルがイテレータ(next(i))で次々と得られ...
>>> from decimal import Decimal
>>> Decimal( '0.1' ) * 3
Decimal('0.3')
### この*はDecimalクラスの特殊メソッド __mul__が使われて...
### __mul__が引数3で動いている。演算結果は __repr__で表...
>>> import sys
>>> sys.getfilesystemencoding()
'utf-8'
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024...
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-...
mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rou...
スクリプトの例
--------------------------------------------------
#!/usr/bin/env python3 ...
#-*- coding:utf-8; -*- ...
import sys
def spamfactory( times ):
""" スパム工場 ...
"""
return "Spam ! " * times
print( spamfactory( 3 ) )
input()
--------------------------------------------------
$ ./p3.py
--------------------------------------------------
#!/usr/bin/env python3 ...
#-*- coding:utf-8; -*- ...
import os
#p= "./LOG_kiku" ...
p= "./"
for path, dirs, files in os.walk( p ):
for f in files:
print( path, ":", f )
--------------------------------------------------
$ ./p4.py
みんなのPython 第3版, 柴田亨, SBクリエイティブ (2012) ...
ファイルはここちら
[[todoapp.tar>https://orange.eit.hirosaki-u.ac.jp/pw151/i...
#正規表現を使ったファイル一覧の取得
>>> import glob
>>> print glob.glob('/dev/sd?')
['/dev/sda', '/dev/sdb']
その他、個々に置換するとき
>>> import re
>>> [ re.replace('/dev/','') for s in glob.glob('/dev/sd...
['sda', 'sdb']
** 基本 [#w45c8860]
*** 組み込みデータ型 [#f93ebd39]
整数
浮動小数点
複素数
文字列
リスト [ 1, 2, 3 ]
タプル ( 1, 2, 3 ) 要素ひとつの場合は ( 1, )とする...
ディクショナリ { k1:v1, k2:v2, k3:v3 }
bytes型
bool型
set型 { 1, 2, 3 }
iter イテレート可能なインスタンスに変換する
備考:
順番があるものが、シーケンス型。
書き換えが可能なものが、書き換え可能型。
書き換え可能でない型は、文字列、タプル(ただし要素追加は...
関数の引数は、関数で値を書き換えても、呼び出し元では変わ...
可能なものもある(例:リストを渡して、リストの要素を書き...
*** 型変換 [#gef482c7]
int() 文字列を数値に変換
float()
str()
chr() 数値を文字(列)に変換
hext 数値を16進数に変換
bin 数値を2進数に変換
oct 数値を8進数に変換
*** スライス [#l89629d3]
リストのインスタンスaについて、a[2:3]などとして要素を取...
*** lambda式 [#m7fbdaf6]
see Python文法詳細、p197、オライリー
*** 整数除算(商) [#g9b1a36a]
i // 2
(iは整数だけでなく、浮動点小数でも切り捨て)
*** 文字列操作 [#m496fcb7]
raw文字列 r"C:\path\to\file"
split
join
*** アンパック代入 [#kdbd609b]
a, b = c, d #スワップ
return a, b
a, b = foo(hoge)
x = ( 1, 2, 3, 4, 5 )
a, *b, c = x #最初と最後を a, cに、それ以外を bに代入
print( f"{a}, {b}, {c}" )
*** リストのアンパック [#yb0c4c62]
L=[1, 2, 3]
*L # 1, 2, 3 の並び(リストではない)
(使用例)
def foo( a, b, c ):
hogehoge
foo( *L )
*** 可変長引数 [#k0a08017]
*args タプル
**kwargs ディクショナリ
def a( *args, **kwargs ):
print( "*args=", *args )
#print( "**kwargs=", **kwargs ) # **kwargsは何?
#print( type(**kwargs) )
print( "args=", args )
print( "*kwargs=", *kwargs )
print( "kwargs=", kwargs )
### kwargs.pop( "hoge", default ) で値を得ることもで...
a( 'zero', 1, 2, 3, term='TERM', val='VAL' )
(出力結果)
*args= zero 1 2 3
args= ('zero', 1, 2, 3)
*kwargs= term val
kwargs= {'term': 'TERM', 'val': 'VAL'}
https://note.nkmk.me/python-args-kwargs-usage/
*** ゲッターとセッター(プロパティ) [#s2f31a23]
x = property( getx, setx ) # xはアトリビュート、getx, s...
# こうしておくと、インスタン...
例(以下をprop.pyとして保存して、コメントにあるようにpyth...
class Prop:
_val = None
def __init__( self, arg=10.0 ):
self._val = arg
def getvv( self ):
print( "In get, return _val/3.0" )
return self._val / 3.0
def setvv( self, arg ):
print( "In set, set arg*3.0 to _val" )
self._val = arg * 3.0
# Prop().val で Prop().getvv() が動いたり(getter)、
# Prop().val=arg で Prop().setvv(arg) が動いたり(set...
val = property( getvv, setvv )
# val = property( getvv )
# val = property( None, setvv )
def show( self ):
print( "In show, _val of Prop object is ", self....
class PropAt:
_val = None
def __init__( self, arg=10.0 ):
self._val = arg
@property # Prop().vv で次の Prop().vv()が動く
def vv( self ):
print( "In get, return _val/3.0" )
return self._val / 3.0
@vv.setter # Prop().vv=arg で次の Prop().vv(arg)が...
# setterはpropertyのあとに定義しなくては...
# また、propertyとsetterとで同じメソッド...
def vv( self, arg ):
print( "In set, set arg*3.0 to _val" )
self._val = arg * 3.0
def show( self ):
print( "In show, _val of Prop object is ", self....
"""
import prop
import importlib
importlib.reload( prop ) #デバッグ用:prop.pyを修正して...
# propertyを使った場合
a=prop.Prop() ; a.show() ; a.val = 100 ; a.val ; a.show()
# In show, _val of Prop object is 10.0
# In set, set arg*3.0 to _val
# In get, return _val/3.0
# 100.0
# In show, _val of Prop object is 300.0
#100を入れて100を取り出しているように見えるが、
#実際は100*3の値を保持しているインスタンスである。
# @propertyを使った場合
a=prop.PropAt() ; a.show() ; a.vv = 100 ; a.vv ; a.show()
# In show, _val of Prop object is 10.0
# In set, set arg*3.0 to _val
# In get, return _val/3.0
# 100.0
# In show, _val of Prop object is 300.0
"""
[ref]~
https://www.nblog09.com/w/2019/01/09/python-setter-getter...
https://chaika.hatenablog.com/entry/2020/12/10/083000
*** 標準エラー出力に書き出す [#rcbe37c6]
print( "hoge", file=sys.stderr )
*** コメント [#zf4c11dc]
#comment1
'''
comment2a
'''
"""
comment2b
"""
//-------------------------------------------------------...
** python環境がらみの情報取得 [#p4a8886c]
- import sys; print( sys.version_info ); print( sys.versi...
- import os; os.environ['LD_LIBRARY_PATH'] #環境変数の値...
- import sys, pprint; pprint.pprint(sys.path) #パッケー...
- import sys, pprint; pprint.pprint(sys.modules) #読み込...
** import [#xacd9999]
モジュールの検索順
1)カレントディレクトリ
2)環境変数PYTHONPATH
3)標準ライブラリ
4)site-packages
import モジュール名
from モジュール名 import クラス名
他に、
from パッケージ名 import サブパッケージ名
from モジュール名 import 関数名
などいろいろある。
importは、グローバルでも、ローカルにでも可能である。
モジュールの再読み込み
import hoge が既に実行されていた場合、再度 import hoge ...
実行はされない。再度、実行する場合は reloadが必要。
なお、マニュアルをみると、完全に挙動が同じなるというわけ...
>>> import imp
>>> imp.reload( module ) #なお、import moduleが以前にな...
Python3.3まではimp.reload()
Python3.4以降はimportlib.reload()
#importlibの例
import importlib
importlib.reload( dispmodule ) #既にいちどimport dispmo...
https://docs.python.org/3/library/imp.html#imp.reload
import math
math.sin( 1.23 )
or
from math import sin
sin( 1.23 )
複素数の数学関数を利用するには import cmath をする
πは、import math ののち、math.pi
classはモジュールの中などに定義される。モジュールを impo...
#ファイルbook.py内のBookクラスを利用する例
from book import Book
class Blog ( Book )
or
import book
class Blog ( book.Book )
クラスの初期化メソッド __init__
ふつうは継承したクラスの初期化メソッドを super().__ini...
丸括弧で括るとインポートする複数のモジュールを複数行で書...
from math import ( sin,
cos, tan )
#なお、mathモジュール内の他の関数なども評価されるが、名...
同じパッケージを、異なる別名をつけてインポートできる
import hoge as alias1
import hoge as alias2
ここで __init__.pyは一回だけしか評価されない
** パッケージ [#x4e1986c]
ディレクトリ階層で束ねられたモジュールの集まり
** 関数の動的呼び出し [#wd9462a2]
モジュール mod11 の名前空間から、関数を実行するcallableの例
for i in dir( mod11 ):
print( "============================================...
if i[0:1] == "_":
print( "SKIP" )
else:
if callable( eval("mod11."+i) ):
print( "RUN" )
print( eval( "mod11."+i ) )
eval( "mod11."+i+"()" )
else:
print( "NOT-RUN" )
print( eval( "mod11."+i ) )
クラスメソッドを動的に呼び出したり、引数を渡したりする例
class Hoge:
def hoge( self, a ):
...
def meth( self ):
...
eval( "self.hoge" )( a )
...
のように、meth()の中で呼び出すメソッドを文字列演算等で決...
引数も渡すことができる。
なお、セキュリティ的に evalに渡す引数は、SQLインジェクシ...
注意する。
** 複素数の扱い [#rbf8b97c]
https://note.nkmk.me/python-complex/
** 例外処理 [#p035b324]
- 基本的なエラー一覧とその原因の確認方法 https://note.nkm...
- 例外処理(try, except, else, finally) https://note.nkm...
** globalとnonlocal [#na4e8769]
- 関数内でのグローバル変数の利用~
http://www.ops.dti.ne.jp/ironpython.beginner/global.html ~
関数内で、グローバル変数に代入したいとき、関数内でglobal...
さもないとエラーになるか、ローカル変数として扱われる。
- 違い
global hoge # hogeはモジュールスコープ(グローバルス...
nonlocal hoge # hogeは外側、無ければ、外側の外側、外側...
# であることを宣言。
# ただし、モジュールスコープのものである...
- 用語: クロージャ=外側のスコープの変数を参照して値を変...
** globalsとlocals [#t158b244]
それぞれグローバル変数、ローカル変数を表示する。追加も可。
>>> b=10
>>> def hoge():
... c=20
... print(globals())
... print(locals())
...
>>> globals()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
>>> locals()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
>>> hoge()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
{'c': 20}
>>> globals()['d']=30
>>> d
30
** exec [#jf5644ed]
ソースコードを実行する。他のファイルを読み込んで実行する...
デフォルトで変数は残らない。
関数内でexecにより定義された変数が、関数終了後に追加され...
なお、以下のコードをモジュールとして作り、importさせた場...
>>> import pprint
>>> def delf():
... global f
... try: del f
... except: pass #1行で書けない?
#G,Lに追加あり
>>> (lambda: exec('f=90', globals(),None ))(); pprin...
>>> (lambda: exec('f=90', locals(), globals()))(); pprin...
#G,Lに追加無し
>>> (lambda: exec('f=90', None, None ))(); pprin...
>>> (lambda: exec('f=90', globals(),locals() ))(); pprin...
>>> (lambda: exec('f=90', None, locals() ))(); pprin...
>>> (lambda: exec('f=90', locals(), locals() ))(); pprin...
execによりimportしても同じである。
>>> (lambda: exec('import time,pprint; pprint.pprint({"G...
pprint.pprint({'G':globals(),'L':locals()}) #timeは...
>>> (lambda: exec('import time,pprint; pprint.pprint({"G...
pprint.pprint({'G':globals(),'L':locals()}) #timeは...
globals, localsの挙動がいまいちよくわからないが、変数を追...
そうでなければデフォルトの動作でよい。
ParaViewのマクロは、importは追加されるが変数は追加無しで...
** yeild [#k1d8f154]
https://qiita.com/weedslayer/items/11de0f314ccbb70de812 ~
returnは関数がそのまま終了する。これに対して、yeildは返値...
続きから実行される。
返す値が無くなると、StopIteration例外が発生するようだ。
** printとformat [#n2d42994]
print( hogehoge, end='' ) #printで改行しない
end='\t' だと最後にtabが出力
sep=',' で複数出力する時のセパレータを指定
file=ファイルオブジェクト でファイルに出力
fo=open('file.txt', 'w')とし、file=fo とし、...
flush=True で、出力後にフラッシュ
https://note.nkmk.me/python-format-zero-hex/ ~
https://note.nkmk.me/python-numpy-set-printoptions-float-...
'フォーマット指定の文字列'.format( arg1, arg2, ... ) #...
'{: >+6,}'.format(+123) #例
formatを使わなくても、
f'...{argN: >+6,}...' のようにして、同様の文字列を作るこ...
以上は、print関数と一緒に使う必要は無い。
{} のところが argNになる
{ や } をそのまま出力する場合には {{ や }} とする
: の次が空白だと、余った部分が空白で埋められる。
+ で正の数でも符号を表示、
>6 は6文字以下(6文字以上あるとはみ出して表示)
, で3桁ずつ,を付ける
{:10x} で10桁の16進数表示
{: >+12.2f} で12文字以下で、小数点以下が2桁で表示
{: >+12.2e} で同様に指数表現(小数点以下2桁で指数表現)
{: >+12.2g} で有効数字2桁で表示
例)
print('{: >+6,}'.format(+1234567))
print('{:10x}'.format(+1234567))
print('{: >+12.2f}'.format(+1234567))
print('{: >+12.2e}'.format(+1234567))
print('{: >+12.2g}'.format(+1234567))
+1,234,567
12d687
+1234567.00
+1.23e+06
+1.2e+06
numpyのndarray型のデータをフォーマット指定する場合
numpy.set_printoptions( formatter={ 'complex_kind' : '...
でcomplex128型のデータのndarrayのオブジェクトを出力を...
[ +0.2967-0.4617j +0.2967-0.4617j]
などとなる
__str__メソッドを定義すると、print(インスタンス)で__str_...
例)
class MC:
def __init__(self,v):
self.value = v
def __str__(self):
return f"MC instance, value = {self.value}"
print( MC(42) )
MC instance, value = 42
//-------------------------------------------------------...
** クラス変数 [#z81ab08f]
class Hoge:
dumm = None #クラス変数
def __init__( self )
self.junk = None #ただのインタンス
obj1 = Hoge(); obj1.junk = 1
obj2 = Hoge(); obj2.junk = 2
obj3 = Hoge(); obj3.junk = 3
Hoge.dumm = 56789
print( Hoge.dumm )
print( obj3.junk )
//-------------------------------------------------------...
** その他 [#p1bc6d4f]
*** インデントのタブとスペース [#u5078b6f]
同じスコープのインデントに、タブとスペースが混ざっていた...
どちらかに統一する。
*** 全角スペースは \u3000 である [#e50b412e]
a="abc\u3000def"
b=open( "hoge.txt", "w" ); print(a,file=b); b.close()
*** 文字の置き換え [#t32318a4]
"AB789CDあEいFG".translate( "".maketrans("あいABC","ai01...
これは echo "AB789CDあEいFG" | tr "あいABC" "ai012" のよ...
ただし trは日本語不可。
*** 文字列内のパタンを検索 [#i300b42b]
パタンに一致した場合、その部分を示すre.Matchのオブジェク...
reMatchのオブジェクトは、group()によって文字列を受け取れ...
パタンに一致が無かったらNoneを返す。
>>> import re
>>> a=re.search( "\d{4}", "ab12345cd5678ef" )
>>> a
<re.Match object; span=(2, 6), match='1234'>
>>> a.group() #a=Noneのときは None.group()はエラーになる
'1234'
#1行で、エラー込みで、一致した文字列を受け取る(もっと...
x=re.search( "\d{8}", "ab12345cd5678ef" ); x = x.group()...
https://note.nkmk.me/python-re-match-object-span-group/
*** リストと辞書とsorted [#ecbcce6f]
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> dict(d)
{'A': '5', 'B': '9', 'D': '1', 'C': '2', 'E': '3'}
#キーが同じものはひとつのみになる。おそらく最後の要素の...
>>> dict(d).items()
dict_items([('A', '5'), ('B', '9'), ('D', '1'), ('C', '2...
#辞書をタプルのリストにしたようなものを与える。see help(...
>>> sorted(dict(d)) #キーのみ並び替えたリストを与える
['A', 'B', 'C', 'D', 'E']
>>> sorted(dict(d).items()) #(キー,値)の並び替えたリス...
[('A', '5'), ('B', '9'), ('C', '2'), ('D', '1'), ('E', '...
*** リストとsort [#a8e126d8]
(注意)
リストのメッソドsortは データを書き換える。
組み込み関数のsortedは 新しいリストを生成して与え、元の...
sortは安定な並び替えである。sortedは安定化は不明(helpに...
sortとsortedの違い https://note.nkmk.me/python-list-sort-...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: x[1], reverse=True)
>>> d
[('B', '9'), ('A', '5'), ('B', '4'), ('E', '3'), ('C', '...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: x[0], reverse=True)
>>> d
[('E', '3'), ('D', '1'), ('C', '2'), ('B', '4'), ('B', '...
途中にprint文を挟めた例(なお、stderrに出力させないとキ...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: (print(x, x[1], file=sys.stderr...
('A', '5') 5
('B', '4') 4
('D', '1') 1
('C', '2') 2
('E', '3') 3
('B', '9') 9
>>> d
[('B', '9'), ('A', '5'), ('B', '4'), ('E', '3'), ('C', '...
*** リスト、辞書の整形出力 [#e1df08f7]
import pprint
pprint.pprint( list_val, widhth=160 )
https://note.nkmk.me/python-pprint-pretty-print/
*** ファイルをseek [#z9f1b5c5]
先頭にする例
fp.seek(0,0) # offset=0, referencepoint=0 でファイル位...
*** 比較演算の組み合わせ [#pa46333c]
w = 3
2 <= w and w <= 8
2 <= w <= 8 #上記と同じ
*** zip [#k45c029a]
x = ( 1, 2, 3, 4, 5 )
y = ( 10, 20, 30, 40, 50 )
for i, j in zip( x, y ):
print( i, j )
*** 辞書のループ [#j14014dd]
z = {'a': 1, 'b': 2, 'c':3 }
for key, val in z.items():
print( key, val )
for k in z.keys():
print( k )
for v in z.values():
print( v )
//-------------------------------------------------------...
** Excelのワークブックの読み書き [#qaa96a7d]
import openpyxl
wb=openpyxl.load_workbook("testbook.xlsx", data_only=True)
wksheet=wb["Sheet1"]
for i in wksheet.iter_rows(min_row=2):
print( "i=", i, "i[0].row=", i[0].row )
# 各行のループ変数 iは、excelのセルを要素とするタプルが...
# i[0], i[1], ..., i[p], ... は左からp番目のセルである。
# i[p].rowはそのセルがexcelのシートで何行目かの番号であ...
wb = openpyxl.load_workbook( 'sample.xlsx') #ワークブッ...
wb = openpyxl.Workbook() #新規ワークブック生成、
wb.sheetnames #シート名のリスト(新規の場合、シート...
wb.active #現在選択されているシート(新規の場合...
st = wb.active #現在選択されているシート
st.title = 'Sheet100' #シート名変更
st2 = wb[ st.title ] #シートの取得
True if id(st) == id(st2) else False #Trueが返るのでst...
st2[ "D2" ] = "d-2 cell contents" #セルに代入
st2.merge_cells( "D3:f4" ) #セルを結合
st2[ "D3" ] = "combined d-3 cell contents"
st2[ "D3" ].alignment = openpyxl.styles.alignment\
.Alignment( vertical="center" ) ...
wb.save( "wb-temp.xlsx" ) #ワークブックの保存
https://gammasoft.jp/support/how-to-use-openpyxl-for-exce...
https://atmarkit.itmedia.co.jp/ait/articles/2202/08/news0...
https://note.nkmk.me/python-openpyxl-usage/
** csvファイルを読む [#sfe13c9f]
#csvのフォーマットは生成するソフトに依存しているため注意...
#csv.readerで大丈夫らしい。
import csv
fp=open( "testbook.csv", encoding='utf-8-sig' ) #BOM付...
list( csv.reader( fp ) )
または list(...) の代わりに
ite=csv.reader( fp ) #_csv.reader関数を返す(イテレータ...
#_csvはモジュールらしい。_csvは im...
#してみると、.soの共有ライブラリの...
#help(_csv); type(_csv); type(_csv...
for r in ite: #rはcsvの各行のリスト
for c in r: #各行について、cは列の項目
print( c, end=' / ', file=sys.stdout )
print( file=sys.stdout )
(注) openするとき、BOMがある場合は必ず encoding='utf-8-si...
さもないと、読み込んだ最初の項目の先頭に BOMを示す文字( "...
確か、Excelアプリで xlsxから csvを作ると BOM付きである。
BOMなしのファイルは encoding='utf-8-sig' でオープンしても...
https://qiita.com/msk02/items/c3a1c4a1e1ef94c37228 ~
https://www.lifewithpython.com/2017/10/python-detect-bom-...
- openのencoding
fp=open( "testbook.csv" ) #環境に依るが たいていデフォ...
fp=open( "testbook.csv", encoding='utf-8' ) #BOMな...
fp=open( "testbook.csv", encoding='utf-8-sig' ) #BOMつ...
- 他
#- - - - - - - - - - - - - - - - - - - - -
#ファイルdisp.py
def disp(ite):
fo=open( "disp-temp.txt", "w" ) #BOMなしで書き出し
for r in ite:
for c in r:
print( c, end=' / ', file=fo )
print( file=fo)
fo.close()
#- - - - - - - - - - - - - - - - - - - - -
を作っておいて
>>> import disp
>>> disp.disp( ite ) # iteは上のもの
のように使える。
//-------------------------------------------------------...
* パッケージとモジュールの構造(まとめ) [#t12fefe2]
** 説明の前提(用語、予備知識) [#a2bcf5c7]
次のディレクトリ階層を仮定して、以下を説明。
mytp
|-- __init__.py
|-- mod01.py
|-- mod02.py
`-- mysp1
|-- __init__.py
|-- mod11.py
`-- mod12.py
いま、mod01,02,11,12内に 関数func01,02,11,12があるとす...
また、インポートのために、mytpを含むディレクトリが PYTH...
- 用語:
パッケージ = ディレクトリ, 例 mytp
サブパッケージ = サブディレクトリ, 例 mysp1
モジュール = ファイル, 例 mod01.pyなど
オブジェクト = モジュール、関数、などなど
オブジェクト名は、名前空間でもあり、名前空間には名前空間(...
最初に pythonが実行している名前空間は __main__ である。
(__main__で import hoge すると __main__内に hogeの名前空...
__main__.hoge のような記述はできないようで、暗黙的に __ma...
名前空間に登録されている名前は dir() で知ることができる。
__name__ # 現在の名前空間
dir( [オブジェクト名] ) # オブジェクト名(名前空間)に登...
# 名前空間名など)のリスト。
//----------------------------
** (トップレベルの) パッケージのインポート [#m67d209d]
import mytp # mytp/__init__.pyがあれば実行される。
# 現在の名前空間に mytpが追加されるが、mytp...
# mytpの名前空間もほぼ空のままであり mytp.m...
- モジュールや、モジュール内のオブジェクトのインポート
import mytp.mod01 # 現在の名前空間にmytpが追加され、m...
# mod01モジュールの関数などが使用で...
mytp.mod01.func01()
from mytp import mod01 # mytpディレクトリの mod01が、現...
# mod01モジュールの関数などが使...
mod01.func01()
from mytp.mod01 import func01 # mytpディレクトリのmod01...
# そのままで func01を使用...
# 追記:func01がモジュールスコー...
#よって defされている関数であって...
func01()
- mytp/__init__.py を用意すると次のようなことができる
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
print( "* __name__ = ", __name__ ) # このパッケージ名...
# __main__で import mytp としただけで mytp.mod01.func0...
from mytp import mod01 # mytpの名前空間に mod01が追加...
from mytp import mod02 # mytpの名前空間に mod01が追加...
#このファイル ( 名前空間 mytp ) では mod01.func01() が...
mod01.func01()
# 関数は名前空間 mytp に登録されるため、 mytp.initmytp...
def initmypt():
print( "initmypt" )
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
//----------------------------
** サブパッケージのインポート [#a1e00469]
import mytp.mysp1 # mytp/__init__.pyがあれば実行...
# 現在の名前空間に mytpが追加さ...
# mytp/mysp1/__init__.pyがあれ...
# mytp名前空間に mysp1が追加さ...
# mytp.mysp1.mod11などは使用で...
from mytp import mysp1 # mytp/__init__.pyがあれば実行...
# mytp/mysp1/__init__.pyがあれ...
# 現在の名前空間に mysp1が追加...
# mysp1.mod11などは使用できない...
- モジュール、モジュール内のオブジェクトのインポート
import mytp.mysp1.mod11 # mytp/__init__.pyがあれば実...
# mytp/mysp1/__init__.pyがあ...
# 現在の名前空間にmytpが追加...
# mysp1の名前空間に mod11が追...
# mod11モジュールの関数などが...
mytp.mysp1.mod11.func11()
from mytp.mysp1 import mod11 # mytp/__init__.pyがあれば...
# mytp/mysp1/__init__.pyが...
# mytp/mysp1ディレクトリの...
# mod11モジュールの関数な...
mod11.func11()
from mytp.mysp1.mod11 import func11 # mytp/mysp1ディレ...
# そのままで func11...
func11()
- mytp/mysp1/__init__.py を用意すると次のようなことができる
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
print( "* __name__ = ", __name__ ) # このパッケージ名...
# __main__で import mytp としてもこのサブパッケージは...
# import mytp.mysp1 とすると mytp.mysp1.mod11.func11()...
from mytp.mysp1 import mod11 # mytp.mysp1の名前空間に...
from mytp.mysp1 import mod12 # mytp.mysp1の名前空間に...
# __main__で from mytp import mysp1 とすると mysp1 が...
# が使用できるようになる。
#このファイル ( 名前空間 mytp.mysp1 ) では mod11.func1...
mod11.func11()
# 関数は名前空間 mytp.mysp1 に登録されるため、 mytp.my...
def initmysp1():
print( "initmysp1" )
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
//----------------------------
** (__main__などからの) パッケージ、サブパッケージの使い...
1) myptや mytp.mysp1をインポートして、mytpからfunc11を指...
- 指定が長いが、把握しやすい。
- 混乱しないのであれば asを併用するとよい。
import mypt
mypt.mod01.func01()
import mytp.mysp1
mytp.mysp1.mod11.func11()
import mytp.mysp1 as subn
subn.mod11.func11()
2) mod01や mod11, mysp1をインポートして、mod01や mod11, m...
- 名前衝突が起こる。
- 把握しにくく、混乱しやすい。
from mytp import mod01
mod01.func01()
from mytp.mysp1 import mod11
mod11.func11()
from mytp import mysp1
mysp1.mod11.func11()
//----------------------------
** その他 __main__.pyなど [#l0c9f01a]
python -m モジュール名 で、モジュールを読み込み。そのモ...
__main__.pyを実行する(無ければエラー)。
__init__.pyがあれば事前に実行される。
python -m bcone で bcone/__main__.pyを実行させるのがめん...
alias bcone='python -m bcone' するとよいだろう。
また、__main__.pyで他のファイルを実行したい時は、import b...
とするとよいでしょう(この場合は bcone/main.pyが実行)。
setup.cfg :~
パッケージインストールに関するひとつのファイルである。
中の entry_pointで /usr/bin内に置くコマンドと、そのコマン...
パッケージ内のpython関数を指定することができるらしい。
~
setup.py :~
似たようなもの。setuptoolsをimportして使われるようだ。
python -c 'import hoge; hoge.func()' などコードを-cオプシ...
インデントエラーになる。'...'の文字列を改行込みでタイプし...
//----------------------------
//-------------------------------------------------------...
* matplotlibモジュール [#v875f700]
- グラフを描く
-- matplotlib 線・マーカー種類など [[URL>https://science-...
-- https://qiita.com/nkay/items/d1eb91e33b9d6469ef51
- 3Dグラフを描く
-- https://techacademy.jp/magazine/29976
-- https://dreamer-uma.com/python-3d-graph/
-- https://qiita.com/orange_u/items/8a1e285a45093857aef7
//-------------------------------------------------------...
* numpy, scipyのドキュメント [#ud5a2b2a]
- Numpy and Scipy Documentation https://docs.scipy.org/doc/
-- SciPy search the docs? https://docs.scipy.org/doc/scip...
-- SciPy search the docs(正しいURL)? https://docs.scipy.o...
-- NumPy search the docs https://numpy.org/doc/stable/
//-------------------------------------------------------...
* scipyモジュール [#n9aeaedb]
** scipy.integrate.RK45クラスの説明 [#cc1f236f]
https://docs.scipy.org/doc/scipy/reference/generated/scip...
import scipy.integrate; help(scipy.integrate.RK45) も同じ...
c.f. help(scipy.integrate.solve_ivp)
http://www.physics.okayama-u.ac.jp/~otsuki/lecture/CompPh...
//https://www.fixes.pub/program/465196.html ~
RK45は5次のルンゲクッタ法を使用して、4次のルンゲクッタ法...
また、マニュアル help(solve_ivp) によると、RK45は複素数も...
ただし、初期値が実数であっても、複素数のデータ型で与える...
//-------------------------------------------------------...
* numpyモジュール [#x0b905c7]
** ndarray型と matrix型 [#t6f1099c]
以下は 二次元配列の ndarray型
( type(a)でインスタンスの型を調べられる。また、下の floa...
a=numpy.zeros( (2,2) ) # 2行2列のfloat64のゼロで初期化...
# a.dtypeは float64
a=numpy.array( [[1,2],[3,4]] ) # 組み込みリスト型から、...
# a.dtypeは int64, リス...
a=numpy.empty( (2,2) ) # 2行2列のfloat64の未初期化の二...
# a.dtypeは float64
a=numpy.array( [[1,2],[3,4]], dtype='complex128') # dty...
# ビ...
b=numpy.zeros_like( a, dtype='float64' ) # aと同じ配列...
b[:,:] = 1.2 #すべての要素を 1.2にする
b = b.astype( numpy.int64 ) #要素のdtypeをint64に変換す...
以下は matrix型(二次元配列に限定され、扱いはndarrayと同...
a=numpy.matrix( [[1,2],[3,4]] ) # 組み込みリスト型から...
# a.dtypeは int64, リ...
scipyモジュールは、matrixは使わずに、ndarrayを利用してい...
ndarrayで要素毎に型の違う配列を扱う事も出来るが、その場合...
行列の用意、初期化など https://note.nkmk.me/python-numpy-...
データ型の指定、など https://note.nkmk.me/python-numpy-dt...
numpy.ndarray型 https://note.nkmk.me/python-list-array-nu...
二次元配列と行列の演算など https://note.nkmk.me/python-nu...
** Python組み込み型変数のビット数を調べる [#v5ef60fe]
numpy.float_ #らしい。この例は floatについて調べている
** 2次元配列と行列 [#j37d6922]
ndarrayの要素・行などの参照 https://note.nkmk.me/python-n...
a=numpy.array( [[1,2],[3,4]] ) の2次元配列のとき
a[0,1] や a[0][1] は (0,1)要素
スライスで参照できる、代入もできる
a[0,:] は 0行目の1次元配列(次元がひとつ減る)
a[0:1,:] は 0行目からなる2次元配列
a[:,0] は 0列目からなる1次元配列(次元がひとつ減る)
a[:,0:1] は 0列目からなる2次元配列
a[:,0] = 9 #参照したすべての要素に 9を代入(右辺が配列...
次元がひとつ減る => スライスではなく、数字の指定で減る
2次元配列や1次元配列を使って行列演算ができる。
numpy.dot関数、 dotメソッド や @ メソッド、で掛算(matrix...
なお、2次元配列と1次元配列の掛算では、
1次元配列が、演算の左にある場合は行ベクトル、右にある場...
そして、1次元配列同士の掛算は内積になる。
dtype型の違う2次元配列(行列)の演算は、高いほうの型に変...
ブーリアンインデックスによる参照、代入も可
a[ :, (True,True,False,False) ]
ファンシーインデックスによる参照、代入も可
a[ :, (0,1) ] #参照する列の添え字を指定(重複可)、代...
a > 5 # 配列aの各要素が、条件に対して Trueか False...
a[ a > 5 ] # 5より大きい要素のみを指定して参照、代入も...
複数の次元で指定する場合は a[ numpy.ix_( (False,True,True...
ix_関数 を使わないと正しく指定できない。
また、
3次元以上の配列は、ひとつの次元で指定することしか出来な...
(※注) 配列がビューではなく、コピーで作られてしまっている...
** 多次元配列の次元を減らす [#ba905119]
多次元配列を1次元化する https://note.nkmk.me/python-nump...
多次元配列の次元を減らす https://codechacha.com/ja/python...
a=numpy.arange(12).reshape( (3, 4) ) # 0~11の要素をも...
a.reshape(-1) # 数字ひとつなので1次元配列。サイズ -1は...
a.ravel() #可能な限りビューを返す
a.flatten() #データはビューでは無く、必ずコピーされる
などなど
多次元配列の形状を変える https://note.nkmk.me/python-nump...
a=numpy.arange(12).reshape( (3,4) )
a.reshape( (4,3) ) # データはコピーされるが、データの1...
# サイズが切り直されるような形。
# 可能な限りビューが返る。
a.reshape( (4,3) ).copy() # 明示的にコピーを返したい場合
# 引数で、変換順序 order='C' (デフォルト) や 'F' などの...
# a.reshape( (4,3) ) をそのまま端末に出力した場合と、pri...
# order='C' や order='F' を指定した場合の挙動がよくわか...
配列の次元、サイズを調べる
a=numpy.arange(12).reshape( (3, 4) )
a.ndim
a.shape
** reshape関数の仕様を調べる [#nc1fe31b]
import numpy as np
type( a ) # aが numpy.ndarray のとき
help( np.ndarray ) # import numpy as np してると、typeで...
# reshapeメソッドの説明はあるが、nump...
help( np.reshape ) # 引数newsharpは、intか intのタプル...
** 注意(viewとcopyを参照) [#u24da219]
>>> import numpy
>>> a = numpy.array( [ 1.2, 2.3] )
>>> b = 2*a
>>> b
array([2.4, 4.6])
>>> a[0] = 7.7
>>> a
array([7.7, 2.3])
>>> b
array([2.4, 4.6])
>>> c=b
>>> c
array([2.4, 4.6])
>>> b[0]=9.8
>>> c
array([9.8, 4.6]) #ただの代入であればcも変化するので注意!
** ビュー(view)とコピー(copy) [#k5043c15]
https://note.nkmk.me/python-numpy-view-copy-shares-memory/
a.copy() #コピーを生成する
rcd = a.base is None #Trueなら、ビューである
- numpy.shares_memory( a, b ) #片方がもう一方のビューvie...
- 引数のデフォルトオブジェクトが共有されてしまう例
def d( default = {} ): # defaultの返値 {} が共有されて...
return default
av = d()
au = d()
av['FOO'] = 100; print( 'av=', av, ' au=', au)
av['BAR'] = 200; print( 'av=', av, ' au=', au)
def d( default = None ):
if default == None:
default = {} # 共有されない
return default
av = d()
au = d()
av['FOO'] = 100; print( 'av=', av, ' au=', au)
av['BAR'] = 200; print( 'av=', av, ' au=', au)
出力結果
av= {'FOO': 100} au= {'FOO': 100}
av= {'FOO': 100, 'BAR': 200} au= {'FOO': 100, 'BAR': 200}
av= {'FOO': 100} au= {}
av= {'FOO': 100, 'BAR': 200} au= {}
- pythonの代入等、基本は参照を渡すが、場合によって複製を...
- 深いコピー(deep copy)
import copy
hoho = copy.deepcopy( hoge ) #オブジェクトに含まれるオ...
単純に、複製である。
- 浅いコピー(shallow copy)
hoho = hoge #オブジェクトに含まれるオブジェクトについて...
オブジェクトにオブジェクトが含まれない場合には、深いコピ...
- 備考
オブジェクトのcopyメソッドが実際どのようなコピーをするか...
スライスした次元は、浅いコピーになると思われる。
https://note.nkmk.me/python-copy-deepcopy/
*** mutable(ミュータブル)とimmutable(イミュータブル) [#tb...
『オブジェクトによっては 値 を変更することが可能です。
値を変更できるオブジェクトのことを mutable と呼ぶ。
生成後に値を変更できないオブジェクトのことを immutable と...
(mutableなオブジェクトへの参照を格納している immutableな...
その格納しているオブジェクトの値が変化した時に変化するが...
格納しているのかが変化しないのであれば immutableです。
immutable かどうかは値が変更可能かどうかと無関係。)
オブジェクトが mutable かどうかはその型によって決まる』~
[ref] https://docs.python.org/ja/3/reference/datamodel.ht...
c.f.~
オブジェクトは、同一性(identity)、型、値をもつ。~
id() 関数は同一性を表す整数を返します。~
CPython では、id(x) は x が格納されているメモリ上のアドレ...
組み込みのデータ型のうち、list, set, dict型のみmutable。~
def print_id_obj( obj ):
print( 'id=', id(obj), ' obj=', obj )
a=1
b=a
print_id_obj(a)
print_id_obj(b)
print()
b=2
print_id_obj(a)
print_id_obj(b)
//
// #->
// #id= 94427975430944 obj= 1
// #id= 94427975430944 obj= 1
// #
// #id= 94427975430944 obj= 1
// #id= 94427975430976 obj= 2
//
// a=[1,2]
// b=a
// print_id_obj(a)
// print_id_obj(b)
// print()
// b[0]=3
// print_id_obj(a)
// print_id_obj(b)
// print()
// b=[4,5]
// print_id_obj(a)
// print_id_obj(b)
//
// #->
// #id= 47087150371464 obj= [1, 2]
// #id= 47087150371464 obj= [1, 2]
// #
// #id= 47087150371464 obj= [3, 2]
// #id= 47087150371464 obj= [3, 2]
// #
// #id= 47087150371464 obj= [3, 2]
// #id= 47087163414024 obj= [4, 5]
** numpy.stack, hstack, vstack [#jddcdb5f]
a = numpy.arange(4).reshape( (-1,) ) +100 #[100 101 102...
b = numpy.arange(4).reshape( (-1,) ) +200 #[200 201 202...
numpy.hstack( [a,b] ) # [100 101 102 103 200 201 202 20...
numpy.vstack( [a,b] ) # [[100 101 102 103]
# [200 201 202 203]] になる
numpy.stack( [a,b], axis=0 ) # hstackと同じ
numpy.stack( [a,b], axis=1 ) # [[100 200]
# [101 201]
# [102 202]
# [103 203]] になる
** numpy.meshgrid [#h7f8821f]
ax = numpy.linspace(0,4,5).astype(int) #[ 0 1 ...
ay = numpy.linspace(10,14,5).astype(int) #[ 10 11 ...
x, y = numpy.meshgrid( ax, ay )
# x
# [[ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]]
# y
# [[ 10 10 10 10 10]
# [ 11 11 11 11 11]
# [ 12 12 12 12 12]
# [ 13 13 13 13 13]
# [ 14 14 14 14 14]]
for j in range(4,0,-1):
for i in range(0,4,+1):
print( " {: >2d}-{: >2d}".format(x[j,i], y[j,i])...
print()
# 0-14 1-14 2-14 3-14
# 0-13 1-13 2-13 3-13
# 0-12 1-12 2-12 3-12
# 0-11 1-11 2-11 3-11
xx = x / 2.0
yy = y / 2.0
for j in range(4,0,-1):
for i in range(0,4,+1):
print( " {: >3.1f}-{: >3.1f}".format(xx[j,i], yy...
print()
# 0.0-7.0 0.5-7.0 1.0-7.0 1.5-7.0
# 0.0-6.5 0.5-6.5 1.0-6.5 1.5-6.5
# 0.0-6.0 0.5-6.0 1.0-6.0 1.5-6.0
# 0.0-5.5 0.5-5.5 1.0-5.5 1.5-5.5
** numpy.diff [#fcfc04b7]
a = np.arange(10).reshape( (-1,) ); b = a*a # b[i] ,...
c = numpy.diff( b, n=1 ) # c[i] = b[i+1] - b[i] , i=0~8
d = numpy.diff( c, n=1 ) # d[i] = c[i+1] - c[i] , i=0~7
numpy.diff( b, n=2 ) # d[i]と同じ(n回 diffを繰り返...
** numpy.where [#z9bb7370]
a = numpy.arange(10).reshape( (-1,) )
numpy.where( 5<a, 9.5, 0.5 ) # 配列aの要素が条件( 5< ...
numpy.where( 5<a ) # 条件を満たす要素だけの...
numpy.where( 5<a )[0] # 条件を満たす要素だけの...
//-------------------------------------------------------...
* mpi4pyモジュール [#g611561b]
MPIモジュールによる並列化
importすると、並列実行すると思われる。
comm = MPI.COMM_WORLD
//-------------------------------------------------------...
* anacondaなどによる環境作成 [#s41caa22]
** パッケージ(pythonやモジュール)のインストール方法の種類...
python自体のインストールと利用バージョン切替
- インストール
-- 各linuxディストリビューションのパッケージ
-- ソースからコンパイル
-- pyenv
-- anacondaの conda
-それぞれ利用するpythonのバージョン切り替え
-- OS側のコマンド
-- pyenv
-- conda
モジュール・パッケージのインストールと使用・不使用切替
-- pipや PyPI(パッケージ管理のみ)( python.orgによる説明...
-- venv(使用・不使用の環境切替のみ)
-- conda &color(RED){(注)conda環境で、pipは使えるが基本...
anacondaによる condaコマンドは、
+ 科学計算技術計算のモジュールが豊富(らしい)
+ condaによる環境切替ができる(pythonバージョンやモジュー...
そのため、モジュール間の依存バージョン、依存するpython自...
なお、"環境"は、実際には仮想ではないが "仮想環境"と呼ばれ...
** リンク [#u9fff003]
- 参考:パッケージやビルドによる環境
-- CentOS 環境のPython https://www.python.jp/install/cent...
- 参考:anaconda環境
-- Anacondaで仮想環境を作ってみる https://qiita.com/ozaki...
-- Anacondaを使った仮想環境を保存・再構築、複製 https://q...
-- condaとpip:混ぜるな危険 https://onoz000.hatenablog.co...
--- condaとpip:ver.2020 https://onoz000.hatenablog.com/en...
--- pip installとconda installの比較 https://chitose-nana...
-- Anacondaで仮想環境を作るときに役立つTips集 https://cpp...
-- Anacondaで仮想環境を作ってC++プログラミングをするまで ...
-- Conda コマンド https://www.python.jp/install/anaconda/...
-- パッケージによってはライブラリが必要になる
--- libm (glibc) インストール https://minecraft.server-me...
--- libffi インストール https://noknow.info/it/os/install...
https://qiita.com/rabi0102/items/8a749505c78ddc5e4a7d
- 参考:jupyter
-- notebook, lab, hub, lab-hubがある。
-- CentOS7にJupyter Notebookを導入 https://qiita.com/hiro...
-- CentOS7でJupyter Notebookを簡単インストール・設定 http...
-- リモートサーバでJupyter Notebookを実行する方法 https:/...
-- (ノードでの使用)Jupyter Notebookの利用 https://docs....
-- JupyterじゃなくてJupyterLabを勧めるN個の理由 https://q...
-- JupyterLab-Hubで快適な分析環境を共有しよう! https://qi...
-- 無償で使えるJupyter Notebookオンライン環境 https://www...
-- JupyterHubを複数ユーザーで使用するための環境構築方法 h...
-- Jupyter Notebookで分析結果を社内共有!! https://www.o...
-- UbuntuにAnacondaをインストールしてPythonとJupyter Note...
- その他
-- 並列計算のパッケージ ipyparallel https://github.com/ip...
-- ipythonの使い方 https://qiita.com/5t111111/items/7852e...
//-------------------------------------------------------...
* conda環境の利用方法 [#m726dded]
conda activate [環境名] #アクティベート(環境を設定)
conda deactivate #デアクティベート(環境を終了)
conda create -n 環境名 [python[=バージョン] [パッケージ...
conda remove -n 環境名 --all #環境の削除
(補足)
conda create -n hoge により、インストール場所の/share/ap...
や ~/.conda/envs にパッケージや環境が置かれるようだ。
例えば appbinユーザにより /share/apps/anaconda3に anacon...
シェルコマンド
eval "$(/share/apps/anaconda3/bin/conda shell.bash hoo...
により、appbinや他のユーザは conda環境を利用できる。
- appbinユーザにより作成された環境は /share/apps/anacond...
他のユーザも利用できる。
- 個人のユーザが環境を作った場合には ~/.conda/envs とも...
ファイルが置かれて、そのユーザが利用できる。
- conda create -p pathEnvName により、環境のファイルを置...
できるようにできる、らしい。(/share/apps/envsを指定する...
(補足2:パッケージの追加インストール)
各仮想環境へパッケージを追加インストールするには appbin...
(appbinアカウントによるインストールは、誰が入れたか不...
追加されたパッケージは、他のユーザも利用できるようにな...
(注1) 依存関係でパッケージのアップデートも必要に応じて...
既存の環境が変更を受ける。アップデートに伴い不具...
アップデートされたパッケージをすべてアンインスト...
ほぼ絶望的である。
環境を壊す危険が高い場合など、検証用にanaconda...
パッケージをアップデートするのが望ましい。
(注2) pipコマンドは /share/app/anaconda3のすべての既存...
pipを使用した仮想環境は、condaとpipのパッケージの...
不具合が出うる。
pipでインストールしたパッケージを pipでアンイン...
condaに存在していても利用できなくなるようだ。少な...
仮想環境への影響は今のところ無さそうである。2023/...
appbinグループを使用した追加方法は、
sgコマンドまたはnewgrpコマンドにより、所属グループをapp...
をする。手順は以下 1)-3) のいずれか
1) $ sg appbin bash
$ インストール作業
$ exit
2) $ sg appbin "インストールのためのコマンドライン" #...
3) $ newgrp appbin
$ インストール作業
$ exit
なお、所属グループをappbinに変更し忘れた場合は、
chown -R :appbin /share/apps/anaconda3 をすればよいよう...
(rootユーザが chown -R :appbin /share/apps/anaconda3 を...
仮想環境の追加作成のときは appbinアカウントを使用する。
環境は /share/apps/anaconda3/envsに、パッケージは /shar...
個人ユーザで conda create -n py36 python=3.6 などで仮想...
この場合、仮想環境は ~/.conda/envsに、パッケージは /sha...
そのためこの場合も作成時には appbinグループを使用するこ...
個人的にいろいろ試す場合は、個人環境に別途でanacondaを...
conda info #condaの情報
conda info -e #環境のリスト
conda -V #バージョン
conda -h #ヘルプ
conda config --help #コマンドconfigのヘルプ
anaconda search --help #コマンドsearchのヘルプ
conda create --help #コマンドcreateのヘルプ
conda search [-c チャネル] [--full-name] パッケージ名 #...
conda install パッケージ名[=バージョン] #現在の環境に...
conda uninstall パッケージ名 #現在の環境から、パッケー...
conda list [-n 環境名] #インストールさ...
デフォルト以外のチャンネル:
https://docs.conda.io/projects/conda/en/latest/user-guide...
//? condaが対応していないパッケージのインストールの場合
//? anaconda search -t conda パッケージ名 #パッケージが...
//? anaconda show パッケージ名 #チェネルURL...
// conda install -c チャネルURL パッケージ名
環境の保存や、それを使った環境作成
conda env export > ファイル名.yaml
conda env create -n 新しい環境名 -f ファイル名.yaml
or
デフォルトのチャネルだけなら
conda list --export > ファイル名.txt
conda create -n 新しい環境名 -f ファイル名.txt
conda clean --all #不要なパッケージやキャッシュを削除
conda create -n 新しい環境名 --clone もとの環境名 #環境...
conda remove -n もとの環境名 --all
conda config --set env_prompt "({default_env}) " #デフ...
conda config --set env_prompt "p:" #プロ...
conda config --set changeps1 false #プロンプトを変更し...
echo $CONDA_SHLVL #0以外でconda環境で...
conda config --set auto_activate_base false #conda環境...
標準的なパッケージをごっそり入れる?
conda create -n 新しい環境名 [python=バージョン] anaconda
アップデート
conda update -n base -c defaults conda #condaのupdate...
conda update conda;conda update anaconda;conda update -...
アンインストール
次のものを削除するようだ。
インストール先のanaconda3 ディレクトリ
~/.conda ディレクトリ
~/.condarc ファイル
~/.bashrcに追加された conda initialize のブロック
*** ハードリンク [#ce9ae41a]
- hoge1, hoge2, hoge3という共通のi-nodeをもつハードリンク...
いずれかのファイルを上書き変更すると、他のファイルもすべ...
(仮想環境で使われているファイルは、ハードリンクで共通に...
他の全ての仮想環境で意図しないファイルの変更が起こる。)
- emacsで例えば hoge3のファイルを変更・保存したとする。変...
もともとハードリンクされていたファイルは hoge3~になってい...
*** スクリプトを実行する時だけ conda activateする(通常は...
下記のようなスクリプトを mypyなどとして作っておき、mypy h...
#!/bin/bash --norc
#==== set your python env ====
MYPYTHON=py370
if [ $# == 0 ]; then
echo "usage: $0 command [args]" >&2
exit 1
fi
source /share/apps/anaconda3.bash_conda
conda activate $MYPYTHON
#==== execute command [args] ====
"$@"
//-------------------------------------------------------...
* 実行時の symbol lookup error や relocation error の対処...
pythonプログラムを実行したときに
symbol lookup error や relocation error が出た場合は、
[[LABO/Rocks]]のページの対処法を見よ。
//-------------------------------------------------------...
* 弘大JupyterHub [#t375c760]
- 弘前大学情報基盤システム(HIROINS) 教育研究事務業務支援...
-- ログイン https://jupyter01.hirosaki-u.ac.jp:8000/hub/l...
--- 裏で動いているCPUは Xeon Gold 5220R 2.20GHz (32コア,...
-- 実習室パソコンの情報 https://home.hirosaki-u.ac.jp/her...
//-------------------------------------------------------...
* Jupyter Notebook [#q450c36b]
** alliumのjupyter notebook [#m5ba35f1]
使用方法は [[LABO/Rocks#tdb7fe60]]を見よ。
** 長い出力部分の表示切替 [#qc798443]
- 長い出力は、スクロールバーが出て部分的に表示される。
-- 左部分をクリックすると、全て表示 ⇔ スクロールバーによ...
-- ダブルクリックすると、非表示になる(クリックで、全て表...
** 括弧などの入力補完(autoCloseBrackets)をオフにする [#y2...
from notebook.services.config import ConfigManager
c = ConfigManager()
c.update('notebook',
{"CodeCell": {"cm_config": {"autoCloseBrackets"...
を実行して、ノートブックを開きなおす。設定は ~/.jupyter/...
** ipynbをpyに変換する [#u91d1cb0]
jupyter nbconvert --to python hogehoge.ipynb #==> hoge...
** jupytextを使えるようにする(ipynbとpyの同期) [#mccae438]
デフォルト以外のチャンネル
https://docs.conda.io/projects/conda/en/latest/user-guide...
→ https://conda-forge.org/feedstock-outputs/ より conda-f...
jupytextを検索して https://github.com/conda-forge/jupytex...
$ conda activate py370
$ conda install jupytext --channel conda-forge
のようにパッケージをインストールする(/share/apps/anacond...
jupyter notebookを起動して hoge.ipynbファイルを開く→ファ...
→Pair Notebook with light Scriptにチェックを入れる。
これで hoge.ipynbと hoge.pyが同期される。
[ref] https://qiita.com/ku_a_i/items/ccdeb7f1d9384fb4767b
** マジックコマンド(%) [#wd5d9a96]
%matplotlib notebook
%matplotlib inline
%time
など
終了行:
#menu(howto/MenuBar)
* howto/python [#i439c96a]
#contents
** コメント [#ffd23d8f]
- "Fortran, C ユーザに向けた実践的 Python プログラミング"...
-- 基本、NumPy, SciPy, MPI並列, ライブラリ(.so等)内の関数...
- pythonでは i++はできないので、i+=1 -- &new{2021-08-26 ...
- numpy.linspace(0,10,5) # 0と10を含む5要素のリスト -- ...
- デコレータ(@hogehoge) https://qiita.com/mtb_beta/item...
(例)
from functools import wraps
def trace( func ):
@wraps( func ) # 問題を起こさないように、wrapsでメ...
def wrapper( *args, **kwargs ):
result = func( *args, **kwargs )
print( f"{func.__name__}( {args}, {kwargs} ) -> ...
return result
return wrapper
@trace
def fib( n ):
"""return fibonacci number"""
if n in ( 0, 1 ):
return n
return fib(n-2) + fib(n-1)
#fib = trace(fib)
#trace(fib)(4)
print( fib(4) )
help( fib )
print( fib )
- アインシュタインの和の規則みたいなものをする numpy.eins...
- assert( 条件式 ) が使える -- &new{2021-09-08 (水) 17:...
- pythonのオブジェクト解説 https://postd.cc/pythons-objec...
- try、Tkinter、浅いコピー、簡易テキストエディタ作成、Num...
-- プログラミング演習 Python 2019 (喜多 一) https://repos...
-- プログラミング演習 Python 2019(コラム編) (同) https://...
- イテレータからイテレータを呼んでいる例 -- &new{2021-09...
def myg( itarg ):
for i in [ 0, 1, 2, 3, 4 ]:
try:
yield str(i)+"+"+next(itarg)
except StopIteration:
print( "STOP in myg" )
break
except:
print( "OTHER" )
def myf():
for i in [ "a", "b", "c", "d"+"e" ]:
yield i
it = myg( myf() )
for i in range(0,10):
try:
o = next( it )
print( o )
except StopIteration:
print( "STOP" )
break
except:
print( "OTHER" )
- del インスタンス #インスタンスを削除する -- &new{2021...
- a[0][:,0] と a[0][:][0] は違う結果になるようだ。 -- &n...
- ブロードキャスト: たとえば、サイズの異なる配列間の演算...
- numpyにloadtxtというのがあり、列ごとにコンバーター conv...
- クラスについての説明と名前空間の話し(python.org) https:...
(例)
#import copy
class Warehouse:
purpose = 'storage'
region = 'west'
tricks = [ 'init' ] #全てのインスタンスで共有され...
#オブジェクトのポインタが代入...
#名前空間と関係するようだが、...
#tricks = copy.deepcopy( [ 'init' ] ) #オブジェクト...
#self.tricks = [ 'init' ] #文法エラー
def add_trick( self, t ): self.tricks.append( t )
def initialize( self ):
self.purpose = 'storage'
self.regaion = 'west'
self.tricks = [ 'init' ]
self.__init__()
def __init__( self ):
self.floor = '2F'
w1=Warehouse()
w2=Warehouse()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init'])
-> ('storage', 'west', '2F', ['init'])
w2.region = 'east'; w2.floor = '5F'; w2.add_trick( "play...
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init', 'play'])
-> ('storage', 'east', '5F', ['init', 'play'])
w2.initialize()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
w1.initialize()
print( (w1.purpose, w1.region, w1.floor, w1.tricks) )
print( (w2.purpose, w2.region, w2.floor, w2.tricks) )
-> ('storage', 'west', '2F', ['init', 'play'])
-> ('storage', 'east', '2F', ['init'])
-> ('storage', 'west', '2F', ['init'])
-> ('storage', 'east', '2F', ['init'])
- goto文の代用 -- &new{2022-06-28 (火) 11:12:12};
-- https://note.nkmk.me/python-break-nested-loops/
-- [[https://www.web-dev-qa-db-ja.com/ja/python/pythonに...
- print(*map(lambda x: '"{}"'.format(x), '日月火水木金土'...
- (memo)Visual Studio Code -- &new{2022-06-29 (水) 17:...
-- https://qiita.com/kusanoiskuzuno/items/c323446f2707f99...
-- https://code.visualstudio.com/#alt-downloads
-- https://code.visualstudio.com/docs/supporting/requirem...
-- https://qiita.com/IntenF/items/dbfe1bef4568719a0133
- 字句/構文解析ライブラリ https://qiita.com/shinsa82/ite...
- scikit-learnライブラリ https://utokyo-ipp.github.io/7/7...
- 数値が整数か小数かを判定 https://note.nkmk.me/python-ch...
- a is None #変数aがNoneであればTrueを与える -- &new{20...
- numpy、配列の比較 https://nishidy.hatenablog.com/entry/...
- Pythonプログラミング入門 https://utokyo-ipp.github.io/ ...
- gnuplotの呼び出し -- &new{2022-09-08 (木) 18:22:14};
>>>>import subprocess
>>> p=subprocess.Popen( ['gnuplot' ], bufsize=0, stdin=s...
#bufsize=0 で、下で p.stdin.flush() は不要になる。
#stdout=None, stderr=None(デフォルト)のときは、サブ...
>>> a=input()
plot tan(x)
>>> p.stdin.write( a.encode() ); p.stdin.write( "\n".enc...
>>> a=input()
quit
>>> p.stdin.write( a.encode() ); p.stdin.write( "\n".enc...
その他のメモ
>>> subprocess.call( [ 'gnuplot' ] ) #gnuplotのプロン...
>>> subprocess.call( [ 'gnuplot', "-e", "plot sin(x); pa...
#スクリプトの実行など(scriptNのファイルの中は print "...
#- の標準入力のときには gnuplotのプロンプトが来る。
- https://repo.anaconda.com/ -- &new{2022-11-09 (水) 11:...
- PyQt4 https://myenigma.hatenablog.com/entry/2016/01/24/...
- tkinter https://myenigma.hatenablog.com/entry/2017/09/1...
- Qt Desinger https://showa-yojyo.github.io/notebook/pyth...
- PyQt5 https://ops.jig-saw.com/tech-cate/pyqt_graph (ウ...
- たぶん再掲(pythonによるParaViewの操作) -- &new{2022-...
-- https://www.opencae.or.jp/wp-content/uploads/2015/06/c...
-- https://ss1.xrea.com/penguinitis.g1.xrea.com/study/Par...
-- https://www.rccm.co.jp/icem/pukiwiki/?%E6%93%8D%E4%BD%...
- PyQt5, Quick Guide https://www.tutorialspoint.com/pyqt5...
- PyQt5など -- &new{2022-11-22 (火) 12:38:44};
-- https://qiita.com/montblanc18/items/0188ff680acf028d4b63
-- https://www.sejuku.net/blog/75467
-- https://www.xsim.info/articles/PySide/how-to-layout.html
-- https://www.naka-sys.okinawa/python-pyqt-gui-devlop/
-- https://myenigma.hatenablog.com/entry/2016/01/24/113413
-- https://zetcode.com/gui/pyqt5/
-- https://www.riverbankcomputing.com/static/Docs/PyQt5/ ...
-- https://github.com/diego0020/tutorial-vtk-pyqt (VTKと...
- from apackage import * を使用したとき、パッケージの__in...
- hoge.pyをfrom hoge import * することもできる。 -- &new...
- matplotlibのAPI説明など https://matplotlib.org/stable/a...
- Tcl/Tk の Python インタフェース https://docs.python.org...
- os.listdir().sort() のオブジェクトには、iterateのメソッ...
- subprocess.runの例 -- &new{2023-04-01 (土) 17:27:11};
a = "input-data-hogehoge"
r = subprocess.run( "cat", shell=True, input=a.encode(),...
print( "a=", a )
print( "stdout=", r.stdout.decode() )
print( "stderr=", r.stderr.decode() )
- emacsでリージョンのインデントを変更する -- &new{2023-0...
C-c < M-x python-indent-shift-left インデント変更
C-c > M-x python-indent-shift-right インデント変更
- jupyter notebookでinteractiveにグラフを変更する -- &ne...
import numpy, matplotlib.pyplot, ipywidgets, math
@ipywidgets.interact( m=(-20,20,1) ) #min,max,step
def f(m=2.0):
x=numpy.linspace(-10,10)
y=numpy.power(x,m)
#print(x)
#print(y)
#matplotlib.pyplot.xlim(-10,10)
matplotlib.pyplot.plot(x,y)
- その他interactiveの例
-- https://ebi-works.com/jupyternb-gui/
-- https://toyoki-lab.ee.yamanashi.ac.jp/~toyoki/lectures...
- 実例つき、QWidget 逆引きリファレンス https://tadosuke.c...
- https://ja.wikipedia.org/wiki/PyQt -- &new{2023-07-21 ...
- https://riverbankcomputing.com/software/pyqt/ から-> "P...
- QWidgetを継承した画面開発のテンプレート https://tech.nk...
- フーリエ変換の例 -- &new{2023-08-03 (木) 17:09:18};
import cmath
N = 8
x = []
for k in range(0,N):
x.append( 1/cmath.sqrt(N) ) #区間[0,1]をN等分して、...
y = [] #フーリエ変換
for k in range(0,N):
a = 0.0
for j in range(0,N):
a = a + 1/cmath.sqrt(N)*x[j]*cmath.exp( 1J*2*cm...
y.append( a )
print( "FT" )
a = 0.0; b = 0.0
for k in range(0,N):
print( "{: >5d} {: >20.4f} {: >20.4f}".format( k, x[...
a = a + cmath.polar( x[k] )[0] **2
b = b + cmath.polar( y[k] )[0] **2
print( "power = {: >15.4f} {: >15.4f}".format(a, b) )
x = [] #逆フーリエ変換
for j in range(0,N):
a = 0.0
for k in range(0,N):
a = a + 1/cmath.sqrt(N)*y[k]*cmath.exp( -1J*2*c...
x.append( a )
print( "Inverse FT" )
for k in range(0,N):
print( "{: >5d} {: >20.4f} {: >20.4f}".format( k, x[...
- Python3簡易資料 https://blackknight.ics.nara-wu.ac.jp/p...
- openしたときのストリームインスタンスの型とreadlineメソ...
python仮想環境で
(py3913) allium$ python3
>>> f=open("hoge.vti","r") #"rt"と同じでテキストモード...
>>> type(f)
<class '_io.TextIOWrapper'>
>>> type(f.buffer)
<class '_io.BufferedReader'>
>>> f.encoding #encoding属性を持つ(_io.BufferedReader...
'UTF-8'
>>> f=open("hoge.vti","rb") #バイナリモード読込
>>> type(f)
<class '_io.BufferedReader'>
同じく仮想環境で、
(py3913) allium$ python -m pydoc _io.TextIOWrapper
(py3913) allium$ python -m pydoc _io.BufferedReader
により f.readline() と f.buffer.readline()のドキュメント...
_io.TextIOWrapper の readline
Read until newline or EOF.
Returns an empty string if EOF is hit immediately.
_io.BufferedReader の readline
Read and return a line from the stream.
If size is specified, at most size bytes will be read.
The line terminator is always b'\n' for binary files; f...
files, the newlines argument to open can be used to sel...
terminator(s) recognized.
- 色空間変換パッケージ https://pypi.org/project/colorspac...
- バイトコンパイル・コンパイル -- &new{2024-04-04 (木) 1...
バイトコンパイル
$ python3 -m compileall *.py
__pycache__に.pycが作られる。
マシンコードにコンパイルすることもできるようであるが、
通常のpythonで使える文法の範囲が極端に狭まってしまうよう...
- ver 3.7未満でファイルの先頭で if sys.version_info < ( 3...
- f-stringsを使えないバージョンのpythonで、バージョンが古...
# check python version
dummy_f_string = f"PLEASE USE PYTHON 3.7 OR LATER if you...
import sys
if sys.version_info < ( 3, 7 ) :
sys.exit( "ERROR: python -v < 3.7" )
- ネットワーク(ノードとエッジ図)のインタラクティブな可視...
- p=1e+14; print( f'{p: >+12.2g}') #f文字列と書式の例(.f...
- disモジュール(逆アセンブルの結果を見る) https://qiita...
- べき乗は**を使う 2.73*10**2 #mathematicaは 2.73*^2 -- ...
- Pythonでは、プログラムを起動したディレクトリが自動的にP...
#comment
//-------------------------------------------------------...
** ドキュメント [#dca7f077]
- Python標準ドキュメント http://www.python.jp/
(メニューのドキュメントに和訳ドキュメントがある。全モジ...
- Python早見帳 https://chokkan.github.io/python/index.htm...
- 特殊メソッドの一覧 https://qiita.com/y518gaku/items/079...
( __add__ が + 演算子であるなど)
- pydoc オンラインヘルプ
python -m pydoc -n `hostname` -p 8801 #その後 webブラ...
python -m pydoc sys
- ヘルプ関係の関数など
dir( hoge ) #オブジェクトの属性を調べる。引数無しだと、...
help( hoge ) #オブジェクトのドキュメントを調べる(ドキュ...
type( hoge ) # オブジェクトの型を知る。
# type, function, methodなどが返ってきたら...
type( hoge ).mro() # 何のクラスのインスタンスかが出るよ...
hoge.dtype #numpy.ndarray型のオブジェクトであるhogeの要...
-- 例
>>> b=open( "hogehoge.readme", "r" )
>>> c=b.read(16); print(c); b.close() #readで16文字読...
>>> help( b.read ) #説明
-- オブジェクトがどのクラスインスタンスであるかであるか知...
a = Hoge() # クラスHogeのインスタンスとして、オブジェク...
type(a) == Hoge # aがクラスHogeのインスタンスの場合、真...
isinstance( a, Hoge ) # aが、クラスHoge又は Hogeを継承...
・https://www.lifewithpython.com/2014/06/python-check-obj...
・https://docs.python.org/ja/3.7/library/inspect.html # i...
-- オブジェクトがどのクラスインスタンスであるかであるか知...
from pyscf import gto, scf
mol=gto.M( atom='H 0 0 0; H 0 0 1.4', basis='sto-3g' )
mf=scf.RHF( mol )
mf.kernel()
type( gto ) # moduleと返るので、モジュール
type( scf ) # moduleと返る
gto.__file__ # moduleがどのファイル(ディレクトリ階層と_...
type( gto.M ) # functionと返るので、関数
# def Mの定義は、ディレクトリ階層内や__in...
type( mol ) # pyscf.gto.mole.Moleと返るので、その...
type( mol ).mro() # 何のクラスのインスタンスかが出るよ...
=> [pyscf.gto.mole.Mole, pyscf.lib.misc.StreamObject, ob...
#type( gto.mole.Mole ) # typeと返り、クラスらしい(イン...
type( scf.RHF ) # functionと返るので、関数
type( scf.RHF ).mro()
=> [function, object]
type( mf ) # pyscf.scf.hf.RHFと返るので、このクラス...
type(mf).mro()
=> [pyscf.scf.hf.RHF, pyscf.scf.hf.SCF, pyscf.lib.misc.S...
type( mf.kernel ) # methodと返るので、クラスメソッド
type( mf.kernel ).mro()
=> [method, object]
** 命名の慣例 [#iac36e1f]
2022/06/26+α
pythonでの命名の慣例
* 先頭に _ をつけたものは外部から書き換え禁止。
* 先頭に __ をつけたものはアクセス禁止。
* 関数名は すべて小文字でスネークケース(単語をつなげる...
* 変数は すべて小文字でスネークケース。
* クラス名は アッパーキャメルケース(大文字から始め、単...
クラスのメソッドの第1引数は selfにする
* 定数は すべて大文字でスネークケース。
* 破棄変数として _ 名のみの変数がある。eg) for _ in rang...
* 名前の末尾 _ は名前衝突を避けるために使用される(末尾 ...
* 名前の先頭と末尾 __...__ はpythonが特別な用途として使...
* パッケージ名は すべて小文字の短い名前で _ は使わない。
なお、パッケージ名はディレクトリ名やファイル名に対応し...
eg) import tkinter の tkinter
eg) import turtle の turtle
* モジュール名は すべて小文字の短い名前で _ を使ってもよ...
なお、モジュール名は拡張子を除いたファイル名に対応して...
eg) import tkinter.font の font
[ref]~
https://qiita.com/shiracamus/items/bc3bdfc206b39e0a75b2 ~
https://mako-note.com/ja/python-underscore/ ~
https://python.softmoco.com/basics/python-naming-conventi...
** tkinerモジュール [#xd2790e9]
(注) python2は Tkinter、python3は tkinterを importするよ...
%%お気楽 Python/Tkinter 入門%%
%% http://www.geocities.jp/m_hiroi/light/pytk01.html %%
1. Hello world!
http://www.shido.info/py/tkinter1.html
PythonのTkinterを使ってみる
https://qiita.com/nnahito/items/ad1428a30738b3d93762
** 実行時間を測る、sleepする [#l5cdfcc5]
>>> import time
>>> time1 = time.clock()
>>> time2 = time.clock()
>>> print( time2 - time1 )
0.0009600000000000164
>>>
>>> help( time ) #ドキュメントをみる
>>> time1 = time.clock(); time.sleep(10); time2 = time.c...
4.599999999999049e-05
time.clock()は3.8?から廃止されているので time.time()を...
sleepを使う。import time しておいて、time.sleep(2)など
** いくつかの例 [#r7174bd4]
インタプリタ起動
$ python #たいていpython2が起動するらしい
$ DISPLAY=hostname:0 python3 -B #python3を起動、バイト...
$ export PYTHONDONTWRITEBYTECODE=t #これでもバイトコン...
スクリプトの実行
$ DISPLAY=hoge:0 python3 -B filename.py #filename.pyを...
$ DISPLAY=hoge:0 ./filename.py #filename.pyを...
いくつかの例
>>> from turtle import *
>>> for i in range(6): #図形が表示される
... forward(100)
... right(60)
...
>>> a = "Python3 is awsome!"
>>> a . lower()
'python3 is awsome!'
>>> len(a)
18
>>> (1+2J)/5J
(0.4-0.2j)
>>> for item in [ 'a', 'b', 'c' ]:
... print( item )
...
a
b
c
>>> for c, item in enumerate( [ 'a', 'b', 'c' ] ):
... print( c, item )
...
0 a
1 b
2 c
>>> f=open("temp.txt", "w")
>>> for c in range(1,101): #1から100までの数字をファ...
... f.write( str(c) )
...
>>> f.close()
>>> [ord(s) for s in "Python"] #内包記法で文字コード...
[80, 121, 116, 104, 111, 110]
>>> val=10; [ x for x in range(1,val+1) if val %x == 0 ]...
[1, 2, 5, 10]
#二次元配列を作る
>>> a = [ [ str(i)+str(j) for j in range(8)] for i in r...
>>> a
[['00', '01', '02', '03', '04', '05', '06', '07'], ['10'...
['20', '21', '22', '23', '24', '25', '26', '27'], ['30',...
['40', '41', '42', '43', '44', '45', '46', '47']]
>>> a[4][5]
'45'
>>> int(a[4][5])
45
>>> for i in range(5):
... a[i]
...
['00', '01', '02', '03', '04', '05', '06', '07']
['10', '11', '12', '13', '14', '15', '16', '17']
['20', '21', '22', '23', '24', '25', '26', '27']
['30', '31', '32', '33', '34', '35', '36', '37']
['40', '41', '42', '43', '44', '45', '46', '47']
>>> i = { "GMT" : "+000", "BST" : "+100", "EET" : "+200"...
>>> i
{'BST': '+100', 'EET': '+200', 'JST': '+900', 'GMT': '+0...
>>> i.items()
dict_items([('BST', '+100'), ('EET', '+200'), ('JST', '+...
### dict_items( ) が付く意味はなに? 辞書型インスタンス...
>>> import os
>>> os.walk("./")
>>> i=os.walk("./")
>>> next(i)
('./', ['QCLObot', 'ProteinDF_bridge', 'ProteinDF', 'Pro...
['2dn2.pdb', '1omb-mod.pdb', 'LOG_kiku.tar', 'p3.py~', '...
>>> next(i)
('./QCLObot', ['.git', 'qclobot', 'scripts'], ['.gitigno...
### 現在作業中のディレクトリ、作業中ディレクトリ内のディ...
### ファイルのタプルがイテレータ(next(i))で次々と得られ...
>>> from decimal import Decimal
>>> Decimal( '0.1' ) * 3
Decimal('0.3')
### この*はDecimalクラスの特殊メソッド __mul__が使われて...
### __mul__が引数3で動いている。演算結果は __repr__で表...
>>> import sys
>>> sys.getfilesystemencoding()
'utf-8'
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024...
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-...
mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rou...
スクリプトの例
--------------------------------------------------
#!/usr/bin/env python3 ...
#-*- coding:utf-8; -*- ...
import sys
def spamfactory( times ):
""" スパム工場 ...
"""
return "Spam ! " * times
print( spamfactory( 3 ) )
input()
--------------------------------------------------
$ ./p3.py
--------------------------------------------------
#!/usr/bin/env python3 ...
#-*- coding:utf-8; -*- ...
import os
#p= "./LOG_kiku" ...
p= "./"
for path, dirs, files in os.walk( p ):
for f in files:
print( path, ":", f )
--------------------------------------------------
$ ./p4.py
みんなのPython 第3版, 柴田亨, SBクリエイティブ (2012) ...
ファイルはここちら
[[todoapp.tar>https://orange.eit.hirosaki-u.ac.jp/pw151/i...
#正規表現を使ったファイル一覧の取得
>>> import glob
>>> print glob.glob('/dev/sd?')
['/dev/sda', '/dev/sdb']
その他、個々に置換するとき
>>> import re
>>> [ re.replace('/dev/','') for s in glob.glob('/dev/sd...
['sda', 'sdb']
** 基本 [#w45c8860]
*** 組み込みデータ型 [#f93ebd39]
整数
浮動小数点
複素数
文字列
リスト [ 1, 2, 3 ]
タプル ( 1, 2, 3 ) 要素ひとつの場合は ( 1, )とする...
ディクショナリ { k1:v1, k2:v2, k3:v3 }
bytes型
bool型
set型 { 1, 2, 3 }
iter イテレート可能なインスタンスに変換する
備考:
順番があるものが、シーケンス型。
書き換えが可能なものが、書き換え可能型。
書き換え可能でない型は、文字列、タプル(ただし要素追加は...
関数の引数は、関数で値を書き換えても、呼び出し元では変わ...
可能なものもある(例:リストを渡して、リストの要素を書き...
*** 型変換 [#gef482c7]
int() 文字列を数値に変換
float()
str()
chr() 数値を文字(列)に変換
hext 数値を16進数に変換
bin 数値を2進数に変換
oct 数値を8進数に変換
*** スライス [#l89629d3]
リストのインスタンスaについて、a[2:3]などとして要素を取...
*** lambda式 [#m7fbdaf6]
see Python文法詳細、p197、オライリー
*** 整数除算(商) [#g9b1a36a]
i // 2
(iは整数だけでなく、浮動点小数でも切り捨て)
*** 文字列操作 [#m496fcb7]
raw文字列 r"C:\path\to\file"
split
join
*** アンパック代入 [#kdbd609b]
a, b = c, d #スワップ
return a, b
a, b = foo(hoge)
x = ( 1, 2, 3, 4, 5 )
a, *b, c = x #最初と最後を a, cに、それ以外を bに代入
print( f"{a}, {b}, {c}" )
*** リストのアンパック [#yb0c4c62]
L=[1, 2, 3]
*L # 1, 2, 3 の並び(リストではない)
(使用例)
def foo( a, b, c ):
hogehoge
foo( *L )
*** 可変長引数 [#k0a08017]
*args タプル
**kwargs ディクショナリ
def a( *args, **kwargs ):
print( "*args=", *args )
#print( "**kwargs=", **kwargs ) # **kwargsは何?
#print( type(**kwargs) )
print( "args=", args )
print( "*kwargs=", *kwargs )
print( "kwargs=", kwargs )
### kwargs.pop( "hoge", default ) で値を得ることもで...
a( 'zero', 1, 2, 3, term='TERM', val='VAL' )
(出力結果)
*args= zero 1 2 3
args= ('zero', 1, 2, 3)
*kwargs= term val
kwargs= {'term': 'TERM', 'val': 'VAL'}
https://note.nkmk.me/python-args-kwargs-usage/
*** ゲッターとセッター(プロパティ) [#s2f31a23]
x = property( getx, setx ) # xはアトリビュート、getx, s...
# こうしておくと、インスタン...
例(以下をprop.pyとして保存して、コメントにあるようにpyth...
class Prop:
_val = None
def __init__( self, arg=10.0 ):
self._val = arg
def getvv( self ):
print( "In get, return _val/3.0" )
return self._val / 3.0
def setvv( self, arg ):
print( "In set, set arg*3.0 to _val" )
self._val = arg * 3.0
# Prop().val で Prop().getvv() が動いたり(getter)、
# Prop().val=arg で Prop().setvv(arg) が動いたり(set...
val = property( getvv, setvv )
# val = property( getvv )
# val = property( None, setvv )
def show( self ):
print( "In show, _val of Prop object is ", self....
class PropAt:
_val = None
def __init__( self, arg=10.0 ):
self._val = arg
@property # Prop().vv で次の Prop().vv()が動く
def vv( self ):
print( "In get, return _val/3.0" )
return self._val / 3.0
@vv.setter # Prop().vv=arg で次の Prop().vv(arg)が...
# setterはpropertyのあとに定義しなくては...
# また、propertyとsetterとで同じメソッド...
def vv( self, arg ):
print( "In set, set arg*3.0 to _val" )
self._val = arg * 3.0
def show( self ):
print( "In show, _val of Prop object is ", self....
"""
import prop
import importlib
importlib.reload( prop ) #デバッグ用:prop.pyを修正して...
# propertyを使った場合
a=prop.Prop() ; a.show() ; a.val = 100 ; a.val ; a.show()
# In show, _val of Prop object is 10.0
# In set, set arg*3.0 to _val
# In get, return _val/3.0
# 100.0
# In show, _val of Prop object is 300.0
#100を入れて100を取り出しているように見えるが、
#実際は100*3の値を保持しているインスタンスである。
# @propertyを使った場合
a=prop.PropAt() ; a.show() ; a.vv = 100 ; a.vv ; a.show()
# In show, _val of Prop object is 10.0
# In set, set arg*3.0 to _val
# In get, return _val/3.0
# 100.0
# In show, _val of Prop object is 300.0
"""
[ref]~
https://www.nblog09.com/w/2019/01/09/python-setter-getter...
https://chaika.hatenablog.com/entry/2020/12/10/083000
*** 標準エラー出力に書き出す [#rcbe37c6]
print( "hoge", file=sys.stderr )
*** コメント [#zf4c11dc]
#comment1
'''
comment2a
'''
"""
comment2b
"""
//-------------------------------------------------------...
** python環境がらみの情報取得 [#p4a8886c]
- import sys; print( sys.version_info ); print( sys.versi...
- import os; os.environ['LD_LIBRARY_PATH'] #環境変数の値...
- import sys, pprint; pprint.pprint(sys.path) #パッケー...
- import sys, pprint; pprint.pprint(sys.modules) #読み込...
** import [#xacd9999]
モジュールの検索順
1)カレントディレクトリ
2)環境変数PYTHONPATH
3)標準ライブラリ
4)site-packages
import モジュール名
from モジュール名 import クラス名
他に、
from パッケージ名 import サブパッケージ名
from モジュール名 import 関数名
などいろいろある。
importは、グローバルでも、ローカルにでも可能である。
モジュールの再読み込み
import hoge が既に実行されていた場合、再度 import hoge ...
実行はされない。再度、実行する場合は reloadが必要。
なお、マニュアルをみると、完全に挙動が同じなるというわけ...
>>> import imp
>>> imp.reload( module ) #なお、import moduleが以前にな...
Python3.3まではimp.reload()
Python3.4以降はimportlib.reload()
#importlibの例
import importlib
importlib.reload( dispmodule ) #既にいちどimport dispmo...
https://docs.python.org/3/library/imp.html#imp.reload
import math
math.sin( 1.23 )
or
from math import sin
sin( 1.23 )
複素数の数学関数を利用するには import cmath をする
πは、import math ののち、math.pi
classはモジュールの中などに定義される。モジュールを impo...
#ファイルbook.py内のBookクラスを利用する例
from book import Book
class Blog ( Book )
or
import book
class Blog ( book.Book )
クラスの初期化メソッド __init__
ふつうは継承したクラスの初期化メソッドを super().__ini...
丸括弧で括るとインポートする複数のモジュールを複数行で書...
from math import ( sin,
cos, tan )
#なお、mathモジュール内の他の関数なども評価されるが、名...
同じパッケージを、異なる別名をつけてインポートできる
import hoge as alias1
import hoge as alias2
ここで __init__.pyは一回だけしか評価されない
** パッケージ [#x4e1986c]
ディレクトリ階層で束ねられたモジュールの集まり
** 関数の動的呼び出し [#wd9462a2]
モジュール mod11 の名前空間から、関数を実行するcallableの例
for i in dir( mod11 ):
print( "============================================...
if i[0:1] == "_":
print( "SKIP" )
else:
if callable( eval("mod11."+i) ):
print( "RUN" )
print( eval( "mod11."+i ) )
eval( "mod11."+i+"()" )
else:
print( "NOT-RUN" )
print( eval( "mod11."+i ) )
クラスメソッドを動的に呼び出したり、引数を渡したりする例
class Hoge:
def hoge( self, a ):
...
def meth( self ):
...
eval( "self.hoge" )( a )
...
のように、meth()の中で呼び出すメソッドを文字列演算等で決...
引数も渡すことができる。
なお、セキュリティ的に evalに渡す引数は、SQLインジェクシ...
注意する。
** 複素数の扱い [#rbf8b97c]
https://note.nkmk.me/python-complex/
** 例外処理 [#p035b324]
- 基本的なエラー一覧とその原因の確認方法 https://note.nkm...
- 例外処理(try, except, else, finally) https://note.nkm...
** globalとnonlocal [#na4e8769]
- 関数内でのグローバル変数の利用~
http://www.ops.dti.ne.jp/ironpython.beginner/global.html ~
関数内で、グローバル変数に代入したいとき、関数内でglobal...
さもないとエラーになるか、ローカル変数として扱われる。
- 違い
global hoge # hogeはモジュールスコープ(グローバルス...
nonlocal hoge # hogeは外側、無ければ、外側の外側、外側...
# であることを宣言。
# ただし、モジュールスコープのものである...
- 用語: クロージャ=外側のスコープの変数を参照して値を変...
** globalsとlocals [#t158b244]
それぞれグローバル変数、ローカル変数を表示する。追加も可。
>>> b=10
>>> def hoge():
... c=20
... print(globals())
... print(locals())
...
>>> globals()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
>>> locals()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
>>> hoge()
{ ..., 'b': 10, 'hoge': <function hoge at 0x2adffbbe5040>}
{'c': 20}
>>> globals()['d']=30
>>> d
30
** exec [#jf5644ed]
ソースコードを実行する。他のファイルを読み込んで実行する...
デフォルトで変数は残らない。
関数内でexecにより定義された変数が、関数終了後に追加され...
なお、以下のコードをモジュールとして作り、importさせた場...
>>> import pprint
>>> def delf():
... global f
... try: del f
... except: pass #1行で書けない?
#G,Lに追加あり
>>> (lambda: exec('f=90', globals(),None ))(); pprin...
>>> (lambda: exec('f=90', locals(), globals()))(); pprin...
#G,Lに追加無し
>>> (lambda: exec('f=90', None, None ))(); pprin...
>>> (lambda: exec('f=90', globals(),locals() ))(); pprin...
>>> (lambda: exec('f=90', None, locals() ))(); pprin...
>>> (lambda: exec('f=90', locals(), locals() ))(); pprin...
execによりimportしても同じである。
>>> (lambda: exec('import time,pprint; pprint.pprint({"G...
pprint.pprint({'G':globals(),'L':locals()}) #timeは...
>>> (lambda: exec('import time,pprint; pprint.pprint({"G...
pprint.pprint({'G':globals(),'L':locals()}) #timeは...
globals, localsの挙動がいまいちよくわからないが、変数を追...
そうでなければデフォルトの動作でよい。
ParaViewのマクロは、importは追加されるが変数は追加無しで...
** yeild [#k1d8f154]
https://qiita.com/weedslayer/items/11de0f314ccbb70de812 ~
returnは関数がそのまま終了する。これに対して、yeildは返値...
続きから実行される。
返す値が無くなると、StopIteration例外が発生するようだ。
** printとformat [#n2d42994]
print( hogehoge, end='' ) #printで改行しない
end='\t' だと最後にtabが出力
sep=',' で複数出力する時のセパレータを指定
file=ファイルオブジェクト でファイルに出力
fo=open('file.txt', 'w')とし、file=fo とし、...
flush=True で、出力後にフラッシュ
https://note.nkmk.me/python-format-zero-hex/ ~
https://note.nkmk.me/python-numpy-set-printoptions-float-...
'フォーマット指定の文字列'.format( arg1, arg2, ... ) #...
'{: >+6,}'.format(+123) #例
formatを使わなくても、
f'...{argN: >+6,}...' のようにして、同様の文字列を作るこ...
以上は、print関数と一緒に使う必要は無い。
{} のところが argNになる
{ や } をそのまま出力する場合には {{ や }} とする
: の次が空白だと、余った部分が空白で埋められる。
+ で正の数でも符号を表示、
>6 は6文字以下(6文字以上あるとはみ出して表示)
, で3桁ずつ,を付ける
{:10x} で10桁の16進数表示
{: >+12.2f} で12文字以下で、小数点以下が2桁で表示
{: >+12.2e} で同様に指数表現(小数点以下2桁で指数表現)
{: >+12.2g} で有効数字2桁で表示
例)
print('{: >+6,}'.format(+1234567))
print('{:10x}'.format(+1234567))
print('{: >+12.2f}'.format(+1234567))
print('{: >+12.2e}'.format(+1234567))
print('{: >+12.2g}'.format(+1234567))
+1,234,567
12d687
+1234567.00
+1.23e+06
+1.2e+06
numpyのndarray型のデータをフォーマット指定する場合
numpy.set_printoptions( formatter={ 'complex_kind' : '...
でcomplex128型のデータのndarrayのオブジェクトを出力を...
[ +0.2967-0.4617j +0.2967-0.4617j]
などとなる
__str__メソッドを定義すると、print(インスタンス)で__str_...
例)
class MC:
def __init__(self,v):
self.value = v
def __str__(self):
return f"MC instance, value = {self.value}"
print( MC(42) )
MC instance, value = 42
//-------------------------------------------------------...
** クラス変数 [#z81ab08f]
class Hoge:
dumm = None #クラス変数
def __init__( self )
self.junk = None #ただのインタンス
obj1 = Hoge(); obj1.junk = 1
obj2 = Hoge(); obj2.junk = 2
obj3 = Hoge(); obj3.junk = 3
Hoge.dumm = 56789
print( Hoge.dumm )
print( obj3.junk )
//-------------------------------------------------------...
** その他 [#p1bc6d4f]
*** インデントのタブとスペース [#u5078b6f]
同じスコープのインデントに、タブとスペースが混ざっていた...
どちらかに統一する。
*** 全角スペースは \u3000 である [#e50b412e]
a="abc\u3000def"
b=open( "hoge.txt", "w" ); print(a,file=b); b.close()
*** 文字の置き換え [#t32318a4]
"AB789CDあEいFG".translate( "".maketrans("あいABC","ai01...
これは echo "AB789CDあEいFG" | tr "あいABC" "ai012" のよ...
ただし trは日本語不可。
*** 文字列内のパタンを検索 [#i300b42b]
パタンに一致した場合、その部分を示すre.Matchのオブジェク...
reMatchのオブジェクトは、group()によって文字列を受け取れ...
パタンに一致が無かったらNoneを返す。
>>> import re
>>> a=re.search( "\d{4}", "ab12345cd5678ef" )
>>> a
<re.Match object; span=(2, 6), match='1234'>
>>> a.group() #a=Noneのときは None.group()はエラーになる
'1234'
#1行で、エラー込みで、一致した文字列を受け取る(もっと...
x=re.search( "\d{8}", "ab12345cd5678ef" ); x = x.group()...
https://note.nkmk.me/python-re-match-object-span-group/
*** リストと辞書とsorted [#ecbcce6f]
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> dict(d)
{'A': '5', 'B': '9', 'D': '1', 'C': '2', 'E': '3'}
#キーが同じものはひとつのみになる。おそらく最後の要素の...
>>> dict(d).items()
dict_items([('A', '5'), ('B', '9'), ('D', '1'), ('C', '2...
#辞書をタプルのリストにしたようなものを与える。see help(...
>>> sorted(dict(d)) #キーのみ並び替えたリストを与える
['A', 'B', 'C', 'D', 'E']
>>> sorted(dict(d).items()) #(キー,値)の並び替えたリス...
[('A', '5'), ('B', '9'), ('C', '2'), ('D', '1'), ('E', '...
*** リストとsort [#a8e126d8]
(注意)
リストのメッソドsortは データを書き換える。
組み込み関数のsortedは 新しいリストを生成して与え、元の...
sortは安定な並び替えである。sortedは安定化は不明(helpに...
sortとsortedの違い https://note.nkmk.me/python-list-sort-...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: x[1], reverse=True)
>>> d
[('B', '9'), ('A', '5'), ('B', '4'), ('E', '3'), ('C', '...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: x[0], reverse=True)
>>> d
[('E', '3'), ('D', '1'), ('C', '2'), ('B', '4'), ('B', '...
途中にprint文を挟めた例(なお、stderrに出力させないとキ...
>>> d=[ ('A','5'), ('B','4'), ('D','1'), ('C','2'), ('E'...
>>> d.sort(key=lambda x: (print(x, x[1], file=sys.stderr...
('A', '5') 5
('B', '4') 4
('D', '1') 1
('C', '2') 2
('E', '3') 3
('B', '9') 9
>>> d
[('B', '9'), ('A', '5'), ('B', '4'), ('E', '3'), ('C', '...
*** リスト、辞書の整形出力 [#e1df08f7]
import pprint
pprint.pprint( list_val, widhth=160 )
https://note.nkmk.me/python-pprint-pretty-print/
*** ファイルをseek [#z9f1b5c5]
先頭にする例
fp.seek(0,0) # offset=0, referencepoint=0 でファイル位...
*** 比較演算の組み合わせ [#pa46333c]
w = 3
2 <= w and w <= 8
2 <= w <= 8 #上記と同じ
*** zip [#k45c029a]
x = ( 1, 2, 3, 4, 5 )
y = ( 10, 20, 30, 40, 50 )
for i, j in zip( x, y ):
print( i, j )
*** 辞書のループ [#j14014dd]
z = {'a': 1, 'b': 2, 'c':3 }
for key, val in z.items():
print( key, val )
for k in z.keys():
print( k )
for v in z.values():
print( v )
//-------------------------------------------------------...
** Excelのワークブックの読み書き [#qaa96a7d]
import openpyxl
wb=openpyxl.load_workbook("testbook.xlsx", data_only=True)
wksheet=wb["Sheet1"]
for i in wksheet.iter_rows(min_row=2):
print( "i=", i, "i[0].row=", i[0].row )
# 各行のループ変数 iは、excelのセルを要素とするタプルが...
# i[0], i[1], ..., i[p], ... は左からp番目のセルである。
# i[p].rowはそのセルがexcelのシートで何行目かの番号であ...
wb = openpyxl.load_workbook( 'sample.xlsx') #ワークブッ...
wb = openpyxl.Workbook() #新規ワークブック生成、
wb.sheetnames #シート名のリスト(新規の場合、シート...
wb.active #現在選択されているシート(新規の場合...
st = wb.active #現在選択されているシート
st.title = 'Sheet100' #シート名変更
st2 = wb[ st.title ] #シートの取得
True if id(st) == id(st2) else False #Trueが返るのでst...
st2[ "D2" ] = "d-2 cell contents" #セルに代入
st2.merge_cells( "D3:f4" ) #セルを結合
st2[ "D3" ] = "combined d-3 cell contents"
st2[ "D3" ].alignment = openpyxl.styles.alignment\
.Alignment( vertical="center" ) ...
wb.save( "wb-temp.xlsx" ) #ワークブックの保存
https://gammasoft.jp/support/how-to-use-openpyxl-for-exce...
https://atmarkit.itmedia.co.jp/ait/articles/2202/08/news0...
https://note.nkmk.me/python-openpyxl-usage/
** csvファイルを読む [#sfe13c9f]
#csvのフォーマットは生成するソフトに依存しているため注意...
#csv.readerで大丈夫らしい。
import csv
fp=open( "testbook.csv", encoding='utf-8-sig' ) #BOM付...
list( csv.reader( fp ) )
または list(...) の代わりに
ite=csv.reader( fp ) #_csv.reader関数を返す(イテレータ...
#_csvはモジュールらしい。_csvは im...
#してみると、.soの共有ライブラリの...
#help(_csv); type(_csv); type(_csv...
for r in ite: #rはcsvの各行のリスト
for c in r: #各行について、cは列の項目
print( c, end=' / ', file=sys.stdout )
print( file=sys.stdout )
(注) openするとき、BOMがある場合は必ず encoding='utf-8-si...
さもないと、読み込んだ最初の項目の先頭に BOMを示す文字( "...
確か、Excelアプリで xlsxから csvを作ると BOM付きである。
BOMなしのファイルは encoding='utf-8-sig' でオープンしても...
https://qiita.com/msk02/items/c3a1c4a1e1ef94c37228 ~
https://www.lifewithpython.com/2017/10/python-detect-bom-...
- openのencoding
fp=open( "testbook.csv" ) #環境に依るが たいていデフォ...
fp=open( "testbook.csv", encoding='utf-8' ) #BOMな...
fp=open( "testbook.csv", encoding='utf-8-sig' ) #BOMつ...
- 他
#- - - - - - - - - - - - - - - - - - - - -
#ファイルdisp.py
def disp(ite):
fo=open( "disp-temp.txt", "w" ) #BOMなしで書き出し
for r in ite:
for c in r:
print( c, end=' / ', file=fo )
print( file=fo)
fo.close()
#- - - - - - - - - - - - - - - - - - - - -
を作っておいて
>>> import disp
>>> disp.disp( ite ) # iteは上のもの
のように使える。
//-------------------------------------------------------...
* パッケージとモジュールの構造(まとめ) [#t12fefe2]
** 説明の前提(用語、予備知識) [#a2bcf5c7]
次のディレクトリ階層を仮定して、以下を説明。
mytp
|-- __init__.py
|-- mod01.py
|-- mod02.py
`-- mysp1
|-- __init__.py
|-- mod11.py
`-- mod12.py
いま、mod01,02,11,12内に 関数func01,02,11,12があるとす...
また、インポートのために、mytpを含むディレクトリが PYTH...
- 用語:
パッケージ = ディレクトリ, 例 mytp
サブパッケージ = サブディレクトリ, 例 mysp1
モジュール = ファイル, 例 mod01.pyなど
オブジェクト = モジュール、関数、などなど
オブジェクト名は、名前空間でもあり、名前空間には名前空間(...
最初に pythonが実行している名前空間は __main__ である。
(__main__で import hoge すると __main__内に hogeの名前空...
__main__.hoge のような記述はできないようで、暗黙的に __ma...
名前空間に登録されている名前は dir() で知ることができる。
__name__ # 現在の名前空間
dir( [オブジェクト名] ) # オブジェクト名(名前空間)に登...
# 名前空間名など)のリスト。
//----------------------------
** (トップレベルの) パッケージのインポート [#m67d209d]
import mytp # mytp/__init__.pyがあれば実行される。
# 現在の名前空間に mytpが追加されるが、mytp...
# mytpの名前空間もほぼ空のままであり mytp.m...
- モジュールや、モジュール内のオブジェクトのインポート
import mytp.mod01 # 現在の名前空間にmytpが追加され、m...
# mod01モジュールの関数などが使用で...
mytp.mod01.func01()
from mytp import mod01 # mytpディレクトリの mod01が、現...
# mod01モジュールの関数などが使...
mod01.func01()
from mytp.mod01 import func01 # mytpディレクトリのmod01...
# そのままで func01を使用...
# 追記:func01がモジュールスコー...
#よって defされている関数であって...
func01()
- mytp/__init__.py を用意すると次のようなことができる
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
print( "* __name__ = ", __name__ ) # このパッケージ名...
# __main__で import mytp としただけで mytp.mod01.func0...
from mytp import mod01 # mytpの名前空間に mod01が追加...
from mytp import mod02 # mytpの名前空間に mod01が追加...
#このファイル ( 名前空間 mytp ) では mod01.func01() が...
mod01.func01()
# 関数は名前空間 mytp に登録されるため、 mytp.initmytp...
def initmypt():
print( "initmypt" )
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
//----------------------------
** サブパッケージのインポート [#a1e00469]
import mytp.mysp1 # mytp/__init__.pyがあれば実行...
# 現在の名前空間に mytpが追加さ...
# mytp/mysp1/__init__.pyがあれ...
# mytp名前空間に mysp1が追加さ...
# mytp.mysp1.mod11などは使用で...
from mytp import mysp1 # mytp/__init__.pyがあれば実行...
# mytp/mysp1/__init__.pyがあれ...
# 現在の名前空間に mysp1が追加...
# mysp1.mod11などは使用できない...
- モジュール、モジュール内のオブジェクトのインポート
import mytp.mysp1.mod11 # mytp/__init__.pyがあれば実...
# mytp/mysp1/__init__.pyがあ...
# 現在の名前空間にmytpが追加...
# mysp1の名前空間に mod11が追...
# mod11モジュールの関数などが...
mytp.mysp1.mod11.func11()
from mytp.mysp1 import mod11 # mytp/__init__.pyがあれば...
# mytp/mysp1/__init__.pyが...
# mytp/mysp1ディレクトリの...
# mod11モジュールの関数な...
mod11.func11()
from mytp.mysp1.mod11 import func11 # mytp/mysp1ディレ...
# そのままで func11...
func11()
- mytp/mysp1/__init__.py を用意すると次のようなことができる
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
print( "* __name__ = ", __name__ ) # このパッケージ名...
# __main__で import mytp としてもこのサブパッケージは...
# import mytp.mysp1 とすると mytp.mysp1.mod11.func11()...
from mytp.mysp1 import mod11 # mytp.mysp1の名前空間に...
from mytp.mysp1 import mod12 # mytp.mysp1の名前空間に...
# __main__で from mytp import mysp1 とすると mysp1 が...
# が使用できるようになる。
#このファイル ( 名前空間 mytp.mysp1 ) では mod11.func1...
mod11.func11()
# 関数は名前空間 mytp.mysp1 に登録されるため、 mytp.my...
def initmysp1():
print( "initmysp1" )
// - - - - - - - - - - - - - - - - - - - - - - - - - - ...
//----------------------------
** (__main__などからの) パッケージ、サブパッケージの使い...
1) myptや mytp.mysp1をインポートして、mytpからfunc11を指...
- 指定が長いが、把握しやすい。
- 混乱しないのであれば asを併用するとよい。
import mypt
mypt.mod01.func01()
import mytp.mysp1
mytp.mysp1.mod11.func11()
import mytp.mysp1 as subn
subn.mod11.func11()
2) mod01や mod11, mysp1をインポートして、mod01や mod11, m...
- 名前衝突が起こる。
- 把握しにくく、混乱しやすい。
from mytp import mod01
mod01.func01()
from mytp.mysp1 import mod11
mod11.func11()
from mytp import mysp1
mysp1.mod11.func11()
//----------------------------
** その他 __main__.pyなど [#l0c9f01a]
python -m モジュール名 で、モジュールを読み込み。そのモ...
__main__.pyを実行する(無ければエラー)。
__init__.pyがあれば事前に実行される。
python -m bcone で bcone/__main__.pyを実行させるのがめん...
alias bcone='python -m bcone' するとよいだろう。
また、__main__.pyで他のファイルを実行したい時は、import b...
とするとよいでしょう(この場合は bcone/main.pyが実行)。
setup.cfg :~
パッケージインストールに関するひとつのファイルである。
中の entry_pointで /usr/bin内に置くコマンドと、そのコマン...
パッケージ内のpython関数を指定することができるらしい。
~
setup.py :~
似たようなもの。setuptoolsをimportして使われるようだ。
python -c 'import hoge; hoge.func()' などコードを-cオプシ...
インデントエラーになる。'...'の文字列を改行込みでタイプし...
//----------------------------
//-------------------------------------------------------...
* matplotlibモジュール [#v875f700]
- グラフを描く
-- matplotlib 線・マーカー種類など [[URL>https://science-...
-- https://qiita.com/nkay/items/d1eb91e33b9d6469ef51
- 3Dグラフを描く
-- https://techacademy.jp/magazine/29976
-- https://dreamer-uma.com/python-3d-graph/
-- https://qiita.com/orange_u/items/8a1e285a45093857aef7
//-------------------------------------------------------...
* numpy, scipyのドキュメント [#ud5a2b2a]
- Numpy and Scipy Documentation https://docs.scipy.org/doc/
-- SciPy search the docs? https://docs.scipy.org/doc/scip...
-- SciPy search the docs(正しいURL)? https://docs.scipy.o...
-- NumPy search the docs https://numpy.org/doc/stable/
//-------------------------------------------------------...
* scipyモジュール [#n9aeaedb]
** scipy.integrate.RK45クラスの説明 [#cc1f236f]
https://docs.scipy.org/doc/scipy/reference/generated/scip...
import scipy.integrate; help(scipy.integrate.RK45) も同じ...
c.f. help(scipy.integrate.solve_ivp)
http://www.physics.okayama-u.ac.jp/~otsuki/lecture/CompPh...
//https://www.fixes.pub/program/465196.html ~
RK45は5次のルンゲクッタ法を使用して、4次のルンゲクッタ法...
また、マニュアル help(solve_ivp) によると、RK45は複素数も...
ただし、初期値が実数であっても、複素数のデータ型で与える...
//-------------------------------------------------------...
* numpyモジュール [#x0b905c7]
** ndarray型と matrix型 [#t6f1099c]
以下は 二次元配列の ndarray型
( type(a)でインスタンスの型を調べられる。また、下の floa...
a=numpy.zeros( (2,2) ) # 2行2列のfloat64のゼロで初期化...
# a.dtypeは float64
a=numpy.array( [[1,2],[3,4]] ) # 組み込みリスト型から、...
# a.dtypeは int64, リス...
a=numpy.empty( (2,2) ) # 2行2列のfloat64の未初期化の二...
# a.dtypeは float64
a=numpy.array( [[1,2],[3,4]], dtype='complex128') # dty...
# ビ...
b=numpy.zeros_like( a, dtype='float64' ) # aと同じ配列...
b[:,:] = 1.2 #すべての要素を 1.2にする
b = b.astype( numpy.int64 ) #要素のdtypeをint64に変換す...
以下は matrix型(二次元配列に限定され、扱いはndarrayと同...
a=numpy.matrix( [[1,2],[3,4]] ) # 組み込みリスト型から...
# a.dtypeは int64, リ...
scipyモジュールは、matrixは使わずに、ndarrayを利用してい...
ndarrayで要素毎に型の違う配列を扱う事も出来るが、その場合...
行列の用意、初期化など https://note.nkmk.me/python-numpy-...
データ型の指定、など https://note.nkmk.me/python-numpy-dt...
numpy.ndarray型 https://note.nkmk.me/python-list-array-nu...
二次元配列と行列の演算など https://note.nkmk.me/python-nu...
** Python組み込み型変数のビット数を調べる [#v5ef60fe]
numpy.float_ #らしい。この例は floatについて調べている
** 2次元配列と行列 [#j37d6922]
ndarrayの要素・行などの参照 https://note.nkmk.me/python-n...
a=numpy.array( [[1,2],[3,4]] ) の2次元配列のとき
a[0,1] や a[0][1] は (0,1)要素
スライスで参照できる、代入もできる
a[0,:] は 0行目の1次元配列(次元がひとつ減る)
a[0:1,:] は 0行目からなる2次元配列
a[:,0] は 0列目からなる1次元配列(次元がひとつ減る)
a[:,0:1] は 0列目からなる2次元配列
a[:,0] = 9 #参照したすべての要素に 9を代入(右辺が配列...
次元がひとつ減る => スライスではなく、数字の指定で減る
2次元配列や1次元配列を使って行列演算ができる。
numpy.dot関数、 dotメソッド や @ メソッド、で掛算(matrix...
なお、2次元配列と1次元配列の掛算では、
1次元配列が、演算の左にある場合は行ベクトル、右にある場...
そして、1次元配列同士の掛算は内積になる。
dtype型の違う2次元配列(行列)の演算は、高いほうの型に変...
ブーリアンインデックスによる参照、代入も可
a[ :, (True,True,False,False) ]
ファンシーインデックスによる参照、代入も可
a[ :, (0,1) ] #参照する列の添え字を指定(重複可)、代...
a > 5 # 配列aの各要素が、条件に対して Trueか False...
a[ a > 5 ] # 5より大きい要素のみを指定して参照、代入も...
複数の次元で指定する場合は a[ numpy.ix_( (False,True,True...
ix_関数 を使わないと正しく指定できない。
また、
3次元以上の配列は、ひとつの次元で指定することしか出来な...
(※注) 配列がビューではなく、コピーで作られてしまっている...
** 多次元配列の次元を減らす [#ba905119]
多次元配列を1次元化する https://note.nkmk.me/python-nump...
多次元配列の次元を減らす https://codechacha.com/ja/python...
a=numpy.arange(12).reshape( (3, 4) ) # 0~11の要素をも...
a.reshape(-1) # 数字ひとつなので1次元配列。サイズ -1は...
a.ravel() #可能な限りビューを返す
a.flatten() #データはビューでは無く、必ずコピーされる
などなど
多次元配列の形状を変える https://note.nkmk.me/python-nump...
a=numpy.arange(12).reshape( (3,4) )
a.reshape( (4,3) ) # データはコピーされるが、データの1...
# サイズが切り直されるような形。
# 可能な限りビューが返る。
a.reshape( (4,3) ).copy() # 明示的にコピーを返したい場合
# 引数で、変換順序 order='C' (デフォルト) や 'F' などの...
# a.reshape( (4,3) ) をそのまま端末に出力した場合と、pri...
# order='C' や order='F' を指定した場合の挙動がよくわか...
配列の次元、サイズを調べる
a=numpy.arange(12).reshape( (3, 4) )
a.ndim
a.shape
** reshape関数の仕様を調べる [#nc1fe31b]
import numpy as np
type( a ) # aが numpy.ndarray のとき
help( np.ndarray ) # import numpy as np してると、typeで...
# reshapeメソッドの説明はあるが、nump...
help( np.reshape ) # 引数newsharpは、intか intのタプル...
** 注意(viewとcopyを参照) [#u24da219]
>>> import numpy
>>> a = numpy.array( [ 1.2, 2.3] )
>>> b = 2*a
>>> b
array([2.4, 4.6])
>>> a[0] = 7.7
>>> a
array([7.7, 2.3])
>>> b
array([2.4, 4.6])
>>> c=b
>>> c
array([2.4, 4.6])
>>> b[0]=9.8
>>> c
array([9.8, 4.6]) #ただの代入であればcも変化するので注意!
** ビュー(view)とコピー(copy) [#k5043c15]
https://note.nkmk.me/python-numpy-view-copy-shares-memory/
a.copy() #コピーを生成する
rcd = a.base is None #Trueなら、ビューである
- numpy.shares_memory( a, b ) #片方がもう一方のビューvie...
- 引数のデフォルトオブジェクトが共有されてしまう例
def d( default = {} ): # defaultの返値 {} が共有されて...
return default
av = d()
au = d()
av['FOO'] = 100; print( 'av=', av, ' au=', au)
av['BAR'] = 200; print( 'av=', av, ' au=', au)
def d( default = None ):
if default == None:
default = {} # 共有されない
return default
av = d()
au = d()
av['FOO'] = 100; print( 'av=', av, ' au=', au)
av['BAR'] = 200; print( 'av=', av, ' au=', au)
出力結果
av= {'FOO': 100} au= {'FOO': 100}
av= {'FOO': 100, 'BAR': 200} au= {'FOO': 100, 'BAR': 200}
av= {'FOO': 100} au= {}
av= {'FOO': 100, 'BAR': 200} au= {}
- pythonの代入等、基本は参照を渡すが、場合によって複製を...
- 深いコピー(deep copy)
import copy
hoho = copy.deepcopy( hoge ) #オブジェクトに含まれるオ...
単純に、複製である。
- 浅いコピー(shallow copy)
hoho = hoge #オブジェクトに含まれるオブジェクトについて...
オブジェクトにオブジェクトが含まれない場合には、深いコピ...
- 備考
オブジェクトのcopyメソッドが実際どのようなコピーをするか...
スライスした次元は、浅いコピーになると思われる。
https://note.nkmk.me/python-copy-deepcopy/
*** mutable(ミュータブル)とimmutable(イミュータブル) [#tb...
『オブジェクトによっては 値 を変更することが可能です。
値を変更できるオブジェクトのことを mutable と呼ぶ。
生成後に値を変更できないオブジェクトのことを immutable と...
(mutableなオブジェクトへの参照を格納している immutableな...
その格納しているオブジェクトの値が変化した時に変化するが...
格納しているのかが変化しないのであれば immutableです。
immutable かどうかは値が変更可能かどうかと無関係。)
オブジェクトが mutable かどうかはその型によって決まる』~
[ref] https://docs.python.org/ja/3/reference/datamodel.ht...
c.f.~
オブジェクトは、同一性(identity)、型、値をもつ。~
id() 関数は同一性を表す整数を返します。~
CPython では、id(x) は x が格納されているメモリ上のアドレ...
組み込みのデータ型のうち、list, set, dict型のみmutable。~
def print_id_obj( obj ):
print( 'id=', id(obj), ' obj=', obj )
a=1
b=a
print_id_obj(a)
print_id_obj(b)
print()
b=2
print_id_obj(a)
print_id_obj(b)
//
// #->
// #id= 94427975430944 obj= 1
// #id= 94427975430944 obj= 1
// #
// #id= 94427975430944 obj= 1
// #id= 94427975430976 obj= 2
//
// a=[1,2]
// b=a
// print_id_obj(a)
// print_id_obj(b)
// print()
// b[0]=3
// print_id_obj(a)
// print_id_obj(b)
// print()
// b=[4,5]
// print_id_obj(a)
// print_id_obj(b)
//
// #->
// #id= 47087150371464 obj= [1, 2]
// #id= 47087150371464 obj= [1, 2]
// #
// #id= 47087150371464 obj= [3, 2]
// #id= 47087150371464 obj= [3, 2]
// #
// #id= 47087150371464 obj= [3, 2]
// #id= 47087163414024 obj= [4, 5]
** numpy.stack, hstack, vstack [#jddcdb5f]
a = numpy.arange(4).reshape( (-1,) ) +100 #[100 101 102...
b = numpy.arange(4).reshape( (-1,) ) +200 #[200 201 202...
numpy.hstack( [a,b] ) # [100 101 102 103 200 201 202 20...
numpy.vstack( [a,b] ) # [[100 101 102 103]
# [200 201 202 203]] になる
numpy.stack( [a,b], axis=0 ) # hstackと同じ
numpy.stack( [a,b], axis=1 ) # [[100 200]
# [101 201]
# [102 202]
# [103 203]] になる
** numpy.meshgrid [#h7f8821f]
ax = numpy.linspace(0,4,5).astype(int) #[ 0 1 ...
ay = numpy.linspace(10,14,5).astype(int) #[ 10 11 ...
x, y = numpy.meshgrid( ax, ay )
# x
# [[ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]
# [ 0 1 2 3 4]]
# y
# [[ 10 10 10 10 10]
# [ 11 11 11 11 11]
# [ 12 12 12 12 12]
# [ 13 13 13 13 13]
# [ 14 14 14 14 14]]
for j in range(4,0,-1):
for i in range(0,4,+1):
print( " {: >2d}-{: >2d}".format(x[j,i], y[j,i])...
print()
# 0-14 1-14 2-14 3-14
# 0-13 1-13 2-13 3-13
# 0-12 1-12 2-12 3-12
# 0-11 1-11 2-11 3-11
xx = x / 2.0
yy = y / 2.0
for j in range(4,0,-1):
for i in range(0,4,+1):
print( " {: >3.1f}-{: >3.1f}".format(xx[j,i], yy...
print()
# 0.0-7.0 0.5-7.0 1.0-7.0 1.5-7.0
# 0.0-6.5 0.5-6.5 1.0-6.5 1.5-6.5
# 0.0-6.0 0.5-6.0 1.0-6.0 1.5-6.0
# 0.0-5.5 0.5-5.5 1.0-5.5 1.5-5.5
** numpy.diff [#fcfc04b7]
a = np.arange(10).reshape( (-1,) ); b = a*a # b[i] ,...
c = numpy.diff( b, n=1 ) # c[i] = b[i+1] - b[i] , i=0~8
d = numpy.diff( c, n=1 ) # d[i] = c[i+1] - c[i] , i=0~7
numpy.diff( b, n=2 ) # d[i]と同じ(n回 diffを繰り返...
** numpy.where [#z9bb7370]
a = numpy.arange(10).reshape( (-1,) )
numpy.where( 5<a, 9.5, 0.5 ) # 配列aの要素が条件( 5< ...
numpy.where( 5<a ) # 条件を満たす要素だけの...
numpy.where( 5<a )[0] # 条件を満たす要素だけの...
//-------------------------------------------------------...
* mpi4pyモジュール [#g611561b]
MPIモジュールによる並列化
importすると、並列実行すると思われる。
comm = MPI.COMM_WORLD
//-------------------------------------------------------...
* anacondaなどによる環境作成 [#s41caa22]
** パッケージ(pythonやモジュール)のインストール方法の種類...
python自体のインストールと利用バージョン切替
- インストール
-- 各linuxディストリビューションのパッケージ
-- ソースからコンパイル
-- pyenv
-- anacondaの conda
-それぞれ利用するpythonのバージョン切り替え
-- OS側のコマンド
-- pyenv
-- conda
モジュール・パッケージのインストールと使用・不使用切替
-- pipや PyPI(パッケージ管理のみ)( python.orgによる説明...
-- venv(使用・不使用の環境切替のみ)
-- conda &color(RED){(注)conda環境で、pipは使えるが基本...
anacondaによる condaコマンドは、
+ 科学計算技術計算のモジュールが豊富(らしい)
+ condaによる環境切替ができる(pythonバージョンやモジュー...
そのため、モジュール間の依存バージョン、依存するpython自...
なお、"環境"は、実際には仮想ではないが "仮想環境"と呼ばれ...
** リンク [#u9fff003]
- 参考:パッケージやビルドによる環境
-- CentOS 環境のPython https://www.python.jp/install/cent...
- 参考:anaconda環境
-- Anacondaで仮想環境を作ってみる https://qiita.com/ozaki...
-- Anacondaを使った仮想環境を保存・再構築、複製 https://q...
-- condaとpip:混ぜるな危険 https://onoz000.hatenablog.co...
--- condaとpip:ver.2020 https://onoz000.hatenablog.com/en...
--- pip installとconda installの比較 https://chitose-nana...
-- Anacondaで仮想環境を作るときに役立つTips集 https://cpp...
-- Anacondaで仮想環境を作ってC++プログラミングをするまで ...
-- Conda コマンド https://www.python.jp/install/anaconda/...
-- パッケージによってはライブラリが必要になる
--- libm (glibc) インストール https://minecraft.server-me...
--- libffi インストール https://noknow.info/it/os/install...
https://qiita.com/rabi0102/items/8a749505c78ddc5e4a7d
- 参考:jupyter
-- notebook, lab, hub, lab-hubがある。
-- CentOS7にJupyter Notebookを導入 https://qiita.com/hiro...
-- CentOS7でJupyter Notebookを簡単インストール・設定 http...
-- リモートサーバでJupyter Notebookを実行する方法 https:/...
-- (ノードでの使用)Jupyter Notebookの利用 https://docs....
-- JupyterじゃなくてJupyterLabを勧めるN個の理由 https://q...
-- JupyterLab-Hubで快適な分析環境を共有しよう! https://qi...
-- 無償で使えるJupyter Notebookオンライン環境 https://www...
-- JupyterHubを複数ユーザーで使用するための環境構築方法 h...
-- Jupyter Notebookで分析結果を社内共有!! https://www.o...
-- UbuntuにAnacondaをインストールしてPythonとJupyter Note...
- その他
-- 並列計算のパッケージ ipyparallel https://github.com/ip...
-- ipythonの使い方 https://qiita.com/5t111111/items/7852e...
//-------------------------------------------------------...
* conda環境の利用方法 [#m726dded]
conda activate [環境名] #アクティベート(環境を設定)
conda deactivate #デアクティベート(環境を終了)
conda create -n 環境名 [python[=バージョン] [パッケージ...
conda remove -n 環境名 --all #環境の削除
(補足)
conda create -n hoge により、インストール場所の/share/ap...
や ~/.conda/envs にパッケージや環境が置かれるようだ。
例えば appbinユーザにより /share/apps/anaconda3に anacon...
シェルコマンド
eval "$(/share/apps/anaconda3/bin/conda shell.bash hoo...
により、appbinや他のユーザは conda環境を利用できる。
- appbinユーザにより作成された環境は /share/apps/anacond...
他のユーザも利用できる。
- 個人のユーザが環境を作った場合には ~/.conda/envs とも...
ファイルが置かれて、そのユーザが利用できる。
- conda create -p pathEnvName により、環境のファイルを置...
できるようにできる、らしい。(/share/apps/envsを指定する...
(補足2:パッケージの追加インストール)
各仮想環境へパッケージを追加インストールするには appbin...
(appbinアカウントによるインストールは、誰が入れたか不...
追加されたパッケージは、他のユーザも利用できるようにな...
(注1) 依存関係でパッケージのアップデートも必要に応じて...
既存の環境が変更を受ける。アップデートに伴い不具...
アップデートされたパッケージをすべてアンインスト...
ほぼ絶望的である。
環境を壊す危険が高い場合など、検証用にanaconda...
パッケージをアップデートするのが望ましい。
(注2) pipコマンドは /share/app/anaconda3のすべての既存...
pipを使用した仮想環境は、condaとpipのパッケージの...
不具合が出うる。
pipでインストールしたパッケージを pipでアンイン...
condaに存在していても利用できなくなるようだ。少な...
仮想環境への影響は今のところ無さそうである。2023/...
appbinグループを使用した追加方法は、
sgコマンドまたはnewgrpコマンドにより、所属グループをapp...
をする。手順は以下 1)-3) のいずれか
1) $ sg appbin bash
$ インストール作業
$ exit
2) $ sg appbin "インストールのためのコマンドライン" #...
3) $ newgrp appbin
$ インストール作業
$ exit
なお、所属グループをappbinに変更し忘れた場合は、
chown -R :appbin /share/apps/anaconda3 をすればよいよう...
(rootユーザが chown -R :appbin /share/apps/anaconda3 を...
仮想環境の追加作成のときは appbinアカウントを使用する。
環境は /share/apps/anaconda3/envsに、パッケージは /shar...
個人ユーザで conda create -n py36 python=3.6 などで仮想...
この場合、仮想環境は ~/.conda/envsに、パッケージは /sha...
そのためこの場合も作成時には appbinグループを使用するこ...
個人的にいろいろ試す場合は、個人環境に別途でanacondaを...
conda info #condaの情報
conda info -e #環境のリスト
conda -V #バージョン
conda -h #ヘルプ
conda config --help #コマンドconfigのヘルプ
anaconda search --help #コマンドsearchのヘルプ
conda create --help #コマンドcreateのヘルプ
conda search [-c チャネル] [--full-name] パッケージ名 #...
conda install パッケージ名[=バージョン] #現在の環境に...
conda uninstall パッケージ名 #現在の環境から、パッケー...
conda list [-n 環境名] #インストールさ...
デフォルト以外のチャンネル:
https://docs.conda.io/projects/conda/en/latest/user-guide...
//? condaが対応していないパッケージのインストールの場合
//? anaconda search -t conda パッケージ名 #パッケージが...
//? anaconda show パッケージ名 #チェネルURL...
// conda install -c チャネルURL パッケージ名
環境の保存や、それを使った環境作成
conda env export > ファイル名.yaml
conda env create -n 新しい環境名 -f ファイル名.yaml
or
デフォルトのチャネルだけなら
conda list --export > ファイル名.txt
conda create -n 新しい環境名 -f ファイル名.txt
conda clean --all #不要なパッケージやキャッシュを削除
conda create -n 新しい環境名 --clone もとの環境名 #環境...
conda remove -n もとの環境名 --all
conda config --set env_prompt "({default_env}) " #デフ...
conda config --set env_prompt "p:" #プロ...
conda config --set changeps1 false #プロンプトを変更し...
echo $CONDA_SHLVL #0以外でconda環境で...
conda config --set auto_activate_base false #conda環境...
標準的なパッケージをごっそり入れる?
conda create -n 新しい環境名 [python=バージョン] anaconda
アップデート
conda update -n base -c defaults conda #condaのupdate...
conda update conda;conda update anaconda;conda update -...
アンインストール
次のものを削除するようだ。
インストール先のanaconda3 ディレクトリ
~/.conda ディレクトリ
~/.condarc ファイル
~/.bashrcに追加された conda initialize のブロック
*** ハードリンク [#ce9ae41a]
- hoge1, hoge2, hoge3という共通のi-nodeをもつハードリンク...
いずれかのファイルを上書き変更すると、他のファイルもすべ...
(仮想環境で使われているファイルは、ハードリンクで共通に...
他の全ての仮想環境で意図しないファイルの変更が起こる。)
- emacsで例えば hoge3のファイルを変更・保存したとする。変...
もともとハードリンクされていたファイルは hoge3~になってい...
*** スクリプトを実行する時だけ conda activateする(通常は...
下記のようなスクリプトを mypyなどとして作っておき、mypy h...
#!/bin/bash --norc
#==== set your python env ====
MYPYTHON=py370
if [ $# == 0 ]; then
echo "usage: $0 command [args]" >&2
exit 1
fi
source /share/apps/anaconda3.bash_conda
conda activate $MYPYTHON
#==== execute command [args] ====
"$@"
//-------------------------------------------------------...
* 実行時の symbol lookup error や relocation error の対処...
pythonプログラムを実行したときに
symbol lookup error や relocation error が出た場合は、
[[LABO/Rocks]]のページの対処法を見よ。
//-------------------------------------------------------...
* 弘大JupyterHub [#t375c760]
- 弘前大学情報基盤システム(HIROINS) 教育研究事務業務支援...
-- ログイン https://jupyter01.hirosaki-u.ac.jp:8000/hub/l...
--- 裏で動いているCPUは Xeon Gold 5220R 2.20GHz (32コア,...
-- 実習室パソコンの情報 https://home.hirosaki-u.ac.jp/her...
//-------------------------------------------------------...
* Jupyter Notebook [#q450c36b]
** alliumのjupyter notebook [#m5ba35f1]
使用方法は [[LABO/Rocks#tdb7fe60]]を見よ。
** 長い出力部分の表示切替 [#qc798443]
- 長い出力は、スクロールバーが出て部分的に表示される。
-- 左部分をクリックすると、全て表示 ⇔ スクロールバーによ...
-- ダブルクリックすると、非表示になる(クリックで、全て表...
** 括弧などの入力補完(autoCloseBrackets)をオフにする [#y2...
from notebook.services.config import ConfigManager
c = ConfigManager()
c.update('notebook',
{"CodeCell": {"cm_config": {"autoCloseBrackets"...
を実行して、ノートブックを開きなおす。設定は ~/.jupyter/...
** ipynbをpyに変換する [#u91d1cb0]
jupyter nbconvert --to python hogehoge.ipynb #==> hoge...
** jupytextを使えるようにする(ipynbとpyの同期) [#mccae438]
デフォルト以外のチャンネル
https://docs.conda.io/projects/conda/en/latest/user-guide...
→ https://conda-forge.org/feedstock-outputs/ より conda-f...
jupytextを検索して https://github.com/conda-forge/jupytex...
$ conda activate py370
$ conda install jupytext --channel conda-forge
のようにパッケージをインストールする(/share/apps/anacond...
jupyter notebookを起動して hoge.ipynbファイルを開く→ファ...
→Pair Notebook with light Scriptにチェックを入れる。
これで hoge.ipynbと hoge.pyが同期される。
[ref] https://qiita.com/ku_a_i/items/ccdeb7f1d9384fb4767b
** マジックコマンド(%) [#wd5d9a96]
%matplotlib notebook
%matplotlib inline
%time
など
ページ名: