python是一门十分简洁的语言,它是一门面向对象的语言,但不仅包括了方法,而且还内置一些十分高效而且灵活的函数。函数式编程只关心输入,然后返回输出,不会对一些产生一些中间状态产生。下面是一些十分有用的内置函数
lambda:
匿名函数,当需要实现一个简单的逻辑,lambda匿名函数可以让代码不需要跳转到其他位置的函数中去执行,减少了函数定义的一些代码,使代码更加简洁可读,而且避免了函数名的冲突。这个函数只包含一条语句,这条语句是一条返回值语句。
func=lambda x,y: x+y
print(func(1,2))
# 3
# 相当于
def func(x, y):
return x+y
匿名函数可以配合其他函数,起到一个很好的效果,如下面的max,min以及filter等等。
min/max
顾名思义,这两个函数返回最大值或最小值。
max(1,2,3)
max([1,2,3])
# 结果都为3
# 获取一个字符串出现最多次的字母,不区分大小写
from string import lowercase
# lowercase = a-z 26个小写字母
max('lowercase', key=string.lower().count)
# 获取数组中唯一的偶数, x&1位操作,偶数的二进制的最后一位都是0,位操作速度快过数字运算
max([1,3,5,6,7,9], key=lambda x: not x&1)
sorted
排序函数,不同于list的sort方法,sorted可以作用于字符串,元组等,返回一个列表
# 降序
string = 'abcdefghijklmn'
new_string = ''.join(sorted(string, reverse=True))
# new_string='nmlkjihgfedcba'
# 把某些相同特征进行分类,如把奇数放在偶数前面
numbers = [1,2,3,4,5,6,7]
new_numbers = sorted(numbers, key=lambda x: x&1)
# new_numbers=[2, 4, 6, 1, 3, 5, 7]
reversed
输出反向序列,不同于list的reverse方法,reversed函数可以作用于字符串,元组等,而且返回的是一个迭代器。
numbers = [1,2,3,4,5,6,7]
for i in reversed(numbers):
print i,
# 输出: 7,6,5,4,3,2,1
filter(func,seq):
seq中的每个对象会传给func,func返回的值为真(True,非0),那么这个对象就会被加入到一个列表中,遍历完整个seq,filter返回这个列表
# 获取不包含python的字符串
string_list = ['abc', 'python', 'helloworld', 'hellopython']
new_list = filter(lambda x: 'python' not in x, string_list)
# new_list = ['abc', 'helloworld']
# 获取偶数
numbers = [1, 2, 3, 4, 5, 6, 7]
even_numbers = filter(lambda x: not x&1, numbers)
numbers = [2, 4, 6]
map(func, seq)
将seq每个元素传递给func,返回的值加入一个列表,遍历完,然后返回这个列表
# 对每个数进行平方
seq = [1, 2, 3]
seq_square = map(lambda x:x*x, seq)
# seq_square = [1, 4, 9]
列表循环式
在这里插入列表循环式,主要是因为其实filter和map使用的情况比较少,因为它们很多情况下都可以被列表循环式代替,而且列表循环式的可读性比较高
# 上面的几个例子
# 获取不包含python的字符串
string_list = ['abc', 'python', 'helloworld', 'hellopython']
new_list = [string for string in string_list if 'python' not in string]
# new_list = ['abc', 'helloworld']
# 获取偶数
numbers = [1, 2, 3, 4, 5, 6, 7]
even_numbers = [even_number for even_number in numbers if not even_number&1 ]
numbers = [2, 4, 6]
# 对每个数进行平方
seq = [1, 2, 3]
seq_square = [num*num for num in seq]
# seq_square = [1, 4, 9]
reduce(func, seq)
将第一个数和第二个数传给func,返回的值和第三个再一起传给func,直到遍历完。
# 实现累加
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
total = reduce(lambda x,y:x+y, numbers)
# total = 36