Python:あなたが知らないかもしれないこと

Pythonは、いくつかの場所で美しく神秘的な言語です。 そして、それを非常によく知っていても、遅かれ早かれ、あなたが以前に使用したことのない何かを見つけるでしょう。 この投稿は、多くの人が注意を払っていない言語の詳細の一部を反映しています。 私はすぐに言わなければなりません:多くの例は実用的ではありませんが、それゆえ、それほど面白くないです。 また、多くの例は非Pythonスタイルを示していますが、私は新しい標準のふりをしません-このように何ができるかを示したいだけです。



1.無限にネストされたリスト



>>> a = [1, 2, 3, 4] >>> a.append(a) >>> a [1, 2, 3, 4, [...]] >>> a[4] [1, 2, 3, 4, [...]] >>> a[4][4][4][4][4][4][4][4][4][4] == a True
      
      





辞書でも同じ:

 >>> a = {} >>> b = {} >>> a['b'] = b >>> b['a'] = a >>> print a {'b': {'a': {...}}}
      
      







2.リストのフォーマット



 >>> l = [[1, 2, 3], [4, 5], [6], [7, 8, 9]] >>> sum(l, []) [1, 2, 3, 4, 5, 6, 7, 8, 9]
      
      





リストジェネレーター( thanks magic4x ):

 [y for x in data for y in x]
      
      





代替であるが長いオプション( モノリシックの おかげ ):

 import itertools data = [[1, 2, 3], [4, 5, 6]] list(itertools.chain.from_iterable(data))
      
      





 from functools import reduce from operator import add data = [[1, 2, 3], [4, 5, 6]] reduce(add, data)
      
      







3.辞書ジェネレーター



多くの人がリストジェネレーターについて知っていますが、辞書ジェネレーターについてはどうでしょうか?

 >>> {a:a**2 for a in range(1, 10)} {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
      
      







4.ワンタイムクラス関数



一度だけ使用される関数が必要な場合、その後は別の関数が使用されます:

 class foo: def normal_call(self): print("normal_call") def call(self): print("first_call") self.call = self.normal_call
      
      





 >>> y = foo() >>> y.call() first_call >>> y.call() normal_call >>> y.call() normal_call
      
      







5.クラス属性の取得



 class GetAttr(object): def __getattribute__(self, name): f = lambda: "Hello {}".format(name) return f
      
      





 >>> g = GetAttr() >>> g.Mark() 'Hello Mark'
      
      







6.セットの操作



セット-繰り返し要素がないセット:

 >>> a = set([1,2,3,4]) >>> b = set([3,4,5,6]) >>> a | b #  {1, 2, 3, 4, 5, 6} >>> a & b #  {3, 4} >>> a < b #  False >>> a - b #  {1, 2} >>> a ^ b #   {1, 2, 5, 6}
      
      





セットセットがないと、これらの操作は機能しません。 セットジェネレーターでない限り( ZyXIの おかげで ):

 { x for x in range(10)} #   set([1, 2, 3]) == {1, 2, 3} set((i*2 for i in range(10))) == {i*2 for i in range(10)}
      
      







7.比較演算子



 >>> x = 5 >>> 1 < x < 10 True >>> 10 < x < 20 False >>> x < 10 < x*10 < 100 True >>> 10 > x <= 9 True >>> 5 == x > 4 True
      
      







8.新しいクラスを動的に作成する



 >>> NewType = type("NewType", (object,), {"x": "hello"}) >>> n = NewType() >>> nx 'hello'
      
      





通常と同じオプション:

 >>> class NewType(object): >>> x = "hello" >>> n = NewType() >>> nx "hello"
      
      







9.辞書でのKeyError例外の抑制



辞書には.get()メソッドがあります。 通常の場合、存在しないキーname_dict ['key']を呼び出すと、KeyError例外が発生します。 ただし、 d.get( 'key')メソッドを使用してキーを呼び出す場合、例外はありません。キーがない場合、辞書はNoneを返します。 不足しているキーの代わりに変数を割り当てる場合は、2番目のパラメーターd.get( 'key'、0)を割り当てることができます。



これは、数値キーを列挙するときに最もよく使用されます。

 sum[value] = sum.get(value, 0) + 1
      
      







10.辞書のリストに追加する



複数のキー値を保存する必要がある場合、それらをリストに保存できます。



 >>> d = {} >>> a, b = 4, 5 >>> d[a] = list() >>> d {4: []} >>> d[a].append(b) >>> d {4: [5]}
      
      







11.条件による変数の割り当て



 x = 1 if (y == 10) else 2 # X  1,  ,  Y  10.     - X  2 x = 3 if (y == 1) else 2 if (y == -1) else 1 #   .    elif
      
      







12.値を変数に展開する



値を割り当てるときにさらに変数がある場合は、変数名の先頭にアスタリスクを追加すると、残りの変数が割り当てられます(Python 3.xのみ)。

 >>> first,second,*rest = (1,2,3,4,5,6,7,8) >>> first #   1 >>> second #   2 >>> rest #    [3, 4, 5, 6, 7, 8]
      
      





 >>> first,*rest,last = (1,2,3,4,5,6,7,8) >>> first 1 >>> rest [2, 3, 4, 5, 6, 7] >>> last 8
      
      







13.リスト項目の番号付け



 >>> l = ["spam", "ham", "eggs"] >>> list(enumerate(l)) >>> [(0, "spam"), (1, "ham"), (2, "eggs")] >>> list(enumerate(l, 1)) #        >>> [(1, "spam"), (2, "ham"), (3, "eggs")]
      
      







14.例外でelseを使用する



animeshneGを修正してくれてありがとう

 try: function() except Error: #    try    Error else: #   try    except finally: #    
      
      







15.リストのコピーを作成する



通常の方法を使用してコピーを作成すると、次のことが起こります。

 >>> x = [1, 2, 3] >>> y = x >>> y[2] = 5 >>> y [1, 2, 5] >>> x [1, 2, 5]
      
      





正しいオプション:

 >>> x = [1,2,3] >>> y = x[:] >>> y.pop() 3 >>> y [1, 2] >>> x [1, 2, 3]
      
      





ネストされたリスト\辞書をコピー( denisbalykoに 感謝

 import copy my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]} my_copy_dict = copy.deepcopy(my_dict)
      
      







16. forの番号付け



forループを介して出力するときに要素を列挙するには、 enumerateメソッドを使用します

 >>> l = ['a', 'b', 'c', 'd', 'e'] >>> for i, value_list in enumerate(l, 1): #  1 -   >>> print(i, value_list) ... 1 a 2 b 3 c 4 d 5 e
      
      







17.関数のデフォルト



デフォルトで間違った引数に関数を割り当てると、次のような結果になる場合があります。

 >>> def foo(x=[]): ... x.append(1) ... print x ... >>> foo() [1] >>> foo() [1, 1] #    [1] >>> foo() [1, 1, 1]
      
      







代わりに、デフォルトで引数をNoneに設定します。

 >>> def foo(x=None): ... if x is None: ... x = [] ... x.append(1) ... print x >>> foo() [1] >>> foo() [1]
      
      







18.辞書用の__missing__メソッド



__missing__メソッドは、エラーの代わりに要求されたキーの名前を返すことにより、KeyErrorを排除します。

 class MyDict(dict): #    def __missing__(self, key): return key ... >>> m = MyDict(a=1, b=2, c=3) #     >>> m {'a': 1, 'c': 3, 'b': 2} >>> m['a'] #     1 1 >>> m['z'] #         'z'
      
      







19.デコレータ



デコレータを使用すると、ある機能を別の機能でラップして、機能を追加できます。 関数の1行上にデコレータをマークするには、「@」記号と関数名を書きます。

 >>> def print_args(function): >>> def wrapper(*args, **kwargs): >>> print ' : ', args, kwargs >>> return function(*args, **kwargs) >>> return wrapper >>> @print_args >>> def write(text): >>> print text >>> write('foo') Arguments: ('foo',) {} foo
      
      





より簡単に説明できるのはドキュメントのみです。

 @f1(arg) @f2 def func(): pass
      
      





コードと同等

 def func(): pass func = f1(arg)(f2(func))
      
      







20.変数間の値の交換



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







21.ファーストクラス関数



 >>> def jim(phrase): ... return 'Jim says, "%s".' % phrase >>> def say_something(person, phrase): ... print person(phrase) >>> say_something(jim, 'hey guys') #     'Jim says, "hey guys".'
      
      







高階関数( Andrey_Solomatinの おかげ ):

 #      g(),       . #       "100" (  (7+3)×(7+3)). def f(x): return x + 3 def g(function, x): return function(x) * function(x) print g(f, 7)
      
      







22.負のラウンド



 >>> round(1234.5678, -2) 1200.0 >>> round(1234.5678, 2) 1234.57
      
      







23. Zen Python



 import this
      
      







24.スタイルC ieの使用 インデントの代わりに{}



これは悪かもしれませんが、インデントの代わりに角カッコ{}を使用する場合は、領域を示します。

 from __future__ import braces
      
      







25.リストスライスのステップ



 a = [1,2,3,4,5] >>> a[::2] #   [1,3,5]
      
      





値-1はメソッドと同等です-リストを反転します:

 >>> a[::-1] #   [5,4,3,2,1]
      
      







26.ブラウザーでタブを開く



デフォルトのブラウザで指定されたアドレスのタブを開きます。

 import webbrowser webbrowser.open_new_tab('http://habrahabr.ru/') #  True   
      
      







27. zip リストのマージ



 a = [(1,2), (3,4), (5,6)] zip(*a) # [(1, 3, 5), (2, 4, 6)]
      
      





2つのリストを辞書にマージします。

 >>> t1 = (1, 2, 3) >>> t2 = (4, 5, 6) >>> dict (zip(t1,t2)) {1: 4, 2: 5, 3: 6}
      
      







28.リスト内のスライスとそれらの操作



 >>> a = range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[:5] = [42] #    5   "42" >>> a [42, 5, 6, 7, 8, 9] >>> a[:1] = range(5) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del a[::2] #     >>> a [1, 3, 5, 7, 9] >>> a[::2] = a[::-2] #  reserved >>> a [9, 3, 5, 7, 1]
      
      







29.ディクショナリキーのいくつかの要素の保存



キーに複数の要素を割り当てる必要がある場合は、リストに保存することをお勧めします。

 >>> m = {} >>> m.setdefault('foo', []).append(1) >>> m {'foo': [1]} >>> m.setdefault('foo', []).append(2) >>> m {'foo': [1, 2]}
      
      







30.最後かつ最も重要な
未知のものすべてのために、 ドキュメントを読んでください! 別の自転車を収集しないでください-あなたのコードはまだ誰かによって読み取られる可能性があります。 ドキュメントの完全性を反映する本はありません。また、Pythonのドキュメントは優れています。





UPD:
31. @ Alex222 | 解説

 import antigravity
      
      







32. タネン | 解説

forループでelseを使用する:

 >>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print n, 'equals', x, '*', n/x ... break ... else: ... # loop fell through without finding a factor ... print n, 'is a prime number'
      
      







33. モノリシック | 解説

最初のプログラム「Hello World!」を作成します

 import __hello__
      
      







34. AndersonDunai | 解説

OrderedDictまたはソート辞書:

 >>> #    >>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} >>> #     >>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) >>> #    >>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) >>> #      >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
      
      







35. AndersonDunai | 解説

self .__ class__( more )を介してクラス内からオブジェクトのクラスをオンザフライで変更

適切な事例( ありがとう dmitriko ):

 class Worm: def creep(self): print("i am creeping") class Butterfly: def fly(self): print("i am flying") creature = Worm() creature.creep() creature.__class__ = Butterfly creature.fly()
      
      







36. スコボロドキン | 解説

要素の数(この例では、単語の文字数)を数える:

 from collections import Counter Counter('habrahabr') # Counter({'a': 3, 'h': 2, 'r': 2, 'b': 2})
      
      







37.アサート

アサートは、プログラムの任意の場所にある任意のデータの値に関する仮定を確認できる特別な構造です。 この設計は、コードのテスト/デバッグに使用されます。たとえば、次の命令を作成できます。

 assert x>y
      
      





この命令がfalseを返すと、AssumptionError例外がスローされます。 実際、この指示

 assert <test>, <data>
      
      





これはこれの短い同等物です:

  if __debug__: if not <test>: raise AssertationError, <data>
      
      









PDFでコメントページを保存する
Google Chromeを使用している場合-[印刷]-> [PDFに保存]プリンターをクリックします。 他のブラウザの同様の機能については知りません。



Chromeがない場合

doPDFはhabrメニューを切り捨て、コメントを残します。 Habraページは、メニューなしで印刷するために送信されるように設計されているため、任意の仮想プリンターが適しています。 その結果、読みやすいPDFファイルができました。 とても快適です。 プリンタの代わりにダウンロードしてインストールし、印刷して送信します。 (それからもっと感謝します)。




All Articles