lambda表达式:(简写函数)
stm = lambda x,y: return x+y
高阶函数:(把函数作为参数使用的函数)
函数名就是一个变量
系统自带的高阶函数:
1、map()
原意就是映射,即把集合或者列表的元素,每一个元素都按照一定规则进行操作,生成一个新的列表或者集合,map函数是系统提供的具有映射功能的函数,返回值是一个迭代对象。
例:
l1 = [1 for i in range(10)] ==>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def mulTem(n):
n*10
l2 = map(mulTem,l1) ==>l2是一个可迭代的对象,但并不是真正的列表
2、reduce()
原意是归并,缩减
把一个可迭代对象最后归并成一个结果
对于作为参数的函数要求: 必须由两个参数,必须由返回结果
reduce([1,2,3,4,5]) == f( f(f(f(1,2),3), 4),5)
reduce 需要导入functools包
例:
def add(x,y):
x+y
l = [i for i in range(6)]
num = reduce(add,l) ==>num = 15
3、filter()
过滤函数: 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
跟map相比较:
相同:都对列表的每一个元素逐一进行操作
不同:
map会生成一个跟原来数据想对应的新队列
filter不一定,只要符合条件的才会进入新的数据集合
filter函数怎么写:
利用给定函数进行判断
返回值一定是个布尔值
调用格式: filter(f, data), f是过滤函数, data是数据
例:
def isEven(a):
return a%2==0 --->一定要返回布尔值
l = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]
res = filter(isEven,l) ==>[4, 56, 2, 4556, 4, 4]
4、sorted()
把一个序列按照给定算法进行排序
key: 在排序钱对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序
python2 和 python3 相差巨大
例:
a = [234,22312,123,45,43,2,3,66723,34]
al = sorted(a, reverse=True) ===>[66723, 22312, 234, 123, 45, 43, 34, 3, 2]
# 按照绝对值进行排序
# abs是求绝对值的意思
# 即按照绝对值的倒叙排列
a = [-43,23,45,6,-23,2,-4345]
al = sorted(a, key=abs, reverse=True) =>[-4345, 45, -43, 23, -23, 6, 2]
5、zip()
把两个可迭代内容生成一个可迭代的tuple元素类型组成的内容
l1 = [ 1,2,3,4,5]
l2 = [11,22,33,44,55]
z = zip(l1, l2) ==> (1, 11) (2, 22) (3, 33) (4, 44) (5, 55)
6、enumerate()
对可迭代对象里的每一元素,配上一个索引,然后索引和内容构成tuple类型
l1 = [11,22,33,44,55]
em = enumerate(l1) ==>[(0, 11), (1, 22), (2, 33), (3, 44), (4, 55)]
em = enumerate(l1, start=100) -->[(100, 11), (101, 22), (102, 33), (103, 44), (104, 55)]
7、collections.namedtuple
tuple类型,是一个可命名的tuple
Point = collections.namedtuple("Point", ['x', 'y']) -->创建类
p = Point(11, 22) -->实例化类
print(p.x)
print(p[0])
8、collections.deque
比较方便的解决了频繁删除插入带来的效率问题
q = deque(['a', 'b', 'c'])
print(q)
q.append("d")
print(q)
q.appendleft('x')
print(q)
9、collections.defaultdict
当直接读取dict不存在的属性时,直接返回默认值
func = lambda: "没有"
d2 = defaultdict(func)
d2["one"] = 1
d2["two"] = 2
print(d2['one']) ==》1
print(d2['four']) ==》没有
10、collections.Counter()
统计字符串个数
s = ["I", "love", "love", "love", "love", "zhu"]
c = Counter(s) ==>Counter({'love': 4, 'I': 1, 'zhu': 1})
返回函数:
函数可以返回具体的值,也可以返回一个函数作为结果
闭包:
当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包。
def myF4( *args):
def myF5():
rst = 0
for n in args:
rst += n
return rst
return myF5
闭包出现的问题:
- 造成上述状况的原因是,返回函数引用了变量i, i并非立即执行,而是等到三个函数都返回的时候才统一使用,此时i已经变成了3,最终调用的时候,都返回的是 3*3
- 此问题描述成:返回闭包时,返回函数不能引用任何循环变量
- 解决方案: 再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不再改变
def count2():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1,4):
fs.append(f(i))
return fs
装饰器:
- 在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
- 装饰器的使用: 使用@语法, 即在每次要扩展到函数定义前使用@+函数名
偏函数:
- 参数固定的函数,相当于一个由特定参数的函数体
- functools.partial的作用是,把一个函数某些函数固定,返回一个新函数 int16 = functools.partial(int, base=16)