python匿名函数

递归列出目录中的文件

函数讲解

  • os .listdir() 列出当前目录下的内容。

    1
    2
    In [5]: os.listdir('/root/aming')
    Out[5]: ['advance', 'basic', 'tmp.txt']
  • os.path.isdir() 判断是否为目录,是,返回True;不是或不存在,返回False。

    1
    2
    3
    4
    5
    In [6]: os.path.isdir('/root/aming')
    Out[6]: True

    In [7]: os.path.isdir('/root/aming/tmp.txt')
    Out[7]: False
  • os.path.isfile() 判断是否为文件,是,返回True;不是或不存在,返回False。

    1
    2
    3
    4
    5
    6
    7
    8
    In [8]: os.path.isfile('/root/aming')
    Out[8]: False

    In [9]: os.path.isfile('/root/aming/222')
    Out[9]: False

    In [10]: os.path.isfile('/root/aming/tmp.txt')
    Out[10]: True
  • os.path.join() 将字符连接为目录,不判断该路径是否存在。

    1
    2
    3
    4
    5
    6
    7
    8
    In [11]: os.path.join('root','aming','tmp.txt')
    Out[11]: 'root/aming/tmp.txt'

    In [12]: os.path.join('/root','aming','tmp.txt')
    Out[12]: '/root/aming/tmp.txt'

    In [13]: os.path.join('/root','aming','123')
    Out[13]: '/root/aming/123'

递归输出

列出目录下所有文件,包括子目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python

import os
import sys

def printFiles(path):
lsdir = os.listdir(path)
dirs = [i for i in lsdir if os.path.isdir(os.path.join(path,i))]
files = [i for i in lsdir if os.path.isfile(os.path.join(path,i))]
if files:
for f in files:
print os.path.join(path,f)
if dirs:
for d in dirs:
printFiles(os.path.join(path,d))

printFiles(sys.argv[1])

输出结果

1
2
3
4
5
6
/root/aming/tmp.txt
/root/aming/advance/1_5_1.py
/root/aming/advance/1_4_4.py
/root/aming/advance/1_1_3.py
......................
/root/aming/basic/2_3_2.py

注意:当上述文件中if files:和if dirs:判断调换位置,输出结果将会发生变化,可自行尝试。

匿名函数

关键字lambda表示匿名函数。
lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。
匿名函数只能有一个表达式,不用写return,返回值就是该表达式的结果。

实例对比

1
2
3
def fun(x,y):
return x * y
fun(2, 3)

更改为lambda函数

1
2
r = lambda x, y:x * y
r(2, 3)

lambda语句中,冒号前是参数,可以有多个,逗号隔开;冒号后是返回值。

1
2
3
4
In [26]: r = lambda x, y:x*y

In [27]: r(3,4)
Out[27]: 12

lambda语句构建的其实是一个函数对象。

1
2
In [28]: r
Out[28]: <function __main__.<lambda>>

带有< >这种都是对象。

优点

使用lambda可以省去定义函数的过程,让代码更精简。
对于一些抽象的,不会被别的地方重复使用的函数,使用lambda不需要考虑命名的问题。
使用lambda有些时候让代码更容易理解。

实例

  • reduce()函数
    对序列进行操作,具体操作由lambda函数定义,定义的函数必须为2元计算。
    1
    2
    In [29]: reduce(lambda x, y:x + y, range(1,101))
    Out[29]: 5050

Recommended Posts