Pythonで一意な文字列を生成する

uuidモジュールで楽に生成できます import uuid ustr = uuid.uuid4() print(ustr) print(ustr.hex) $ py main.py 33536e0f-aef5-4dfc-9d5d-7c96c5139f0a 33536e0faef54dfc9d5d7c96c5139f0a

Argparseを使ったコマンドライン引数の管理

通常コマンドライン引数を扱うにはsys.argvを使います。 import sys args = sys.argv count = args[1] print(count) $ py main.py 10 10とてもシンプルですね。ただ実際にちゃんとしたプログラムを組む場合、例えばコマンドライン引数が渡されなかった場合に…

subprocessを使って外部プログラムを実行する

https://docs.python.jp/3/library/subprocess.htmlsubprocessには色々な関数が定義されているのでとりあえずいくつか使いそうなものを試してみます。例としてPythonから別のPythonのプログラムを実行する処理を実装してみます。 subprocess.check_callによ…

with文を利用したファイルの読み書き

例えば以下のようなファイルの読み込み処理があるとします。 fh = open('text.txt','rt') text = fh.read() fh.close() with文を使うと以下のようになります with open('text.txt','rt') as fh text = fh.read() with文を使うとcloseを明示的に呼ぶ必要がな…

Pythonでのファイル読み書き基礎

入門Python3 8.1 ファイルの読み書きです。まずはテキストデータの書き込み処理。openの第二引数にwを指定すると書き込みとなります。tはテキストモードでこれをbにすればバイナリモードのなります。 fh = open('output.txt','wt') fh.write('hogehoge') fh.…

Pythonでsleep

https://docs.python.jp/3/library/time.html#time.sleeptimeモジュールのsleep関数を使います from time import sleep print(1) sleep(1) print(2) $ py main.py 1 1sleep(1)で1秒スリープする感じです。float値でもいけるので0.5秒スリープしたりとかもで…

attrdictを使って辞書をオブジェクト変数としてアクセスできるように変換する

例えばPythonでJSONを読み込むとそれは辞書として変換される import json data = json.loads('{"a": 1,"b": {"c": 4} }') print(data) $ py main.py {'a': 1, 'b': {'c': 4}} 辞書なので各要素にアクセスする時は以下のようになる。 import json data = json…

importとfrom〜importについてもうすこし

モジュールのインポートについては以前学びましたがいまいち理解が追いついていなかったのでもっかいおさらい。 importで読み込んだものがなんなのか、typeで調べてみます。helloworld関数を持つtest.pyを用意します。 # -- test.py -- def helloworld(): pr…

pipによるパッケージのインストール

世に公開されているたくさんのパッケージをインストールしたりなんかしたりするためのツールです。今回は試しにrequestsってのを入れてみることにする。 $ pip install requestsこれだけでrequestsというパッケージが使用可能となる。 import requests url =…

「(?P・・・)」による名前付き後方参照

入門Python3 7.1.3.8 「(?P・・・)」という構文を使うと名前付きの後方参照ができます。参照するには「\g」と書きます。 import re str1 = "aa1bb2cc3bb4" str2 = re.sub('(?P<foo>\d+)',r'[\g<foo>]',str1) print(str2) $ py main.py aa[1]bb[2]cc[3]bb[4] またgroupでの</foo></foo>…

subによる文字列の置換

入門Python3 7.1.5 subで文字列の置換ができます。 import re str1 = "aa11bb22cc33bb" str2 = re.sub(r'\d+',':',str1) print(str2) $ py main.py aa:bb:cc:bb グループ化して後方参照することもできます。 import re str1 = "aa11bb22cc33bb" str2 = re.su…

リストから空要素を除去する

例えばsplitなどで以下のようなリストができることがあります。 import re str1 = "a:b:c:d::" r = re.split(r':',str1) print(r) $ py main.py ['a', 'b', 'c', 'd', '', '']このとき空文字の要素だけ除去された状態のリストを得たい場合、リスト内包表記を…

splitによる文字列の分割

入門Python3 7.1.4 splitで文字列を分割しリスト化することができます。 import re str1 = "a:b:c:d" r = re.split(r':',str1) print(r) $ py main.py ['a', 'b', 'c', 'd'] もちろん正規表現で分割もできます。 import re str1 = "a11b22c33d" r = re.split…

文字列中のバックスラッシュについて

文字列の前にrをつけるとバックスラッシュを特殊文字として展開しないようになります。 str1 = "a\tb" str2 = r"a\tb" print(str1) print(str2) $ py main.py a b a\tb 主に正規表現を書くときに使うと便利っぽいです。

正規表現の基礎

入門Python3 7.1.3 正規表現についてです。pythonの正規表現はなにやらいろいろメソッドがあったりして把握が大変なのでとにかく御託はいいから一番シンプルな使い方はなんなのってことで実装してみます。 str1 = "abcdefg" result = re.search('cde',str1) …

Pythonでの書式指定出力(新しいスタイル)

入門Python3 7.1.2.2 Python3からは古いスタイルよりもこの新しいスタイルの書式指定を使った方がよいとのこと。 print("hello {}! {}".format("world",10)) $ py main.py hello world! 10「%s」などの書き方だったのが「{}」に変わり、文字列に対して%演算…

Pythonでの書式指定出力(古いスタイル)

入門Python3 7.1.2.2 Python2でも3でも使える文字列の古いスタイルの書式指定方法。C言語でいうところのprintfみたいなものですね。 print("hello %d" % 10) $ py main.py hello 10文字列に%演算子で繋げると書式が展開された文字列に変換されます。%演算子…

引数リストのアンパック

例えば、リストやタプルの要素を個別に関数へ引数を渡す処理を実装したいとします。愚直に書くと以下のようになります。 def foo(a,b,c,d): print(a + b + c + d) ary = [2,4,6,8] foo(ary[0],ary[1],ary[2],ary[3]) $ py main.py 20 いちいちary[0]とかを並…

namedtupleによる名前付きタプル

入門Python3 6.14.1 namedtupleを使うことで名前付きのタプルを作ることができます。 from collections import namedtuple Foo = namedtuple('Foo', ('bar', 'baz')) まずはこのコードでbarとbazのプロパティを持つFooクラスが生成されます。 次にFooオブジ…

Pythonで独自クラスで配列をエミュレートしてみる

今回は演算子によるアクセスと、forループのみを実装してみます。配列のエミュレートをするには特殊メソッドを使います。まずは演算子の実装__getitem__で[]演算子で値を取り出す時の処理をエミュレートできます class Foo(): def __getitem__(self,key): re…

Pythonでの演算子のオーバーロード

Pythonでの演算子のオーバーロードは特殊メソッドで実現できます。全部網羅してるわけではないですが、いくつか列挙してみます。 比較演算子系のオーバーロード 特殊メソッド名 例 __lt__(self, other) self __le__(self, other) self __eq__(self, other) s…

オブジェクトからクラスオブジェクトを得る

特殊メソッドである__class__からクラスオブジェクトを得ることができます。 class Foo(): pass foo = Foo() print(Foo) print(foo.__class__) $ py main.py <class '__main__.Foo'> <class '__main__.Foo'>取れてますね。 使い道としては例えば以下のような自分自身を生成するようなメソッドを提供する場</class></class>…

特殊メソッド

入門Python3 6.12 クラスには予め定義されている特殊なメソッドがたくさんあります。「__メソッド名__」というやつです。コンストラクタを実現する__init__も特殊メソッドのひとつです。かなりの種類があるのでとりあえず今はドキュメントにざっくり目を通す…

classmethodによるクラスメソッド

入門Python3 6.10 classmethodデコレータを使うと、クラスメソッドを作ることができます。 class Foo(): def hello(): return "hello foo" @classmethod def hello_print (cls): print(cls.hello()) Foo.hello_print() $ py main.py hello fooclsにはFooクラ…

staticmethodによる静的メソッド

入門Python3 6.10 staticmethodデコレータを使うと、クラスに静的メソッドを作ることができます。 class Foo(): @staticmethod def hello(): return "hello foo" print(Foo.hello()) $ py main.py hello foo と、ここまで書いてみて、あれこれそういやstatic…

デコレータと対象関数が同名のケース

def bar (func): pass @bar def foo (): pass (中身がpassなのはとりあえず横に置いといて)fooの前に@barを付けるのがデコレータなわけですが、これはつまり以下のコードと等価であると def bar (func): pass def foo (): pass foo = bar(foo) # fooの前に…

読み取り専用なプロパティを生成する

入門Python3 6.8 プロパティの続きです。プロパティを定義する時にセッターを用意しなければ読み出し専用のプロパティを生成することができます。 class Foo(): @property def bar(self): return "bar" foo = Foo() print(foo.bar) foo.bar = "new bar" # こ…

Pythonのプロパティについて

入門Python3 6.8 インスタンス変数に直接アクセスするのではなくゲッターやセッターを用意してそっちを使うっていうのは他の言語でもよくやりますね。愚直に実装するなら以下のようになります。 class Foo(): def __init__(self,name): self.__name = name d…

プライベートもどきなインスタンス変数

入門Python3 6.9 この記事でprivateなインスタンス変数は定義できないと書きましたが、変数の先頭にアンダーバーを二個付けることでprivateに近い変数を定義できるということです。 class Foo(): def __init__(self,str): self.__name = str foo = Foo("str"…

メソッドのオーバーライドとsuper

入門Python3 6.4 継承時に基底クラスのメソッドをオーバーライドすることができます class Foo(): def hello(self): print("foo hello") class Bar(Foo): # Foo.helloをオーバーライド def hello(self): print("bar hello") bar = Bar() bar.hello() $ py ma…