Python不明

Habréには、Pythonの未知の機能/微妙さ/機能について語る記事/翻訳がすでにいくつかあります。 私はそれらを繰り返さないようにしますが、それらを補うために試みますが、もしそれがどこかですでに見たことが起こったとしても、心配しないでください。 あなたにとって興味深いものがあると確信しています。



行きましょう。



比較演算子の連鎖:


>>> 1 < 5 < 10 True >>> 1 < 11 < 10 False >>> 1 < 11 > 10 True
      
      





真実は、括弧を追加するとすべての魔法が壊れることです:



 >>> (1 < 11) > 10 False
      
      





ドカ



iterおよび2つのパラメーター


組み込みのiter関数は、渡されたシーケンスの反復子を返します。 ただし、2つのパラメーターを渡す場合、最初のパラメーターはcallable-object、2番目のパラメーターは最初のオブジェクトを呼び出した結果である必要があり、その時点で反復を停止する必要があります。 たとえば、ファイルから最初の空行まで読み取ります。

 with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line)
      
      





ドカ



contextlib


独自のオブジェクト、関数などのVARとしてEXPRを使用して構文を簡単かつ美しく使用できます。 ドキュメントの例:

 from contextlib import contextmanager @contextmanager def tag(name): print "[%s]" % name yield print "[/%s]" % name >>> with tag("h1"): ... print "foo" ... [h1] foo [/h1]
      
      





ドーカPEP 343



デフォルト引数


いくつかの「ハッキング」があります。 まず、デフォルトの引数として可変オブジェクトを使用することは、ほとんど常に悪い考えです。

 >>> def foo(a=list()): ... a.append(1) ... print a ... >>> foo() [1] >>> foo() [1, 1] >>> foo() [1, 1, 1]
      
      





なぜそう 引数のデフォルト値は、関数が作成されfunc_defaultsプロパティに保存されるときに一度だけ決定されます。

 >>> foo.func_defaults ([1, 1, 1],)
      
      







しかし、付属資料と便利なレシピがあります。 次のコードは期待どおりに機能しません。

 >>> l = [] >>> for i in range(3): ... l.append(lambda: i * 2) ... >>> for x in l: ... x() ... 4 4 4
      
      





シンプルかつエレガントに修正できます-lambda:i * 2lambda i = i:i * 2に置き換えるだけです:

 >>> l = [] >>> for i in range(3): ... l.append(lambda i=i: i * 2) ... >>> for x in l: ... x() ... 0 2 4
      
      





実行モデルで名前とそれらへのバインドについて読むことができます。



省略記号


コンテキストに応じて... (3つのポイント)が有効な構文になる場合があります。 したがって、 リスト[...] はEllipsis型のオブジェクトを__getitem__関数に渡します 。これは、この種の唯一のものです。 デモンストレーション:

 >>> class L(list): ... def __getitem__(self, *args): ... print args ... return list.__getitem__(self, *args) ... >>> l[...] (Ellipsis,) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in __getitem__ TypeError: list indices must be integers, not ellipsis
      
      





Numpyでこのチャームを使用しました。



変数値の交換


10年生では、情報学のレッスンで、3つ目の変数を使用せずに2つの変数の値を交換するというタスクが提供されました。 Pythonでは、これは問題ではありません。

 >>> a = 10 >>> b = 5 >>> a, b (10, 5) >>> a, b = b, a >>> a, b (5, 10)
      
      







ネストされたリストの内包表記


リスト内包表記では、次のものに複数使用できます。

 >>> l = [[1,2,3], [4,5,6]] >>> [lll * 2 for ll in l for lll in ll] [2, 4, 6, 8, 10, 12]
      
      







複数の可変オブジェクトの作成


たとえば、5つのリストのリストを作成する必要があります。 私はこれをやりたい:

 >>> l = [[]] * 5 >>> l [[], [], [], [], []]
      
      





ただし、次のことはできません。

 >>> l[0].append(1) >>> l [[1], [1], [1], [1], [1]]
      
      





おそらく次のように良い:

 >>> l = [[] for _ in range(5)]
      
      







rot13、string_escape、unicode_escapeエンコーディング


スーパーシークレットRot13暗号化方法

 >>> 'Hello world!'.encode('rot13') 'Uryyb jbeyq!' >>> 'Uryyb jbeyq!'.decode('rot13') u'Hello world!'
      
      





次。 たとえば、外部ソースからの文字列がありますが、文字列にはリテラル\ n、\ t、\ rなどが含まれます。 フォーマットされた文字列を取得する方法(実際、安全なevalを作成します)?

 >>> s = 'Hello\\n\\rworld!' >>> s 'Hello\\n\\rworld!' >>> repr(s) "'Hello\\\\n\\\\rworld!'" >>> print s.decode('string_escape') Hello world!
      
      





unicode_escapeは、文字列ではなくUnicodeでのみ同様に機能します。 また、文字列「\ u0457」を文字「letter」に変換する方法も知っています。

 >>> print '\u0457'.decode('unicode_escape') ї
      
      





サポートされているエンコーディングのリストはstandard-encodingsです。



テキストラップ


テキストを扱うのに非常に便利です。 長い行で小さなものをたくさん作ります:

 >>> s = "Python is a programming language that lets you work more quickly and integrate your systems more effectively. You can learn to use Python and see almost immediate gains in productivity and lower maintenance costs." >>> print textwrap.fill(s, 25) Python is a programming language that lets you work more quickly and integrate your systems more effectively. You can learn to use Python and see almost immediate gains in productivity and lower maintenance costs.
      
      





ドック -まだおいしいものがたくさんあります。



itertools


純粋な感情。 特にレシピのあるセクションでは、読まないでください。 ここで私はハタを思い出します:

 >>> def grouper(n, iterable, fillvalue=None): ... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" ... args = [iter(iterable)] * n ... return izip_longest(fillvalue=fillvalue, *args) ... >>> list(grouper(2, [1,2,3,4,5,6])) [(1, 2), (3, 4), (5, 6)] >>> list(grouper(3, [1,2,3,4,5,6])) [(1, 2, 3), (4, 5, 6)] >>> list(grouper(4, [1,2,3,4,5,6], fillvalue=0)) [(1, 2, 3, 4), (5, 6, 0, 0)]
      
      





秘theは、1つのイテレーターで作業することです



結論



ほとんどの情報はStackOverFlowのすばらしいトピックからのもので、残りは独自の観察です。 このトピックについて多くのことを書くことができるので、最も興味深く有用なものだけを共有しようとしました。

ご清聴ありがとうございました!

ドキュメンテーションの力があなたと共に来ますように!



PSコメントがある場合-PMのメッセージに非常に感謝します。



All Articles