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条)

刀客源码 游客评论