UP
型についてのあれこれ(8) - コレクションとfor文
前のページへ
Python
次のページへ
クラス


inのいろいろ

【 目次 】

pythonの「in」の解釈って

pythonでは複数の局面で「in」が出現する。
人のコードをながめていて
execのinはどんな意味?
と、
考え込んでしまって...

forループのin

まず、よく出てくるのが、forループとともに使われるコレクションに含まれる値を列挙する時に使われるin。

for element in iterable:

比較演算子「in」

比較演算に使われるin。

if文とともに使われる事が多い、文字列やコレクションに値が含まれているかを検査する。

タプルやリストの要素に含まれているかどうかを調べる。

tpl=('a','b','c')
if 'b' in tpl:
    print u"tplにbが含まれています。"

indexメソッド, countメソッドも参考に。

文字列が含まれているかどうかの確認

文字列に文字が含まれているかどうか

if "b" in "abc":
    print u"文字列にbが含まれています。"

文字列に文字が含まれているかどうか

if "bc" in "abc":
    print u"文字列にbcが含まれています。"

文字列が含まれているかどうかについては、findも参考に。
リスト型のようにindex メソッドやcount メソッドもある。

文字列を逆から検索するrfindメソッドやrindexメソッドもある。

辞書にもin演算子が使える

辞書のキーに含まれているかどうか

if u"カツ丼" in {u"天丼": u"900円",u"カツ丼": u"800円",u"海鮮丼": u"1000円"}:
    print u"辞書のキーにカツ丼が含まれています。"

python2ではhas_keyメソッドも使えたがpython3では廃止されたようだ。

辞書の値に含まれているかどうか

if u"800円" in {u"天丼": u"900円",u"カツ丼": u"800円",u"海鮮丼": u"1000円"}.itervalues():
    print u"辞書の値に800円が含まれています。"

集合にも使える

if u"カツ丼" in set([u"天丼", u"カツ丼", u"海鮮丼"]):
    print u"集合にはにカツ丼が含まれています。"

inの否定 - 含まれていない事を確認

inの否定はnot inとなる。
リストの例を示す。

if u"うな丼" not in [u"天丼", u"カツ丼", u"海鮮丼"]:
    print u"リストにはにうな丼は含まれていません。"

execのin

python2のexec文にもinが使われる。

execとeval

まずは、execとevalの違いから。

  • evalは単一の式を評価(evaluate an expression)
  • execは複数の文を実行(execute statements)

...
evalは式を評価して、評価した値を返してくれます。基本は「名前 = eval(式)」という形で使うことになるかと思います。
evalが単一の式を評価するのに対し、execは式を含む複数の文を実行します。

そしてexec in

この参照変数の辞書変数割当先の辞書とは何だろう?

いずれの場合でも、オプションの部分が省略されると、コードは現在のスコープ内で実行されます。

つまり、

exec "x=1"
print x

実行結果

1

execを実行した結果の状態が現在のスコープに反映されるという事か

in の後ろに一つだけ式を指定する場合、その式は辞書でなくてはならず、グローバル変数とローカル変数の両方に使われます。これらはそれぞれグローバル変数とローカル変数として使われます。 locals を指定する場合は何らかのマップ型オブジェクトにせねばなりません.

なにやら表現が難しくて何を言っているかよくわからない。
わからない場合は、テストコードを作成して実際の動作を確認してみるか。

in の後ろに一つだけ式を指定,辞書に変数yの値として99を指定して、exec文を実行。

dic = {"y": 99}
exec "x=1" in dic
print x

変数xが定義されていないというエラーが発生。

実行結果

Traceback (most recent call last):
  File "xxx.py", line xx, in 
    print x
NameError: name 'x' is not defined

今度はオプションの部分を指定したので、コードは現在のスコープに反映されないという事か。

ちなみに、inに渡した辞書dicのexec文実行後の値を確認してみる。

dic = {"y": 99}
exec "x=1" in dic
print dic

実行結果

{'y': 99, '__builtins__': {'bytearray': , 途中省略  'WindowsError': }, 'x': 1}

なにやらexecに渡したdicの値(y=99)にglobals関数の実行結果のような値がdicに格納されている。
そして,execの実行結果(x=1)も追加されている。

では、in の後ろにオプションを2つ追加したらどうなるだろう?

dic_in = {"x": 10, "y": 99}
dic_out = {"z": -100}
exec "x=x+1" in dic_in,dic_out
print "dic_in = ",dic_in
print "dic_out = ", dic_out

実行結果

dic_in =  {'y': 99, 'x': 10, '__builtins__': {'bytearray': , ... 以降略
dic_out =  {'x': 11, 'z': -100}

dic_inにはdic_inに渡したx=10の値を含むコード実行前のglobals変数の値が関数の実行結果のような値がdicに格納されていて、 dic_outにはdic_outに渡した変数zの値にコード実行後変更されたxの値が追加されているようだ。
dic_inに渡したyの姿はdic_outには無い。

参照変数の辞書変数割当先の辞書とはこの事を言っているのだろう。

よくわからなかったからいろいろ調べてみたけど、これってなんかの役に立つかな?

補筆

python3のexec関数

python3ではexecは文ではなく関数に変更されている。

python3のexec関数についての詳しい記述が、

execfile

ファイルからコードを読み込み実行をおこなうexecfile関数も用意されている。

でもpython3ではこの関数は廃止されていて、別のコードに置き換える必要がある。。

ページのトップへ戻る