@Pythonetc 2018年10月

画像



これは、私の@pythonetcフィードからのPythonのヒントとプログラミングの5番目のコレクションです。



以前の選択:







セパレーター-



適切なコマンドラインユーティリティはそれぞれ、オプション( -hまたは--helpなど )、パラメーター付きオプション( --log-level 2 )、または位置パラメーター( cp file1 file2 )の形式の引数を取る必要があります。



オプションは、先頭に1つまたは2つのダッシュが存在するという点で位置パラメーターと異なります。 位置引数がダッシュで始まる場合、問題が発生します。- rfという名前のファイルを削除する場合、 rm -rfコマンドはこれを支援しません。



状況から抜け出す簡単な方法は、セパレータとして2つのダッシュを使用することです。 -の後の引数はオプションと見なされません。



$ echo test > -rf $ cat -rf cat: invalid option -- 'r' Try 'cat --help' for more information. $ cat -- -rf test $ rm -- -rf $ cat -- -rf cat: -rf: No such file or directory
      
      





argparseモジュールでは、2つのダッシュがデフォルトでサポートされています。



ソートの安定性



Pythonの標準の並べ替えは堅牢で、 並べ替えられた関数等しいオブジェクトの順序を変更しません。



 In : a = [2, -1, 0, 1, -2] In : sorted(a, key=lambda x: x**2) Out: [0, -1, 1, 2, -2]
      
      





minおよびmax関数もソートと一致しています。 maxは、 sorted(a、reverse = True)[0]のように機能し、 minは、 sorted( a)[0]のように機能します。 つまり、両方の関数が可能な限り左端の答えを返します。



 In : max([2, -2], key=lambda x: x**2) Out: 2 In : max([-2, 2], key=lambda x: x**2) Out: -2 In : min([2, -2], key=lambda x: x**2) Out: 2 In : min([-2, 2], key=lambda x: x**2) Out: -2
      
      





デフォルト引数のキャッシュ



おそらく、初心者のパイニストの間で最もよくある間違いは、デフォルトの関数への引数として可変オブジェクトを指定することです。 このオブジェクトを関数呼び出し間で分離すると、最も奇妙な結果になる可能性があります。



 def append_length(lst=[]): lst.append(len(lst)) return lst print(append_length([1, 2])) # [1, 2, 2] print(append_length()) # [0] print(append_length()) # [0, 1]
      
      





ただし、このような共有は、オブジェクトを使用して共有キャッシュを作成する場合にも役立ちます。



 def fact(x, cache={0: 1}): if x not in cache: cache[x] = x * fact(x - 1) return cache[x] print(fact(5))
      
      





この例では、計算された階乗値をデフォルトの引数値の中に入れます。 そのような値も抽出できます:



 >>> fact.__defaults__ ({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},)
      
      





FSを使用する



os.pathモジュールを使用して、ファイルシステムパスを操作できます。 このモジュールには、文字列をファイルパスとして扱い、連結などのさまざまな便利な操作を実行する多くの関数が含まれています。



 >>> import os.path >>> os.path.join('/usr', 'local') '/usr/local' >>> os.path.dirname('/var/log') '/var'
      
      





バージョン3.4以降、Pythonにはオブジェクト指向のアプローチを提供するpathlibモジュールが含まれています。



 >>> from pathlib import Path >>> Path('/usr') / Path('local') PosixPath('/usr/local') >>> Path('/usr') / 'local' PosixPath('/usr/local') >>> Path('/var/log').parent PosixPath('/var') >>> Path('/var/log').parent.name 'var'
      
      





呼び出されたオブジェクト



Pythonでは、関数を作成するだけでなく(構文defまたはlambdaを使用して)、呼び出し可能なオブジェクトを作成できます。 __call__メソッドがある場合、オブジェクトは呼び出し可能になります。



 class Truncater: def __init__(self, length): self._length = length def __call__(self, s): return s[0:self._length] print(Truncater(4)('abcdabcd')) # abcd
      
      





デコレータは本質的に高階関数であるため、関数ではなく、呼び出されたオブジェクトによって表現することもできます。



 class cached: def __init__(self, func): self._func = func self._cache = {} def __call__(self, arg): if arg not in self._cache: self._cache[arg] = self._func(arg) return self._cache[arg] @cached def sqr(x): return x * x
      
      






All Articles