摘要
Python中的函数是一等公民,与其他变量具有同等地位。函数可以作为参数传递给其他函数,也可以作为返回值返回给其他变量。这种特性让Python变得非常灵活和强大。
正文
Python 中的涵数是第一类目标
- 仿佛许多 地区都是会见到那样一句话
- Python 创办人也说过,全部的目标全是第一类目标
什么叫第一类目标
- 在上面中常说的第一类目标,实际上是指函数做为一个目标,与其他目标具备同样的影响力
- 从总体上,标值能够被取值给自变量、做为参数传递给涵数、做为传参
- 由于涵数和标值具备同样的影响力,因此涵数还可以被取值给自变量、做为参数传递给涵数、做为传参
将目标取值给自变量
能够将标值、字符串数组、目录、词典种类的目标取值给自变量
number = 123 string = "hello" list = [1, 2, 3] dict = {'name': 'tom', 'age': 12}
将目标做为参数传递
能够将标值、字符串数组、目录、词典种类的目标做为主要参数传送给涵数
print(123) print("hello") print([1, 2, 3]) print({'name': 'tom', 'age': 12})
将目标作为传参
能够将标值、字符串数组、目录、词典种类的目标做为涵数的传参
def return_number(): return 123 def return_string(): return "hello" def return_list(): return [1, 2, 3] def return_dict(): return {'name': 'tom', 'age': 12}
将涵数做为第一类目标
将涵数做为第一类目标,涵数具备和标值、字符串数组、目录、词典等种类的目标具备同样的影响力
将涵数取值给自变量
def max(a, b): if a > b: return a else: return b var = max print(var(1, 2)) # 輸出結果 2
将涵数做为参数传递
def func(): print("function") def pass_func(data): print("pass func") data() pass_func(func) # 輸出結果 pass func function
将涵数做为传参
def func(): print("function") def return_func(): print("pass func") return func # 等额的 var = func var = return_func() var()
将涵数做为第一类目标的实际意义
将涵数做为第一类目标,是一种关键的抽象性体制,巨大的提高了程序流程的协调能力
实战演练板栗
- 存有一个目录 [1, -1, 2, -2, 3, -3]
- 输出打印目录中的正数
- 输出打印目录中的负值
包括可重复性编码的解决方案
编码构造完全一致,仅仅标准分辨不一样
# 可重复性编码解决方案 list = [1, -1, 2, -2, 3, -3] def print_positive(list): for item in list: if item > 0: print(item) def print_negative(list): for item in list: if item < 0: print(item) print_positive(list) print_negative(list) # 輸出結果 1 2 3 -1 -2 -3
将涵数做为参数传递
# 可重复性编码解决方案 list = [1, -1, 2, -2, 3, -3] def positive(x): return x > 0 def negative(x): return x < 0 def test(list, select_fun): for item in list: if select_fun(item): print(item) test(list, positive) test(list, negative) # 輸出結果 1 2 3 -1 -2 -3
匿名函数 lambda
为什么有 lambda 匿名函数
- 在传到涵数时,有一些情况下,不用显式地界定涵数,立即传到匿名函数更便捷
- Python 给予了 lambda 关系式对匿名函数给予适用
lambda 关系式的英语的语法
lambda args: expression
expression 只容许是一条关系式,因此应用很受到限制
lambda 关系式小栗子
lambda x:x>2
等额的涵数书写
def select_positive(x): return x > 0
应用 lambda 关系式调用上边的将涵数做为参数传递
def test(list, select_fun): for item in list: if select_fun(item): print(item) list = [1, -1, 2, -2, 3, -3] test(list, lambda x: x > 0) test(list, lambda x: x < 0) # 輸出結果 1 2 3 -1 -2 -3
map 涵数
应用 Python 内嵌的 map 涵数时,一般会使用 lambda 关系式
涵数英语的语法
map(function, list)
- map 涵数接受2个主要参数 function 和 list
- function 是一个涵数,list 是一个能够被解析xml的编码序列
- map 将传到的涵数先后功效到编码序列的每一个原素,并把結果做为新的编码序列回到
map 涵数基本原理
- 图的左侧是一个编码序列 list,包括 3 个原素 1、2、3
- 函数调用 map 时,必须给予一个涵数 y = f (x),涵数 f 将键入 x 投射为輸出 y
- 将涵数 f 对图的左侧的编码序列中的每一个原素先后功效,获得图的右侧的编码序列
- 图的右侧是一个编码序列 list,包括 3 个原素 f (1)、f (2)、f (3)
非 lambda 的书写
list = [1, 2, 3] def test(x): x = 5 return x list1 = map(test, list) for i in list1: print(i) # 輸出結果 6 7 8
lambda 的书写
list = [1, 2, 3] list1 = map(lambda x: x 5, list) for i in list1: print(i) # 輸出結果 6 7 8
lambda 关系式板栗一:将 lambda 取值给自变量
- 将 lambda 关系式取值给一个自变量
- 那样启用这一自变量,等同于启用了一个涵数
f = lambda a, b: a if a > b else b print(f(1, 2)) # 輸出結果 2 # lambda 关系式等额的书写 def test(a, b): if a > b: return a else: return b
lambda 关系式板栗二:将 lambda 做为涵数参数传递
f = lambda x: x if x > 0 else 0 def test(f, x): if f(x): print("正数") else: print("负值") test(f, 1) test(f, -1) # 輸出結果 正数 负值 # lambda 关系式等额的书写 def func(x): if x > 0: return x else: return 0
lambda 关系式板栗三:将 lambda 做为函数返回值
f = lambda a, b, c: a * b * c def test(a, b, c): a = 1 b = 2 c = 3 return f(a, b, c) print(test(1, 2, 3)) # 輸出結果 48 # 等额的书写 def test(a, b, c): return a * b * c
Python 内嵌涵数接纳涵数做为主要参数
- filter(function, iterable):用以过虑编码序列,过虑掉不满足条件的原素,回到由满足条件元素组成的新目录
- sorted(iterable, cmp=None, key=None, reverse=False):对全部可迭代更新的目标开展排列实际操作
- map(function, iterable, …):依据给予的涵数对特定编码序列做投射
- reduce(function, iterable[, initializer]):会对主要参数编码序列中原素开展积累
后边再详说这种涵数
汇总
lambda 关系式常见情景:当一些作用编码仅用一次的情况下,可以用 lambda 替代
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
评论0