python高级函数六剑客
第一位:lambda
1.lambda语句被用来创建新的函数对象,并且在运行时返回它们。
2.Python使用lambda关键字来创建匿名函数。这种函数得名于省略了用 def声明函数的标准步骤。
3.lambda只是一个表达式,函数体比def简单很多
4.lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表 达式中封装有限的逻辑进去。
5,lambda函数拥有自己的名字空间,且不能访问自由参数列表之外全局名 字空间里的参数。
6.虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数, 后者的目的是调用小函数时不占用栈内存从而增加运行效率。
7.lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def 则会把函数对象赋值给一个变量(函数名)。
8.像if或for或print等语句不能用于lambda中。
9.lambda函数不能共享给别的程序调用,def定义的函数可以
举个栗子:
1.单个参数
g = lambda x:x+1
print g(1)
print g(2)
2.多个参数
g = lambda x, y, z : (x + y) ** z
print g(1,2,3)
3.
lambda表达式会返回一个函数对象, 如果没有变量接受这个返回值,它很快 就会被丢弃,也正是由于lambda只是 一个表达式,所以它可以直接作为list、 dict等的成员。如:
list_a = [lambda a: a**3, lambda b: b**3]
print (list_a[0])
g = list_a[0]
print g(2)
第二位:map
将每个列表元素或字符串都执行某个函数
map的函数操作方法:它将每个字符串或者列表元素,应用某个函数方法, 结果返回列表。 当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新 的seq。
让我们来看一下只有一个seq的时候,map()函数是如何工作的
举个栗子:
#求两个数的和
res = map(lambda x , y : x + y, [2,4,6],[3,2,1])
for i in res:print(i)
map无法处理对应位置操作数类型不一致的情况,这种情况都会报类 型错误,但是对于对应位置长度不一致的情况,可以处理,对应到多少 就处理多少。
#当对应位置的数据类型不一致时
res = map(lambda x , y : (x ** y, x + y), [2,4,6],[3,2,'a'])
for i in res:print(i)
第三位:filter
filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个 序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。最 终一次性返回过滤后的结果。
filter()函数有两个参数:
第一个,自定函数名,必须的 第二个,需要过滤的列,也是必须的
#coding=utf-8
#定义大于5小于10的函数
def guolvhanshu(num):
if num>5 and num<10:
return num
0
#定义一个序列
seq=(12,50,8,17,65,14,9,6,14,5)
#使用filter函数
result=filter(guolvhanshu,seq)
#(8,9,6)
print result
第四位:reduce
reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组 等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一 个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第 三个数据用func()函数运算,最后得到一个结果。
1.
from functools import reduce
lst = [1,2,3,4,5]
print reduce(lambda x,y:x+y,lst)
#这种方式用lambda表示当做参数,因为没有提供reduce的第三个参 数,所以第一次执行时x=1,y=2,第二次x=1+2,y=3,即列表的第三个 元素
2.
from functools import reduce lst=[1,2,3,4] print(reduce(lambda x,y: x+y, lst,5)) # 5是初始值,也可以理解为第三个参数 # 计算呢过程 -->5+1=6 -->6+2=8 -->8+3=11 -->11+4=15
第五位:推导列表
列表推导式提供了从序列创建列表的简单途径。
通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。
每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
代码示例1:
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print listtwo
代码示例2:
print [m + n for m in 'ABC' for n in 'XYZ']
代码示例3:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print ([k + '=' + v for k, v in d.items()] )
代码示例4:
L = ['Hello', 'World', 'IBM', 'Apple']
print [s.lower() for s in L]
第六位:切片
切片--对序列有效(列表,元组,字符串)
序列:它们的成员是有序排列的,可以通过下标偏移量访问到它的一个或几个成员
>>> s="abcdefg"[0]
>>> "abcdefg"[0]
'a'
>>> "abcdefg"[1]
'b'
>>> "abcdefg"[2]
'c'
>>> "abcdefg"[-1]
'g'
>>> "abcdefg"[-2]
'f'
>>> "abcdefg"[-3]
'e'
>>> "abcdefg"[-len("abcdefg")]
'a'
>>> a="12345"
>>> a[::2]
'135'
全量复制:
>>> "abcdefg"[:]
'abcdefg'
————————————————
原文链接:https://blog.csdn.net/qq_30758629/article/details/95924134