yohhoyの日記

技術的メモをしていきたい日記

2015-01-01から1年間の記事一覧

リスト内包表記中のif-else構文

Pythonのリスト内包表記でif-else構文を使うときのメモ。ifのみとの記述場所の違いに注意。 a = [1, 2, 3, 4] [x for x in a if x < 2] # [3, 4] [x if x % 2 == 0 else 0 for x in a] # [0, 2, 0, 4] [x if x % 2 == 0 else 0 for x in a if 2 < x] # [0, 4…

mutexモジュールはマルチスレッド処理には使えない

2020-01-01をもって Python2はEOL を迎えている。Python 2.x系にある mutexモジュール は、(その名前に反して)マルチスレッド処理には使えない。同モジュールはPython 2.6以降で非推奨、Python 3系では削除された。代わりに threading.Lockオブジェクト を…

(翻訳)書籍"Effective Python" アイテム一覧

Brett Slatkin氏による書籍 "Effective Python: 59 Specific Ways to Write Better Python" より、アイテム一覧(目次)を抄訳。Python 2.x/3.x両バージョンを対象とする。 http://www.effectivepython.com/ http://www.informit.com/store/effective-pytho…

Windows環境でもPythonスクリプトshebangはちゃんと書く

Pythonスクリプトのshebang(1行目の#!)*1はWindows環境でも効果がある。Windows OSにPython 3.3以降を導入すると、C:\Windowsフォルダ以下にPythonランチャpy.exeがインストールされる。Python 2/3両バージョンがインストールされている場合、同ランチャ…

Double Brace Initializationイディオム

JavaコレクションやネストしたGUIコンポーネントを、1論理行っぽく初期化する方法。Double Brace Initializationイディオム(2重ブレース初期化)とも呼ばれる。 List<String> list = new ArrayList<String>() {{ add("foo"); add("bar"); add("zot"); }}; add(new JPanel() </string></string>…

キーワード引数の強制

Pythonの関数定義において、キーワード引数形式でのみ実引数を渡せる(keyword-only arguments)よう強制する方法。 # Python 3.x def f(a, b, *, x=None, y=None): print("a={} b={} x={} y={}".format(a, b, x, y)) f(1, 2) # OK: a=1 b=2 x=None y=None f(1…

自作デコレータの書き方

Pythonで自作のデコレータ(decorator)記述方法についてメモ。functoolsパッケージを利用すると、デコレータ式適用後にも元関数の__name__や__doc__を簡単に引き継げる。(汎用デコレータでなければ不要かもしれない) 引数無しデコレータ @my_deco def func(…

関数パラメータ型としてのauto?

gcc(g++) 4.9.0以降/gnu++1zモードでは、関数パラメータ型として auto キーワードを利用できる。これはC++1zに向けて提案されているConcepts Lite拡張の一部。2019-01-11追記:C++2a(C++20)言語仕様に向けて、abbreviated function template 構文を含むP114…

.NET−Javaブリッジライブラリ

.NETクラスとJavaクラス間の相互運用を可能にするライブラリ。MITライセンス(本体)+GPLv3(ツール)。 http://jni4net.com/ https://github.com/jni4net/jni4net .NET CLRとJVMを同一プロセス内で動作させ、.NETクラスからProxyクラス経由でのJavaクラス…

const値型へのユーザ定義変換演算子と引数lvalue/rvalueオーバーロードの落とし穴

C++11以降では、ユーザ定義変換演算子(user-defined conversion operator)の戻り値型をconst Tよりも非constなTとしたほうが良い。関数オーバーロードで引数型const T&およびT&&を受ける関数*1へ渡す際に、同関数呼び出し時のオーバーロード解決失敗によるコ…

forward_listはsizeメンバ関数を持たない

C++

C++11標準ライブラリで新しく追加されたstd::forward_listシーケンスコンテナは、要素数を返すsizeメンバ関数を提供しない。(空判定のemptyメンバ関数は提供される。) #include <forward_list> std::forward_list<int> fl = /*...*/; size_t n = fl.size(); // NG: ill-formed</int></forward_list>…

文字列リテラルは変更できないlvalue

C C++

C/C++言語では、文字列リテラル(string literal)は lvalue に分類される。ただし文字列リテラルの変更は未定義動作(undefined behavior)を引き起こす。文字列リテラル以外のリテラルは rvalue(prvalue) に分類される。(通常の)文字列リテラル型は、C++では…

std::listのsplice操作とallocator

C++

C++標準シーケンスコンテナstd::listが提供するsplice操作では、両コンテナのアロケータが等しくなければならない。 #include <list> std::list<int> list1 = { 1, 2, 3 }; std::list<int> list2 = { 4, 5, 6 }; std::list<int, SomeAllocator> list3 = { 42 }; list1.splice(list1.end(), list2)</int,></int></int></list>…

raw文字列の落とし穴

Pythonのraw文字列(raw string)記法では、その末尾を奇数個のバックスラッシュ(\)とできない。Windows上のフォルダパス名を表現するときなどで特に注意。 # SyntaxError: EOL while scanning string literal が発生 path_ng = r"C:\User\foobar\" path_ok = …

汎用ラムダキャプチャとunique_ptr型とmove関数の小さな罠

C++

C++14で導入された汎用ラムダキャプチャ(generalized lambda capture)と、コピー不可かつムーブ可能オブジェクトの扱いについてメモ。汎用ラムダキャプチャ構文でムーブキャプチャしたstd::unique_ptr型の変数up1を、そのラムダ式中でさらに変数up2へムーブ…

文字列フォーマット中の変数展開

プログラミング言語Pythonにおいて、Perl, PHPの変数展開や、Rubyの式展開(の変数名のみ)をエミュレーション。引数なしvars関数の代わりにlocals関数でもOK。 a = 42 b = "abc" print("a={a}, b={b}".format(**vars())) # 出力: a=42, b=abc 関連URL strin…