w88_w88官网_w88优德手机版

优德88手机app下载_w88优德娱乐中文_w88优德手机客户端

admin3个月前365浏览量

没有学不会的python


函数式编程

到现在为止,咱们的没有学不会python系列文章现已讲了许多常识点了,假设是第一次刷到这篇文章的朋友能够去我主页看一下曾经写的文章。前面讲了许多常识点,每个常识点都辅以代码作为了解和练手,这些比方都是用面向进程思维编写的,面向进程的实质便是将一个个杂乱问题拆解成简略问题,意思便是将一个以完结某意图的程序划分红一个个函数的意思,这便是面向进程的编程思维。

而函数式编程,尽管也是面向进程的一种编程思维,但它又跟一般的面向进程写法有些不相同,简略说便是它更笼统更简练,而带来的副作用便是,代码比较难明,履行功率也相对低一点。因而面向目标编程思维可分为两种,一种是函数式编程别的一种是指令式编程,它们的区别是:

函数式编程关怀数据的映射,指令式编程关怀解决问题的进程。翻译成人话便是,函数式编程只负责处理数据的加工运算,不论代码逻辑结构,是一种愈加笼统的方法。指令式编程就重视于代码逻辑结构,有时为了使代码结构更合理更易懂,咱们不介意用十分臃肿的写法去完结一个运算意图。

python作为一门高档言语,天然也支撑函数式编程,因为在python中一切皆是目标。或许有些朋友不知道目标是什么意思,前面讲过的那些变量便是目标,目标便是一个个在内存中具有地址的变量。而函数,也是一种变量,在python中,因为函数也能够作为变量进行传递,所以python也支撑函数式编程。

函数也是一个目标

要怎样了解函数也是一个目标呢,最好的方法便是经过代码认识一下。

def str_to_int(str_list):
"""
将字符类型的数字转换成整型
:param str_list:
:return:
"""
result = []
for item in str_list:
result.append(int(item))
return result
def get_total(str_to_int_func, list_1):
"""
对list_1求和
:param str_to_int:
:param list_1:
:return:
"""
parse_list = str_to_int_func(list_1)
return sum(parse_list)
list_1 = [1, 2, 3, 4, 5]
print(get_total(str_to_int, list_1))

上面咱们首要界说了一个函数str_to_int,意图是用于将字符类型的数字转换成整型,然后界说一个求和函数,该函数承受一个字符串转换成整型的函数参数以及一个待求和的参数列表。最终咱们界说一个带求和的列表,接着调用求和函数,可是咱们细心看一下,调用get_totoal函数的时分,咱们传递了一个str_to_int目标,这个变量其实便是咱们前面声明的函数,它也能够和一般变量相同作为参数传递给其它函数。当然这个比方没什么实践用途,实践也不会这么写,这儿仅仅为了让咱们了解,在python中,记住仅仅在python中,在其他言语不一定,函数也是一个目标,也是能够作为参数进行传递的。

知道了函数也是一个目标,可作为参数传递后,咱们学习一下匿名函数。

lambda函数

匿名函数意思便是没有姓名的函数,作为初学者或许会很古怪,没有姓名的函数?那怎样调用这个函数,不是没有姓名么?接下来会为你回答。匿名函数因为没有姓名,因而也不适用于触及一大段的代码块,所以它又有别的一个说法,叫做一句话函数,便是说一条句子就能够写完的函数。

匿名函数的一般方法是:

lambda param1:expression

即lambda关键词+变量称号+冒号+表达式。表达式将会对参数进行运算并回来成果。

看个比方:

# 界说并调用一个匿名函数,该函数将对参数进行+1并将成果回来
result = (lambda x: x + 1)(5)
print(result)
# 当然匿名函数也能够传递多个参数
result = (lambda x, y: x + y)(5, 6)
print(result)
# 不止能够对数值变量进行核算,还能够对列表进行处理,下面的代码意思相当于result = [1,2,3,4,5] * 2
result = (lambda x: x * 2)([1, 2, 3, 4, 5]) # 不要误认为会将列表的每个数都进行核算,实践上它是一个全体传进去的,即x=[1,2,3,4,5]
print(result)

经过上面的比方咱们知道怎样界说和调用匿名函数了,也应该了解,咱们不应该让匿名函数做过多的工作,假设需求做过多的工作就要界说成一般函数。匿名函数合适那种一句话就能够完结的函数,这类函数界说成一般函数会过于臃肿,而界说成匿名函数则适可而止。

接着解释一下匿名函数怎样调用的,上面的匿名函数是直接用括号括起来然后调用的,这样关于初学者来说不太好了解,我再这么写个比方就应该了解了:

# 界说并调用一个匿名函数,该函数将对参数进行+1并将成果回来
my_func = lambda x: x + 1
print(my_func(5))

这儿咱们把匿名函数赋值给一个变量,然后经过这个变量来调用匿名函数。就和一般函数相同,能够经过函数称号调用函数并传递值。

匿名函数真实的威力是和其它几个python的高阶函数结合运用,它们分别是map,reduce,filter,sorted。

map函数

map函数一般方法是:

map(func,seq)

其间func是一个函数变量,能够是一般函数也能够是匿名函数,seq是可迭代目标。关于什么是可迭代目标本章节不会讲,今后会有专门的章节讲,现在咱们能够把可迭代目标当成list,dict这些复合类型就行。

map的实践运用:

# map调用一般函数
def str_to_int(str_obj):
return int(str_obj)
result = map(str_to_int, ["1", "2", "3"])
print(list(result))
# map调用匿名函数
result = map(lambda x: int(x), ["1", "2", "3"])
print(list(result))
# 能够传递多个参数
result = map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
print(list(result))

输出成果:

[1, 2, 3]
[1, 2, 3]
[5, 7, 9]

要注意的是,map函数会将参数的每一项都拿出来传入给函数目标,而不是将参数作为一个全体传入。并且map回来的是一个慵懒的迭代目标,所以假设咱们要拿回来成果,应该用list核算一下。

别的,传递多个参数和一个参数的核算方法是不同的,为了便利了解,请看下图:

一个参数时,核算方法是这样的:

行将参数的每一项循环核算输出。

两个参数时,核算方法是这样的:

行将对应参数的对应项循环传递进行核算,比方上图的便是x=[1,2,3]、y=[4,5,6],接着循环对应项进行核算,先取第一项便是x[0]+y[0]便是1+4,如此循环。

reduce函数

reduce函数的一般方法和map相同也是:

reduce(func,seq)

不过值得注意的是,reduce在python3中被移植到了functools模块中,所以咱们要先引进才干运用。reduce的核算思维比较难以用言语描绘,不过reduce翻译成中文的意思便是兼并。咱们能够简略的了解为兼并运算。下面经过代码来了解一下:

from functools import reduce
# 相当于求和
result = reduce(lambda x, y: x + y, [1, 2, 3])
print(result)
# 相当于衔接字符串
result = reduce(lambda x, y: x + y, ["I", " Love", " you"])
print(result)

输出成果:

6
I Love you

上述代码完结了两个功用,分别是求和和链接字符串。求和的核算进程翻译成图便是:

第一次先将列表的前两项传入给x,y,然后核算和回来,再接着取列表的下一项跟回来的和持续传入给x,y接着求和,如此循环。

filter函数

filter函数的方法跟map也是相同的,这儿不再重复。这个函数比较好了解,它便是把契合条件的值都过滤出来并回来。

比方下面的代码便是将大于5的值都过滤出来回来:

result = filter(lambda x: x > 5, [2, 3, 5, 7, 8, 9])
print(list(result))

输出成果:

[7, 8, 9]

咱们能够用这个函数来做一些简略的过滤操作。

sorted函数

sorted是python内置的一个排序函数,运用它,就不需求咱们去写排序算法了,并且它的运用十分灵敏。废话不多说,直接看比方:

# 简略的对列表进行数字巨细比较并升序输出
result = sorted([23, 1, 34, 10])
print(result)
# 简略的对列表进行数字巨细比较并倒序输出
result = sorted([23, 1, 34, 10], reverse=True)
print(result)
# 不只列表,咱们也能够操作字典
dict_1 = {"two": 2, "four": 4, "one": 1}
# 按值排序
result = sorted(dict_1.items(), key=lambda item: item[1])
print(result)
# 按键排序
result = sorted(dict_1.items(), key=lambda item: item[0])
print(result)

输出成果:

[1, 10, 23, 34]
[34, 23, 10, 1]
[('one', 1), ('two', 2), ('four', 4)]
[('four', 4), ('one', 1), ('two', 2)]

sorted函数的更多用法就需求你们自己取探索,关于初学者来说,这些就够了。

函数式编程的利与弊

函数式编程有好的一面就有坏的一面,不是什么情况都合适用函数式编程的,何况python并不彻底支撑函数式编程的一切特性。关于函数式编程的利与弊,我结合前面的比方做一个归纳的阐明。假设咱们要完结一个功用,需求先对数字字符进行转换为整型然后再求和,求和之后,假设成果比10大就回来,比10小就丢掉。这么一个功用假设用函数式来写的话便是:

from functools import reduce
result = filter(lambda x: x > 10, [reduce(lambda x, y: x + y, list(map(lambda x: int(x), ['4', '5', '6']))),
reduce(lambda x, y: x + y, list(map(lambda x: int(x), ['1', '2', '3'])))])
print(list(result))

这个函数给你第一眼感觉是什么?晕是吧。甭说初学者,便是有经历的人,看到这样的写法都头疼,尽管很简略的代码就完结了这么多功用,可是代码阅览性太差了,即使是自己,过段时间回过头来,也未必知道自己写的是什么玩意。

假设我把它这样写呢:

def str_to_int(str_obj):
return int(str_obj)
def get_total(list_1):
total = 0
for item in list_1:
total += str_to_int(item)
return total
result_1 = get_total(['1', '2', '3'])
result_2 = get_total(['4', '5', '6'])
result = [result_1, result_2]
print(list(filter(lambda x: x > 10, result)))

这样代码是不是好许多,尽管代码量多了,可是可阅览性高了,你好我好咱们好。

咱们在选择函数式编程的时分,牢记不要混合运用,要易易懂为主,炫酷为次。python的函数式编程实质上是为了简略的一般函数服务的,并不合适功用杂乱的函数。并且有些公司明确规定否则程序员写函数式编程,怕的便是今后你的代码没人看懂,不知道怎样修正。

好了,今日就到这儿。

假设对我的文章感兴趣,能够重视我的主页也能够重视我的大众号: