Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

現在実行されているPythonのバージョンを調べる

Python2とPython3は一部致命的に挙動が異なるため、ちゃんと見てあげないとひどい目に遭う事があります。

どちらの環境でも実行され得る場合、早めに分岐させておくのも手です。

実際のところ

sysモジュールを導入すれば、バージョン情報を調べる事ができます。

import sys
sys.version_info
#>> sys.version_info(major=3, minor=4, micro=3, releaselevel='final', serial=0)

並び順でゼロ番目の値がメインバージョンなので、分岐させたい場合以下のように記述できるって事です

import sys

PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3

if PY3:
   actForPython3()
else:
   actForPython2()

Tera termでデバッグモードが起動できない場合、管理者権限で再実行すると何とかなる可能性がある

Tera Termのデバッグモードが実行できない場合の対処法です。
結論から書くと「管理者権限」でTera Termを再実行してください。

実際のところ

Virtual Storeの影響

shuzo-kino.hateblo.jpの記事にて、

Windows7では管理者として実行しないと shift+ESCを押してもデバッグモードに切り替わらないことがありました。

との情報を頂きました。
OSのバージョンにかかわらず、発生するケースかもしれないので
似た問題が発生している方はお試しください。
tama様、ありがとうございます。

……と書いたところ
Teratermの開発者いわもとこういち氏から直接ご意見を頂くことに

Tera Term側では管理者権限の有無で動作を変えるような事はしていないです。
原因を想像すると、Virtual Storeの影響じゃないかなと思います。
例えば、
1. Tera TermをC:\Program Files等の管理者権限が必要なフォルダにインストールする
2. 一般ユーザで設定の保存を実行する → 権限が無い為Virtual Storeに保存される
3. 管理者権限でTERATERM.INIを編集する
という状況だと、一般ユーザからは 2 のVirtual Storeに保存された設定ファイルが使われるので 3 の編集内容が反映されないように見えます。

これについては、別途記事にしました。
興味がある方は読んでみてください。

他のソフトがホットキーを上書き

いわもとこういち氏から、実際の例として以下のような情報を頂きました。

ちょっと興味深い事例として、他のソフトがホットキーとしてShift+Escを奪っていたというのが有りました。
管理者権限で起動したウィンドウは他のソフトが設定したホットキーが無効になるので、管理者権限の時のみデバッグモードが有効になったように見えるという事になります。
聞いた例では Intel Management and Security Status というソフトがShift+Escを奪っていたそうです。

別のアプリが何らかの理由でホットキーを奪っているケースがありうるという事です。
この場合も、管理者権限で実行すれば何とかなるそうです。

リスト内包表記なる魔界記法 その1:配列型

リスト内包表記はforをデータ型の中でブン回して新しいリスト系データをつくる方法です。
今まで何となく使ってましたが、ちゃんと名前が付いてるんですね。
正規表現みたいなモンで最初は癖があっても慣れれば簡潔かつ高速に欲しいデータを記述できます。

実際のところ

例えば……

  • 0x1 ~ 0xfの内、2の倍数のモノを二ビットシフト(四倍)したもの

なる条件を満たした配列を作るには以下のようにします。

[ x << 2 for x in range(0x1,0xf) if x%2 == 0 ]
# [8, 16, 24, 32, 40, 48, 56]

あるいは、

  • foobarという文字列の内、o以外の文字を10字"_"で右づめ……なる条件も
[x.rjust(10,"_") for x in "foobar" if x is not "o" ]
# ['_________f', '_________b', '_________a', '_________r']

これを各要素を改行して文字列として表示したい場合

print("\n".join([x.rjust(10,"_") for x in "foobar" if x is not "o" ]))
#_________f
#_________b
#_________a
#_________r

if節はin節は延々と続けることができるので、以下の様な記述も可能
shuzo-kino.hateblo.jp

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
#>> [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

参考

単純にメソッドを実行したり、変化するクラス変数を放り込んだりする時にもスマートに記述できる。
shuzo-kino.hateblo.jp

標準組み込みのタプル型を使い方

タプル型は変更不能のデータ型です。

x = (1,2,3,'a')

x[3]
#>> 'a'

違った値をぶち込もうとすると、エラーを吐きます

x[3] = 'b'
#>> Traceback (most recent call last):
#>>  File "<stdin>", line 1, in <module>
#>> TypeError: 'tuple' object does not support item assignment

in節も使えたり。

2 in x
#>> True

コロン記法も。

x[1:4:2]
#>> (2, 'a')

変わったところでは、辞書型のキー要素としても使える所でしょうか。
GPSだとか、複雑なデータが生じた際のトリガーとして有用そう

geo = {(35.658611, 139.745556): "TokyoTower",(36.737917, 139.501972): "Kegon Falls"}

geo[(36.737917, 139.501972)]
#>>'Kegon Falls

Google翻訳にはデフォで中国語入力機能がついてる(ほかの言語も)

Google翻訳にはデフォで中国語入力機能がついています。
いつの間にか追加されたか、それとも前からあったのか……

実際のところ

Google翻訳で中国語のモードを選択すると、左下に何やらアイコンが見えます
f:id:shuzo_kino:20160819185924p:plain

デフォでは左下を向いた鉛筆マーク*1のようのです。
これをピンイン入力の「拼*2」を選択。
私は簡体字で勉強してるので一番上で……。
f:id:shuzo_kino:20160819191322p:plain
あとは通常のピンイン入力機能。
かなり性能がいいので、長めな文章でも割とスマートに解釈してくれます。
f:id:shuzo_kino:20160819185928p:plain

ほかの言語でもある

確認した限り、以下の言語入力にも対応しています。
簡易的なオンライン多言語エディタとして使えるかも……

*1:手書き

*2:pin、ピンインの略かと

forにelse節が入る

Pythonのfor文にはelse節があります。
公式ではこんな感じで説明されている。

for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]

実際のところ

for s in [1,2,3,range(1,4)][3]:
  print(s)
else:
  print("fin\n")

#>> 1
#>> 2
#>> 3
#>> fin
#>> 

forはiterableなものであれば要素でもブン回せる

forはiterableなものであれば要素でもブン回す事ができます。
公式には、以下のように記載されています。

for 文は、シーケンス (文字列、タプルまたはリスト) や、その他の反復可能なオブジェクト (iterable object) 内の要素に渡って反復処理を行うために使われます:

実際のところ

通常、リスト型の要素に対しforをぶん回す事はできません。

for s in [1,2,3,'foobar'][2]:
  print(s)
#>> Traceback (most recent call last):
#>>  File "<stdin>", line 1, in <module>
#>> TypeError: 'int' object is not iterable

rangeのように、それ自体がforの対象になるようなオブジェクトの場合、ぶん回す事が可能です。

for s in [1,2,3,range(1,4)][3]:
  print(s)
#>> 1
#>> 2
#>> 3

文字列も

for s in [1,2,3,'foobar'][3]:
  print(s)
#>> f
#>> o
#>> o
#>> b
#>> a
#>> r