python実用30個のテクニック

10899 ワード

1.その場で2つの数字を交換する
Pythonは、1行のコードに直感的に値と交換(変数値)を割り当てる方法を提供しています.次の例を参照してください.
In [1]: x,y = 10 ,20 

In [2]: print(x,y)
10 20

In [3]: x, y = y, x 

In [4]: print(x,y)
20 10

付与された右側には新しいメタグループが形成され、左側は直ちにその(参照されていない)メタグループを変数和に解析する.
割り当てが完了すると、新しいメタグループは参照されていない状態になり、ゴミ回収可能とマークされ、最終的には変数の交換も完了する.
2.チェーン比較オペレータ
オペレータの集約を比較するのは、別の便利なテクニックです.
In [5]: n = 10 

In [6]: result = 1 < n < 20 

In [7]: result 
Out[7]: True

In [8]: result = 1 > n <= 9 

In [9]: result 
Out[9]: False

3.三元オペレータを使用した条件付与
三元オペレータはif-else文、すなわち条件オペレータのショートカットです.
[         ] if [   ] else [         ]

コードをコンパクトに簡潔にするために使用できるいくつかの例を示します.次の文は、「yが9であれば、xに10を割り当て、そうでなければ20を割り当てます」という意味です.必要であれば、この操作チェーンを延長することもできます.
x = 10 if (y == 9) else 20

同様に、クラスに対してこのような操作を行うことができます.
x = (classA if y == 1 else classB)(param1, param2)

上記の例ではclassAとclassBは2つのクラスであり、そのうちの1つのクラスの構造関数が呼び出される.
次に、最小値を計算する別の複数の条件式をリンクします.
In [10]: def small(a,b,c):
    ...:     return a if a<=b and a<=c else ( b if b<=a and b<=c else c) 
    ...: 

In [11]: small(1,0,1)
Out[11]: 0

In [12]: small(1,2,3)
Out[12]: 1

リストの導出に三元演算子を使用することもできます.

In [14]: [ m**2 if m > 10 else m**4 for m in range(20) ] 
Out[14]: 
[0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,61]

4.複数行文字列
基本的な方法は、C言語に由来するスラッシュを使用することです.
In [20]: multistr = " select * from multi_row \
    ...: where row_id < 5"

In [21]: multistr
Out[21]: ' select * from multi_row where row_id < 5'

もう一つのテクニックは三重引用符を使うことです
In [23]: multistr ="""select * from multi_row 
    ...: where row_id < 5"""

In [24]: multistr
Out[24]: 'select * from multi_row 
where row_id < 5'

上記の方法で共通する問題は、適切なインデントが欠けていることです.インデントを試みると、文字列にスペースが挿入されます.最後の解決策は、文字列を複数行に分割し、文字列全体を括弧に含めることです.
In [25]: multistr = ("select * from multi_row "
    ...: "where row_id < 5 " 
    ...: "order by age")  

In [26]: multistr
Out[26]: 'select * from multi_row where row_id < 5 order by age'

5.リスト要素を新しい変数に格納
リストを使用して複数の変数を初期化できます.リストを解析するとき、変数の数はリストの要素の数を超えてはいけません.
In [27]: testlist = [1,2,3] 

In [28]: x,y,z = testlist 

In [29]: print(x,y,z) 
1 2 3

6.導入モジュールのファイルパスを印刷する
コード内のモジュールに参照される絶対パスを知りたい場合は、次のテクニックを使用します.
In [30]: import threading 

In [31]: import socket 

In [32]: print(threading)


In [33]: print(socket) 


7.インタラクティブ環境における「」オペレータ
Pythonコンソールでは、式をテストしたりメソッドを呼び出したりしても、結果は一時変数に割り当てられます.(下線).
In [34]: 2 + 3 
Out[34]: 5

In [35]: _
Out[35]: 5

In [36]: print(_) 
5

“_” は、前に実行した式の出力です.
8.辞書/集合導出式
私たちが使用しているリストの導出と同様に、辞書/集合導出を使用することもできます.これらの導出は簡単で効果的です.次の例を示します.
In [37]: testDict = {i : i*i for i in range(5)} 

In [38]: testSet = { i*2 for i in range(5)} 

In [39]: testDict
Out[39]: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

In [40]: testSet
Out[40]: {0, 2, 4, 6, 8}

注意:2つの文に1つの<:>しかありません.また、Python 3で上記のコードを実行すると、に変更されます.
9.デバッグスクリプト
モジュールのヘルプでPythonスクリプトにブレークポイントを設定できます.次の例を示します.
import pdb
pdb.set_trace()

スクリプト内の任意の場所を指定し、そこにブレークポイントを設定することができます.かなり簡単です.
10.ファイル共有を開く
Pythonでは、ルートパスからファイルを共有するためにHTTPサーバを実行できます.次に、サーバを開くコマンドです.(python 3環境)
python3 -m http.server

上記のコマンドは、デフォルトのポートである8000でサーバを開き、カスタムポート番号を最後のパラメータで上記のコマンドに渡すことができます.
Paste_Image.png
11.Pythonのオブジェクトを確認する
dir()メソッドを呼び出すことでPython内のオブジェクトを確認できます.以下は簡単な例です.
In [41]: test = [1,3,5,7]

In [42]: print(dir(test)) 
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

オブジェクトのプロパティメソッドが一覧表示されます.
12.if文の簡略化
複数の値を検証するには、次の方法を使用します.
 if m in [1,3,5,7]:

ではなく
if m==1 or m==3 or m==5 or m==7:

あるいは,inオペレータについては,'[1,3,5,7]'ではなく'{1,3,5,7}'を用いることもでき,set中の要素はO(1)操作であるためである.
13.運転時検出Pythonバージョン
実行中のPythonがサポートされているバージョンより低い場合、プログラムを実行したくない場合があります.この目標を達成するには、次のコードクリップを使用して、現在のPythonバージョンを読み取り可能に出力することができます.
import sys
 
#Detect the Python version currently in use.
if not hasattr(sys, "hexversion") or sys.hexversion != 50660080:
    print("Sorry, you aren't running on Python 3.5n")
    print("Please upgrade to 3.5.n")
    sys.exit(1)
 
#Print Python version in a readable format.
print("Current Python version: ", sys.version)

あるいはsysを使ってもいいです.version_info>=(3,5)は、上記のコードのsysを置き換える.hexversion != 50660080、これは読者のアドバイスです.
python 3の実行結果:
Python 3.5.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
 
Current Python version:  3.5.2 (default, Aug 22 2016, 21:11:05) 
[GCC 5.3.0]

14.複数の文字列の組合せ
リストのすべての記号をつなぎ合わせたい場合は、次の例を挙げます.
In [44]: test = ['I', 'Like', 'Python', 'automation']

In [45]: ''.join(test)
Out[45]: 'ILikePythonautomation'

15.文字列/リストを反転する方法
リスト自体を反転
In [49]: testList = [1, 3, 5] 

In [50]: testList.reverse() 

In [51]: testList
Out[51]: [5, 3, 1]

1サイクルで反転して出力を反復
In [52]: for element in reversed([1,3,5]):
    ...:     print(element) 
    ...:     
5
3
1

1行のコード反転文字列
In [53]: "Test Python"[::-1]
Out[53]: 'nohtyP tseT'

スライスを使用してリストを反転
[1, 3, 5][::-1]

16.遊び列挙
列挙を使用すると、ループ内でインデックスを簡単に見つけることができます.
In [54]: testList= [10,20,30] 

In [55]: for i,value in enumerate(testList):
    ...:     print(i,':',value)
    ...:     
0 : 10
1 : 20
2 : 30

17.pythonでの列挙量の使用
列挙量を定義するには、次の方法を使用します.
In [56]: class Shapes:
    ...:     Circle,Square,Triangle,Quadrangle = range(4) 
    ...:     

In [57]: Shapes.Circle
Out[57]: 0

In [58]: Shapes.Square
Out[58]: 1

In [59]: Shapes.Triangle
Out[59]: 2

In [60]: Shapes.Quadrangle
Out[60]: 3

18.メソッドから複数の値を返す
この機能をサポートするプログラミング言語はあまりありませんが、Pythonのメソッドは確かに複数の値を返します.次の例を参照して、これがどのように動作しているかを見てください.
In [61]: def x():
    ...:     return 1,2,3,4 
    ...: 

In [62]: a,b,c,d = x()

In [63]: print(a,b,c,d) 
1 2 3 4

20.辞書を使用して選択操作を保存する
式を格納する辞書を作成できます.
In [70]: stdacl = { 
    ...: 'sum':lambda x,y : x + y,
    ...: 'subtract':lambda x,y : x - y 
    ...: } 


In [73]: stdacl['sum'](9,3) 
Out[73]: 12

In [74]: stdacl['subtract'](9,3) 
Out[74]: 6

21.1行のコードは任意の数の階乗を計算する
python 3環境:
In [75]: import functools

In [76]: result = ( lambda k : functools.reduce(int.__mul__,range(1,k+1),1))(3) 

In [77]: result
Out[77]: 6

22.リストに最も頻繁に表示される数を見つける

In [82]: test = [1,2,3,4,2,2,3,1,4,4,4] 

In [83]: print(max(set(test),key=test.count)) 
4

23.再帰制限のリセット
Pythonは再帰回数を1000に制限し、この値をリセットすることができます.
import sys
 
x=1001
print(sys.getrecursionlimit())
 
sys.setrecursionlimit(x)
print(sys.getrecursionlimit())
 
#1-> 1000
#2-> 100

慎重に修正する.
24.オブジェクトのメモリ使用量を確認する
Python 2.7では、32ビットの整数が24バイトを占め、Python 3.5では28バイトを利用する.メモリの使用を決定するには、getsizeofメソッド:python 2を呼び出すことができます.7:
import sys
x=1
print(sys.getsizeof(x))
 
#-> 24

python3:
In [86]: import sys 

In [87]: x = 1

In [88]: sys.getsizeof(x) 
Out[88]: 28

25.slotsを使用してメモリコストを削減
Pythonアプリケーションが多くのリソース、特にメモリを消費していることに気づきましたか?slotsクラス変数を使用して、メモリのコストをある程度削減するテクニックがあります.
import sys
class FileSystem(object):
 
    def __init__(self, files, folders, devices):
        self.files = files
        self.folders = folders
        self.devices = devices
print(sys.getsizeof( FileSystem ))
 
class FileSystem1(object):
 
    __slots__ = ['files', 'folders', 'devices']
    def __init__(self, files, folders, devices):
        self.files = files
        self.folders = folders
        self.devices = devices
 
print(sys.getsizeof( FileSystem1 ))
#In Python 3.5
#1-> 1016
#2-> 888

明らかに、メモリの使用上の節約は結果から見ることができますが、slotsは1つのクラスのメモリのオーバーヘッドが大きくない場合にのみ使用する必要があります.アプリケーションのパフォーマンス分析を行った後にのみ使用します.そうしないと、コードを変更することが難しくなり、本当のメリットはありません.
26.lambdaを用いて出力方法を模倣する
In [89]: import sys 

In [90]: lprint = lambda *args: sys.stdout.write("".join(map(str,args))) 

In [91]: lprint("python","tips",1000,1001) 
Out[91]: pythontips1000100118

27.関連する2つのシーケンスから辞書を構築する
In [92]: t1 = (1,2,3) 

In [93]: t2 =(10,20,30) 

In [94]: dict(zip(t1,t2)) 
Out[94]: {1: 10, 2: 20, 3: 30}

28.1行のコード検索文字列の複数の接尾辞
In [95]: print("http://www.google.com".startswith(("http://", "https://")))
True

In [96]: print("http://www.google.co.uk".endswith((".com", ".co.uk")))
True

29.ループを使用せずにリストを作成する
In [101]: test = [[-1, -2], [30, 40], [25, 35]] 

In [102]: import itertools

In [103]: print(list(itertools.chain.from_iterable(test)))
[-1, -2, 30, 40, 25, 35]

30.Pythonで本当のswitch-case文を実現する
次のコードは、switch-caseの構築をシミュレートするために辞書を使用します.
In [104]: def xswitch(x):
     ...:     return xswitch._system_dict.get(x, None) 
     ...: 

In [105]: xswitch._system_dict = {'files': 10, 'folders': 5, 'devices': 2}

In [106]: print(xswitch('default'))
None

In [107]: print(xswitch('devices'))
2

海賊のルフィリンクhttps://www.jianshu.com/p/cdceff697af8出典:簡書簡書の著作権は著者の所有であり、いかなる形式の転載も著者に連絡して授権を得て出典を明記してください.