この記事を読むのに約3.6分かかります。
最初に、楽しみに値すると思う6つのpythonコードを選択しました。これが、pythonを学習している皆さんのお役に立てば幸いです。
**1、 クラスには2つのメソッドがあります。1つは__new__で、もう1つは__init__です。どちらが最初に実行されるかという違いは何ですか? ****
classtest(object):
def __init__(self):print("test -> __init__")
def __new__(cls):print("test ->__new__")returnsuper().__new__(cls)
a =test()
結果は次のとおりです。
test ->__new__
test -> __init__
別の例を見てみましょう
classtest2(object):
def __init__(self):print("test2 -> __init__")
def __new__(cls):print("test2 ->__new__")returnobject()
b =test2()
結果は次のとおりです。
test2 ->__new__
公式の説明は次のとおりです。__init__の機能はクラスインスタンスを初期化することであり、最初のパラメータはオブジェクト自体を表すselfであり、戻り値がない場合があります。 new__は、新しいクラスのインスタンスを返します。最初のパラメーターはclsです。これは、クラス自体を表し、戻り値が必要です。明らかに、クラスはオブジェクトを生成する前にインスタンス化できます。明らかに、最初に__new__が実行され、次に__init__が実行されます。実際、 new__がクラス自体のインスタンスを返す限り、自動的に__init__を呼び出して初期化します。ただし、例外があります。__new__が別のクラスのインスタンスを返す場合、現在のクラスの__init__は呼び出されません。以下に、オブジェクトaとオブジェクトbのタイプをそれぞれ出力します。
print(type(a))
#< class'__main__.test'>print(type(b))
#< class'object'>
aはテストクラスのオブジェクトであり、bはオブジェクトのオブジェクトであることがわかります。
参照文書:
https://docs.python.org/3/reference/datamodel.html?highlight=new#object.new
2、 マップ関数によって返されるオブジェクト
map()関数の最初のパラメーターはfunで、2番目のパラメーターは通常リストです。3番目のパラメーターはlistと記述してもしなくてもかまいません。この関数は、リスト内のリストの各要素に対して関数funを順番に呼び出します。
>>> b=map(lambda x:x*x,[1,2,3])>>>[i for i in b][1,4,9]>>>[i for i in b][]>>>
bの要素を2回目に出力したときに、空であることがわかったことに気づきましたか。その理由は、map()関数がイテレーターを返し、返された結果にyieldを使用するためです。これの目的は、メモリを節約することです。
例えば:
# encoding:UTF-8
def yield_test(n):for i inrange(n):yieldcall(i)
# 他のことをする
def call(i):return i*2
# forループを使用
x =yield_test(5)print([i for i in x])print([i for i in x])
実行結果は次のとおりです。
[0,2,4,6,8][]
ここでyieldを使用しない場合、リスト内の要素が非常に大きいと、それらはすべてメモリにロードされます。これはメモリの浪費であり、効率も低下します。
イテレーターの概要については、前の記事[python basic series-イテラブルオブジェクト、イテレーター、ジェネレーター](http://mp.weixin.qq.com/s?__biz=MzU0OTg3NzU2NA==&mid=2247483827&idx=1&sn=6a661c78b3f0db2e4c94cee1ddc3b036&chksm=fba863e0ccdfeaf628a112bcfe9401b3933fe5b359e17ff4345d6fcfddf7103c4460cd3d1c5d&scene=21#wechat_redirect)を参照してください。
**3、 通常の式ではコンパイルは不要ですか? ****
たとえば、テキストの需要があります
>>> import re
>>> text ='<div class="nam">中国</div>'>>> #方法1
...>>> re.findall('<div class=".*">(.*)</div>',text)['中国']>>> #方法2
...>>> regex='<div class=".*">(.*)</div>'>>> pattern = re.compile(regex)>>> re.findall(pattern,text)['中国']>>>
なぜここにさらに2行のコードを書くためにコンパイルを使用するのですか?その理由は、compileが正規式をオブジェクトにコンパイルし、高速化し、再利用するためです。
**4、[[1,2],[3,4],[5,6]] 1行のコードでリストを展開し、[1,2,3,4,5,6] **を取得します
>>>[ j for i in[[1,2],[3,4],[5,6]]for j in i][1,2,3,4,5,6]>>>
**5、 1行のコードで、文字列「->」を「abcdefg」**の各文字の中央に挿入します。
>>>"- >". join("abcdef")'a->b->c->d->e->f'>>>
また、os.path.join()を使用してオペレーティングシステムのファイルパスに参加することをお勧めします。
6、 zip機能
zip()関数が動作すると、1つ以上のシーケンス(反復可能なオブジェクト)をパラメーターとして受け取り、タプルのリストを返します。同時に、これらのシーケンスで要素を並べてペアリングします。 zip()パラメーターは任意のタイプのシーケンスを受け入れることができ、3つ以上のパラメーターを持つこともできます。着信パラメーターの長さが異なる場合、zipは自動的に最短のシーケンス長をインターセプトしてタプルを取得できます。
>>> a=[1,2]>>> b=(3,4)>>>zip(a,b)<zip object at 0x000001A20201AA08>>>>for i inzip(a,b):...print(i)...(1,3)(2,4)>>> a="ab">>> b="xyz">>>for i inzip(a,b):...print(i)...('a','x')('b','y')>>>
( 終了)
Recommended Posts