1、高阶函数:
First Class Object:
- 函数在Python中是一等公民。
- 函数也是对象,可调用的对象。
- 函数可以作为普通变量,参数,返回值等。
高阶函数:
- 数学概念 y = g(f(x))
- 在数学和计算机科学中,高阶函数应当是至少满足下面的一个条件:
- 接受一个或多个函数作为参数
- 输出一个函数
举例1:
1 def counter(base):
2 def inc(step=1):
3 a = 1
4 nonlocal base
5 base += step
6 return base
7 return inc # 返回的并非是容器类对象
8
9 # foo = counter(1)
10 # print(foo())
11
12 # 函数counter 是一个高阶函数,因为满足高阶函数的一个条件:输出一个函数
13
14 f1 = counter(5)
15 f2 = counter(5)
16
17 # print(f1(),f2())
18 print(f1 == f2) # Fasle 非容器类对象,或者可以直接比较的类型,没办法比较内容,所以比较地址
19 print(f1 is f2) # False 比较地址
20 '''
21 inc 属于是内部函数,每次调用才会定义,就跟在counter 函数内部定义一个 a = 1是一样的,
22
23 所以,每次调用counter 时,要压栈,f1 和 f2 分别 压栈两次,每次是不一样的,都是重新压栈
24
25 所以,每次定义的 inc 也是不一样的!自然,它们的地址也是不一样
26 '''
举例2:
1 def inc(step=1):
2 base = 2
3 base += step
4 return base
5
6 def counter(base):
7 bse = 1
8 a = 1
9 return inc
10
11 f1 = counter(3)
12 f2 = counter(3)
13 print(f1 is f2) # True
14 print(f1 == f2) # True
15 '''
16 这个和上面的就不痛了,因为在全局里定义了,因为函数定义仅一份,所以每次调用的都是同一个函数
17 '''
2、自定义sort 函数 sorted()
排序问题:仿照内建函数sorted 实现一个sort函数
1 NO 1
2 def sort(iterable):
3 ret = []
4 for x in iterable:
5 for i, y in enumerate(ret):
6 if x > y:
7 ret.insert(i, x)
8 break
9 else:
10 ret.append(x)
11 return ret
12
13 print(sort([1,3,2]))
14
15 no 2
16 def sort(iterable, reverse=False):
17 ret = []
18 for x in iterable:
19 for i, y in enumerate(ret):
20 flag = x > y if reverse else x < y
21 if flag:
22 ret.insert(i, x)
23 break
24 else:
25 ret.append(x)
26 return ret
27
28 print(sort((1,2,3,45,3)))
29
30
31 NO 3
32 def sort(iterable, key=lambda a,b : a > b):
33 ret = []
34 for x in iterable:
35 for i, y in enumerate(ret):
36 if key(x,y):
37 ret.insert(i, x)
38 break
39 else:
40 ret.append(x)
41 return ret
42
43 print(sort((3,3,42,4,52)))
44
45
46 NO 4
47 def sort(iterable, reverse=False, key=lambda x,y:x<y):
48 ret = []
49 for x in iterable:
50 for i, y in enumerate(ret):
51 flag = key(x,y) if not reverse else not key(x,y)
52 if flag:
53 ret.insert(i,x)
54 break
55 else:
56 ret.append(x)
57 return ret
58
59 print(sort((1,2,3,4,53,2,)))
sorted()内建函数的简单实现
1 sorted(iterable, *, key=None, reverse=False)
2 Return a new sorted list from the items in iterable.
3
4 Has two optional arguments which must be specified as keyword arguments.
5
6 key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
7
8 reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.
9
10 Use functools.cmp_to_key() to convert an old-style cmp function to a key function.
11
12 The built-in sorted() function is guaranteed to be stable. A sort is stable if it guarantees not to change the relative order of elements that compare equal � this is helpful for sorting in multiple passes (for example, sort by department, then by salary grade).
13
14 For sorting examples and a brief sorting tutorial, see Sorting HOW TO.
15
16 从可迭代的项目中返回一个新的排序列表。有两个可选的参数,必须指定为关键字参数。key指定了一个参数的函数,用来从每个列表元素中提取一个比较键:键=str.下半。默认值是None(直接比较元素)。反向是布尔值。如果设置为真,那么列表元素就会显示,就好像每个比较都被颠倒了一样。使用函式工具。cmp tokey()将旧式的cmp函数转换为akey函数。内置的排序()函数保证是稳定的。排序是稳定的,如果它保证不改变比较相等的元素的相对顺序,这有助于在多个传递中进行排序(例如,按部门排序,然后按工资等级排序)。对于排序示例和一个简短的排序教程,请参阅排序如何。
sorted()标准实现
3、内建函数-高阶函数
排序:sorted( iterable [, key][, reverse] )
过滤数据:filter( function, iterable) ---> filter object
映射: map( func, *iterable) ---> map object
一、sorted( iterable [, key][, reverse] ) 排序
- 返回一个新列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
- sorted( lst, key=lambda x:6-x # 返回新列表
- list.sort(key=lambda x: 6-x) # 就地修改
- 注:key= 后面的表达式是比较条件,如上:把所有元素做 6-x 后在比较大小,然后再返回之前原来的元素
二、filter( function, iterable)
- 过滤可迭代对象的元素,返回一个迭代器
- functn 一个具有一个参数的函数,返回bool
- 例如:过滤出数列中能被3 整除的数字,
- list( filter( lambda x:x%3 == 0 , range(18)) # [0, 3, 6, 9, 12, 15]
三、map ( function, *iterable) --> map object
- 对多个可迭代独享的元素按照指定的函数进行映射,返回一个迭代器。
- list(map(lambda x : 2*x + 1, range(4)))
4、柯里化Currying
柯里化:指的是将原来接受两个参数的函数编程新的接受一个参数的函数的过程,新的函数返回一个以原有第二个参数为参数的函数。
举例 1:
1 def add(x, y):
2 return x + y
3
4 柯里化————————》
5
6 def add(x):
7 def inner(y):
8 return x + y
9 return inner
10
11 print(add(2)(3))