Pythonの再帰、いくつかの眩しい技の使い方

17907 ワード

Pythonの再帰、いくつかの眩しい技の使い方
ある学習者はpythonの再帰実装を質問し、具体的なテーマは再帰的に、指定したディレクトリの下のすべてのファイルのsize統計を実現することです.自分で書いたら、この問題は面白いですね.
コードは次のとおりです.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from multiprocessing.dummy import Pool as ThreadPool
import os


#       python       ,    ,    Linux  ,      ʅ(´◔౪◔)ʃ
path = "/home/david/Code/Python"


def dir_size(d):
    """
        .

            ,     ,      ,     ,
                ,   size,          。
    """
    #       
    dlist = os.listdir(d)
    #       
    allsize = 0
    for i in dlist:
        #           
        file = os.path.join(d, i)
        #        
        if os.path.isfile(file):
            m = os.path.getsize(file)
            allsize += m
        #        
        if os.path.isdir(file):
            #     
            allsize += dir_size(file)
    return allsize


print('dir size:\t{}'.format(dir_size(path)))


def dir_size(d):
    """
      comprehension  .

                 ,       comprehension 。
    """
    dlist = [os.path.join(d, i) for i in os.listdir(d)]
    allsize = sum([os.path.getsize(file)
                   for file in dlist if os.path.isfile(file)])

    allsize += sum([dir_size(file)
                    for file in dlist if os.path.isdir(file)])

    return allsize


print('dir size:\t{}'.format(dir_size(path)))


def dir_size(d):
    """
      comprehension  .

            ,      ,             .
    """
    return sum([dir_size(f) if os.path.isdir(f) else os.path.getsize(f)
                for f in [os.path.join(d, i) for i in os.listdir(d)]])


print('dir size:\t{}'.format(dir_size(path)))


def dir_size(d):
    """
      map filter  .

         ,       。
    """
    dlist = [os.path.join(d, i) for i in os.listdir(d)]
    allsize = sum(map(os.path.getsize, filter(os.path.isfile,    dlist)))
    allsize += sum(map(dir_size, filter(os.path.isdir,    dlist)))

    return allsize


print('dir size:\t{}'.format(dir_size(path)))


def dir_size(d):
    """
           .

    1,   ,            ,      SSD,           ,     
                     IO    。     NFS,          ,     
                 。

    2,     ,        。python             ,    。      
                ,         。
                     walk         ,                , 
                              ,                  。
    """
    dlist = [os.path.join(d, i) for i in os.listdir(d)]
    allsize = sum([os.path.getsize(file)
                   for file in dlist if os.path.isfile(file)])
    p = ThreadPool()

    ret = p.map(dir_size, [file for file in dlist if os.path.isdir(file)])
    p.close()
    p.join()
    allsize += sum(ret)

    return allsize


print('dir size:\t{}'.format(dir_size(path)))


def dir_size(d):
    """
    walk  .

              ,    ,                。
           walk    comprehension  ,          。
    """
    allsize = 0
    for r, ds, fs in os.walk(d):
        allsize += sum(os.path.getsize(file) for
                       file in [os.path.join(r, f) for f in fs])
    return allsize


print('dir size:\t{}'.format(dir_size(path)))


まとめ
どこが見えるか忘れてしまいましたが、pythonでは、for/whileループの使用をできるだけ避け、if判断もできるだけ少なくすることで、コードが簡潔になるだけでなく、コードの実行効率も高くなります(現在は感じません).
Pythonには便利な使い方がたくさんあり、関数式のプログラミングをサポートしています.Java/C++などの比較的強いタイプの静的言語に比べて、多くのシーンで便利です(性能は糞のようなものですが(′▽`)∞).これらの便利さもPythonの膨大な生態を生み出し、pythonのような生態はまだ見られません(個人的な観点では、鉄棒を歓迎します).