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
セットセットがないと、これらの操作は機能しません。 セットジェネレーターでない限り(
ZyXIの おかげで ):
{ x for x 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
12.値を変数に展開する値を割り当てるときにさらに変数がある場合は、変数名の先頭にアスタリスクを追加すると、残りの変数が割り当てられます(Python 3.xのみ)。
>>> first,second,*rest = (1,2,3,4,5,6,7,8) >>> first
>>> 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))
14.例外でelseを使用するanimeshneGを修正してくれてありがとう
try: function() except Error:
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):
17.関数のデフォルトデフォルトで間違った引数に関数を割り当てると、次のような結果になる場合があります。
>>> def foo(x=[]): ... x.append(1) ... print x ... >>> foo() [1] >>> foo() [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):
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')
高階関数(
Andrey_Solomatinの おかげ ):
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は
逆メソッドと同等です-リストを反転します:
>>> a[::-1]
26.ブラウザーでタブを開くデフォルトのブラウザで指定されたアドレスのタブを開きます。
import webbrowser webbrowser.open_new_tab('http://habrahabr.ru/')
27. zip リストのマージ a = [(1,2), (3,4), (5,6)] zip(*a)
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]
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: ...
33. モノリシック |
解説最初のプログラム「Hello World!」を作成します
import __hello__
34. AndersonDunai |
解説OrderedDictまたはソート辞書:
>>>
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')
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ファイルができました。 とても快適です。 プリンタの代わりにダウンロードしてインストールし、印刷して送信します。 (それからもっと感謝します)。