メインコンテンツまでスキップ

Python: if/for文でのin演算子の各オブジェクト毎の評価

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

if/for文中で使われるin演算子の評価はオブジェクトごとに微妙に変化します。あやふやなままにしておくのもなんですし、ここで、以下のオブジェクトに対するif/for文中の評価を実際に確認してみましょう。

  • 文字列
  • リスト
    • 数値のリスト
    • 文字列のリスト
    • 辞書のリスト
  • 辞書

if/for文 + in 文字列

#!/usr/bin/python
# coding: UTF-8
str1 = "abcdefghijklmn" # 文字列
# if 「検索する文字列」 in 「検索される文字列」:
elem = 'def'
if elem in str1:
print '文字列 "%s" に "%s" は存在する。' % (str1, elem)
print
# for 「要素(文字)」 in 「文字列」:
for ch in str1:
print ch, # str1の先頭の文字から順に繰り返す

実行結果

文字列 "abcdefghijklmn" に "def" は存在する。
a b c d e f g h i j k l m n

if/for文 + in リスト

#!/usr/bin/python
# coding: UTF-8
nums = [1, 2, 3, 4, 5] # 数値のリスト
chs = ['a', 'b', 'c', 'd'] # 文字列のリスト
dics = [{'one':1}, {'two':2}, {'three':3}, {'four':4}] # 辞書のリスト
# if 「検索する要素」 in 「検索されるリスト」:
elem = 3
if elem in nums:
print 'リスト %s に要素の %d は存在する。' % (nums, elem)
elem = 'b'
if elem in chs:
print 'リスト2 %s に要素の %s は存在する。' % (chs, elem)
elem = {'two':2}
if elem in dics:
print 'リスト3 %s に要素の %s は存在する。' % (dics, elem)
print
# for 「リストの要素」 in 「リスト」:
for e_num in nums:
print e_num,
print
for e_ch in chs:
print e_ch,
print
for e_dic in dics:
print e_dic,

実行結果

リスト [1, 2, 3, 4, 5] に要素の 3 は存在する。
リスト2 ['a', 'b', 'c', 'd'] に要素の b は存在する。
リスト3 [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}] に要素の {'two': 2} は存在する。
1 2 3 4 5
a b c d
{'one': 1} {'two': 2} {'three': 3} {'four': 4}

if/for文 + in 辞書

#!/usr/bin/python
# coding: UTF-8
dic = {'one':1, 'two':2, 'three':3, 'four':4} # 辞書
# if 「検索するキー」 in 「検索される辞書」:
elem = 'three'
if elem in dic: # 辞書のキーの検索
print '辞書 %s に要素の「キー」 %s は存在する。' % (dics, elem)
print
# for 「辞書のキー」 in 「辞書」:
for key in dic: # for key in dic.keys(): と同じ
print key,
print
for v in dic.values(): # 値を要素として繰り返す
print v,
print
for (k, v) in dic.items(): # (キー, 値)のタプルを要素として繰り返す
print "%s:%s, " % (k, v),

実行結果

辞書 [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}] に要素の「キー」 three は存在する。
four three two one
4 3 2 1
four:4, three:3, two:2, one:1,

チュートリアル

リファレンス

Python: コマンドライン引数の取得 - sys.argv変数

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

コマンドラインで与える引数によってプログラムの挙動を変えたいという場面はよくあります。Python ではコマンドライン引数は sys モジュールの argv 属性に文字列を要素とするリストとして格納されています。そして、リストの先頭要素(sys.argv[0])はスクリプトファイル名となっています。

ソースコード

# coding: Shift_JIS
import sys # モジュール属性 argv を取得するため
argvs = sys.argv # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数
# デバッグプリント
print argvs
print argc
print
if (argc != 2): # 引数が足りない場合は、その旨を表示
print 'Usage: # python %s filename' % argvs[0]
quit() # プログラムの終了
print 'The content of %s ...n' % argvs[1]
f = open(argvs[1])
line = f.readline() # 1行読み込む(改行文字も含まれる)
while line:
print line
line = f.readline()
f.close

text.txt

It is meaningless only to think my long further aims idly.
It is important to set my aims but at the same time I should confirm my present condition.
Unless I set the standard where I am in any level, I'll be puzzled about what I should do from now on.

実行結果

引数を指定しない場合

$ python argv01.py
['argv01.py']
1
Usage: # python SCRIPTNAME.py filename

引数を指定した場合

$ python argv01.py text.txt
['argv01.py', 'text.txt']
2
The content of text.txt ...
It is meaningless only to think my long further aims idly.
It is important to set my aims but at the same time I should confirm my present condition.
Unless I set the standard where I am in any level, I'll be puzzled about what I should do from now on.

リファレンス

C++, boost::thread : スレッドの同期と排他制御 - mutex、conditionクラス

· 約5分
Yu Sasaki
Enterprise Security Manager / Advisor

複数のスレッドから1つの変数にアクセスする際、システム側のスレッドスケジューリング次第で、予期せぬ書き換えが起こってしまう場合があります。その為、ある1つのスレッドが変数にアクセスしている際は他のスレッドをブロックする排他制御やスレッドの同期を行う必要があります。C++でJavaのsynchronizedメソッド/ブロックと同じような記法でクリティカルセクションを実装する方法の1つにboost::threadライブラリのmutexとconditionクラスがあります。

C++, boost::thread : スレッドグループの生成と実行

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

同じような処理を行うスレッドが複数ある場合は、それらをスレッドグループでまとめると、スレッドへの操作がやり易くなります。スレッドグループへの登録には、boost::thread ライブラリの thread_group クラスを用いて、メンバ関数 create_thread() の引数にマルチスレッドで実行したい関数のアドレスを指定します。

それでは下記のサンプルで実際にその過程と実行結果を確認してみましょう。

Python: 正規表現の基本 - 文字範囲の指定「[ ]」

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

# coding: Shift_JIS
import re # 正規表現を扱うモジュールのインポート
# 正規表現のチェックプリント用の関数
def PrintRegMatch(pat, txt):
# 探索される文字列をテキスト
# 探索する 文字列をパターン
# 書式: re.match(パターン, テキスト)
m = re.match(pat, txt) # パターンにマッチしなかった場合はNoneを返す
if m != None: print 'パターン"%s"はテキスト"%s"にマッチ「する」' % (pat, txt)
else: print 'パターン"%s"はテキスト"%s"にマッチ「しない」' % (pat, txt)
# []で括られた文字の内どれか1つにマッチすれば真
PrintRegMatch('[ABC]D', 'CD') # A or B or C の次に D がくるパターンにマッチ
PrintRegMatch('[A-C]E', 'CE') # [A-C]は[ABC]と同意
print
# [A-Z]は全てのアルファベット大文字の内のどれか1つの意
PrintRegMatch('[A-Z]*END', 'CHSHSBSRAWRGARENDGREW')
PrintRegMatch('A[A-Z]*E', 'AgafgafE')
PrintRegMatch('A[a-z]*E', 'AewnglfngowE')
# [0-9]は0~9の数字の内どれか1つの意
PrintRegMatch('[0-9]*-[0-9]*-[0-9]*', '03-3333-2222')
print
# []内の「^」否定
PrintRegMatch('[^ABC]D', 'DD') # A or B or C でない文字の次に D がくるパターンにマッチ
PrintRegMatch('[^A-Z]*-[^A-Z]*', '164-9999')
print
PrintRegMatch('[ABC][DEF]', 'CE')
PrintRegMatch('[ABC][DEF]', 'CC')
PrintRegMatch('[a-zA-Z]*', 'FjAVzxRUqyOIn')
PrintRegMatch('[a-z][A-Z]*', 'FjAVzxRUqyOIn')
PrintRegMatch('[a-z]*[A-Z]*', 'FjAVzxRUqyOIn')

実行結果

パターン"[ABC]D"はテキスト"CD"にマッチ「する」
パターン"[A-C]E"はテキスト"CE"にマッチ「する」
パターン"[A-Z]*END"はテキスト"CHSHSBSRAWRGARENDGREW"にマッチ「する」
パターン"A[A-Z]*E"はテキスト"AgafgafE"にマッチ「しない」
パターン"A[a-z]*E"はテキスト"AewnglfngowE"にマッチ「する」
パターン"[0-9]*-[0-9]*-[0-9]*"はテキスト"03-3333-2222"にマッチ「する」
パターン"[^ABC]D"はテキスト"DD"にマッチ「する」
パターン"[^A-Z]*-[^A-Z]*"はテキスト"164-9999"にマッチ「する」
パターン"[ABC][DEF]"はテキスト"CE"にマッチ「する」
パターン"[ABC][DEF]"はテキスト"CC"にマッチ「しない」
パターン"[a-zA-Z]*"はテキスト"FjAVzxRUqyOIn"にマッチ「する」
パターン"[a-z][A-Z]*"はテキスト"FjAVzxRUqyOIn"にマッチ「しない」
パターン"[a-z]*[A-Z]*"はテキスト"FjAVzxRUqyOIn"にマッチ「する」

リファレンス

Python: 正規表現の基本 - 繰り返し「*」「+」「?」

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

# coding: Shift_JIS
import re # 正規表現を扱うモジュールのインポート
# 正規表現のチェックプリント用の関数
def PrintRegMatch(pat, txt):
# 書式: re.match(パターン, テキスト)
m = re.match(pat, txt) # パターンにマッチしなかった場合はNoneを返す
if m != None: print 'パターン"%s"はテキスト"%s"にマッチ「する」' % (pat, txt)
else: print 'パターン"%s"はテキスト"%s"にマッチ「しない」' % (pat, txt)
txt = 'ABCDEFGH' # 探索される文字列をテキスト
# 探索する 文字列をパターン
# 「*」: 直前の文字の0回以上の繰り返しにマッチ
PrintRegMatch('.*CDE', txt)
PrintRegMatch('A.*H', txt)
PrintRegMatch('A*BC', txt)
PrintRegMatch('A.*BC', txt)
PrintRegMatch('A*', '')
print
# 「+」: 直前の文字の1回以上の繰り返しにマッチ
PrintRegMatch('.+DEF', txt)
PrintRegMatch('A.+H', txt)
PrintRegMatch('A+BC', txt)
PrintRegMatch('A.+BC', txt)
PrintRegMatch('A+', '')
print
# 「?」: 直前の文字の0or1回の繰り返しにマッチ
PrintRegMatch('^A?.+$', txt)
PrintRegMatch('^B?$', '')
PrintRegMatch('^C?E', 'E')
PrintRegMatch('A.?H', txt)
PrintRegMatch('BBB?C', 'BBC')

実行結果

パターン".*CDE"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A.*H"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A*BC"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A.*BC"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A*"はテキスト""にマッチ「する」
パターン".+DEF"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A.+H"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A+BC"はテキスト"ABCDEFGH"にマッチ「する」
パターン"A.+BC"はテキスト"ABCDEFGH"にマッチ「しない」
パターン"A+"はテキスト""にマッチ「しない」
パターン"^A?.+$"はテキスト"ABCDEFGH"にマッチ「する」
パターン"^B?$"はテキスト""にマッチ「する」
パターン"^C?E"はテキスト"E"にマッチ「する」
パターン"A.?H"はテキスト"ABCDEFGH"にマッチ「しない」
パターン"BBB?C"はテキスト"BBC"にマッチ「する」

リファレンス

Python: 正規表現の基本 - メタ文字「.」「^」「$」

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

# coding: Shift_JIS
import re # 正規表現を扱うモジュールのインポート
# 正規表現のチェックプリント用の関数
def PrintRegMatch(pat, txt):
# 書式: re.match(パターン, テキスト)
m = re.match(pat, txt) # パターンにマッチしなかった場合はNoneを返す
if m != None: print 'パターン"%s"はテキスト"%s"にマッチ「する」' % (pat, txt)
else: print 'パターン"%s"はテキスト"%s"にマッチ「しない」' % (pat, txt)
txt = 'ABCDEFGH' # 探索される文字列を「テキスト」
# 探索する 文字列を「パターン」
PrintRegMatch('ABC', txt)
PrintRegMatch('FGH', txt)
print
# メタ文字を用いたマッチング
# 「.」任意の1文字にマッチ
PrintRegMatch('.BCD', txt)
PrintRegMatch('....EFGH', txt)
PrintRegMatch('...EFGH', txt)
print
# 「^」は文字列の先頭にマッチするパターン(MULTILINEフラグを設定すると行頭にもマッチ)
PrintRegMatch('^ABC', txt)
PrintRegMatch('^BCD', txt)
print
# 「$」は文字列の末尾にマッチするパターン(MULTILINEフラグを設定すると行末にもマッチ)
PrintRegMatch('EFGH$', txt)
PrintRegMatch('....EFGH$', txt)

実行結果

パターン"ABC"はテキスト"ABCDEFGH"にマッチ「する」
パターン"FGH"はテキスト"ABCDEFGH"にマッチ「しない」
パターン".BCD"はテキスト"ABCDEFGH"にマッチ「する」
パターン"....EFGH"はテキスト"ABCDEFGH"にマッチ「する」
パターン"...EFGH"はテキスト"ABCDEFGH"にマッチ「しない」
パターン"^ABC"はテキスト"ABCDEFGH"にマッチ「する」
パターン"^BCD"はテキスト"ABCDEFGH"にマッチ「しない」
パターン"EFGH$"はテキスト"ABCDEFGH"にマッチ「しない」
パターン"....EFGH$"はテキスト"ABCDEFGH"にマッチ「する」

リファレンス

Python: SQLiteにデータを格納、検索、出力 - pysqlite

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

レコードの検索や格納処理性能がオープンソースのDBで間に合う程度の問題であれば、積極的に使っていきたいです。それによって、他のロジックのコーディングに傾注できます。また、DBという共通のプラットフォームは複数言語から扱えますので、データの再利用がしやすいです。 さて、今回はPythonからSQLiteを扱うサンプル(pysqliteの使い方)を書いてみます。

ソースコード

# coding: UTF-8
from pysqlite2 import dbapi2 as sqlite
# データベースに接続(作成)
con = sqlite.connect('test1.db')
# テーブルの列要素: 名前、性別(male or female)、年齢
con.execute('CREATE TABLE people (name TEXT, sex TEXT, age INTEGER)')
# テストデータの挿入(1行はタプルで)
con.execute('INSERT INTO people VALUES ("Taro", "male", 22)')
con.execute('INSERT INTO people VALUES ("Hanako", "female", 38)')
con.execute('INSERT INTO people VALUES ("Ranka", "female", 17)')
con.execute('INSERT INTO people VALUES ("Ozuma", "male", 40)')
con.commit() # DBに反映
# データの検索
cur = con.execute('SELECT * FROM people')
# データの出力
print 'NAMEt SEXt AGE'
for row in cur:
print '%-8s %-6s %2d' % row # 1行のデータ構造はタプル
con.close()

実行結果

NAME SEX AGE
Taro male 22
Hanako female 38
Ranka female 17
Ozuma male 40

C++, boost::thread : スレッドの生成と実行

· 約5分
Yu Sasaki
Enterprise Security Manager / Advisor

C/C++でスレッドを扱う場合は、プラットフォームによって使用するライブラリが違います。 Windows なら Windows API の thread で、 UNIX や Linux 系ならば pthread ライブラリ等を使用します。プラットフォーム依存するコードは可搬性に難があり、解決策の1つとしてプリコンパイルで依存部分をプラットフォームに合わせたライブラリを選択してコンパイルする方法があります。

Python: 文字列の検索 - index()、reindex()メソッド

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
# 文字列の検索 | index(), reindex()の使い方
s1 = 'Hello, Jan !'
# 引数(パターン)が1文字の文字列
try:
i = s1.index('l') # 引数で与えられた文字列を先頭から探索した場合の出現位置を返す
except ValueError:
i = None # 存在しない場合は例外ValueErrorがなげれられる
print i, s1[i]
try:
i = s1.rindex('l') # 末尾から探索した場合の最初の出現位置を返す
except ValueError:
i = None
print i, s1[i]
print
# 引数(パターン)が2文字以上の文字列
str = 'lo'
try:
i = s1.index(str)
except ValueError:
i = None
print i, s1[i]
try:
i = s1.rindex(str)
except ValueError:
i = None
print i, s1[i]
print
# 引数で与えられた文字列(パターン)が存在しない場合
try:
i = s1.index('Max')
except ValueError:
i = None
print i

実行結果

2 l
3 l
3 l
3 l
None

リファレンス

チュートリアル