函数是一个独立且封闭完成特定功能的代码块,可以在任何地方被调用。
比如print()函数,无论你在程序中的任何地方调用,都是输出()中的内容。这种独立的封闭代码块又称为封装,也可以把函数理解为一个盒子。
盒子里面的代码就是封装好的,完成特定的功能,外面的代码不属于函数。
在Python中,函数分为内建函数和用户自定义函数。
内建函数是Python程序语言已经给我们创建好了,直接可以使用。这一类的函数很多,接下来我们介绍几个经常用到的小而美的函数:
01 map 函数
概念
map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量。
例如,如果对列表中的某个变量依次完成求值,并返回一个新的列表,则可以应用map:
a = [1, 2, 3, 4]map(str, a)# <map at 0x1da017136d8>list(map(str, a))# ['1', '2', '3', '4']
该函数接受两个实际参数,一个是函数的名字,另一个是列表名字,目的是把列表中的每一个元素都调用在function函数进行处理,并且返回一个新的列表。如果顺序错误,就是把函数作用在列表上,会出错的。
注意一个新语法点是函数作为参数传递给其他函数,为下面的内容。如若不理解该部分内容,可以先跳过。
number = [2, 5, 7, 8]# 定义函数:求数字加上19的和def sum_list(s): sum_l = s + 19 return sum_lprint('原来的数字是:',number)# 调用map ()函数print('所有数字加上10以后得到的值是:', list(map(sum_list, number)))# 顺序错误,则程序出错:’function’ object is not iterableprint('所有数字加上10以后得到的值是:', list(map(number, sum_list)))
原来的数字是: [2, 5, 7, 8]
所有数字加上10以后得到的值是:[21, 24, 26, 27]
Traceback (most recent call last):
File "/Users/seven_days_python/Forth_day_strcure/list_p.py", line 278, in <module>
print('所有数字加上10以后得到的值是:', list(map(number, sum_list)))
TypeError: 'function' object is not iterable
这是map函数的一个典型用法:接受2个参数,第一个参数(上例中是number 函数)是一个要作用的函数,第二个参数是可迭代变量。
当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数。例如:
a = [1, 2, 3, 4]b = [2, 2, 3, 3]list(map(lambda x, y:x**y, a, b))# [1, 4, 27, 64
02 ZIP 函数
Python中有一个常用的内建函数zip()把列表、元组或其他序列的元素配对,打包成一个个元组,然后返回成一个由元组对组成的列表。
该函数可以处理任意长度的序列,它生成列表的长度则由最短的序列决定。最后,我们可以使用for循环遍历这个列表,得到每一个值。
language_6 = ['Python', 'Java', 'C++']names = ['Xiaoming', 'Andy', 'Baby']# 打包变量print('打包后的列表是:',list(zip(language_6, names)))
# 使用循环输出for name, value in zip(language_6, names): print('{}:{}'.format(name,value))
letters = ['a', 'b', 'c']nums = [1, 2]# 打包变量print('根据最短的列表打包:', list(zip(letters, nums)))# 使用循环输出for letter, num in zip(letters, nums): print("{}: {}".format(letter, num))
03 匿名(Lambda) 函数
概念
顾名思义,匿名函数就是没有函数名字的函数。匿名函数是使用lambda关键字定义。该关键字表明定义了一个匿名函数。
定义匿名函数语法是:
lambda arg1, arg2, ……… : expression
使用lambda关键字定义;
参数arg1, arg2等表示1个或多个参数列表,注意不需要括号;
冒号:不是表示新的语句块
表达式:expression是对参数列表中的参数进行计算,
注意:没有retrun返回,整个表达式的结果为匿名函数的返回值;匿名函数只能写在一行上,也被称为单行函数;匿名函数中不需要出现if while for等语句;
首先,使用lambda定义匿名函数lambda x : x **2,然后查看其输出是 function类型 ,说明是一个函数。
例子
# lambda x : x **2 定义匿名函数,查看返回值是 function ,说明是一个函数print('lambda 是匿名函数:', lambda x : x ** 2)
lambda 是匿名函数:<function <lambda> at 0x10c712510>
匿名函数也是函数,与 def定义的函数有一定的区别和联系。匿名函数没有名字,并且也没有return语句。匿名函数简化了函数的定义,使得代码更为简洁。
对于一些小的计算任务,我们推荐使用lambda函数,而复杂的运算可以使用 def 定义函数。
但是,匿名函数可以转化为 def 定义的函数。把lambda中的参数列表变成def 中的参数列表;lambda中的表达式变成def定义的函数体;最后给函数起一个名字。
我们把上面的lambda表达式变成def定义的函数。首先,把匿名函数中的参数 x变成 def 函数中的参数 number,也就是两者的参数必须一样;然后,我们把匿名函数中的表达式 x**2 变成def 函数中的函数体;最后给def 函数取个名字 power_function。
转化匿名函数
def power_function(number): """ 求一个数字的幂 :param number: :return: """ print('通过 def 定义函数的结果:', number ** 2)
# 调用函数power_function(3)
执行匿名函数的结果: 9
对于 def 定义的函数power_function,我们直接调用函数名字即可执行。比如求3的平方。但是,由于匿名函数没有名字,只有参数和表达式组成。我们不能像调用def定义的函数一样调用匿名函数。
我们使用双括号的方法实现。
第一个括号:把整个lambda表达式用小括号括起来,就可以一直执行匿名函数;
第二个括号:在第一个括号之后,用来给匿名函数传递参数。
同样是求3的平方。当我们使用lambda的时候,我们首先把lambda表达式括起来,然后再使用一个小括号给匿名函数传递参数3.
执行匿名函数
# 执行匿名函数print('执行匿名函数的结果:', (lambda x : x ** 2)(3))
执行匿名函数的结果:9
除了上面的双括号方法,
我们还可以使用赋值的方法,把整个匿名函数赋值给一个变量。
比如把前面的lambda表达式赋值给lam_fun;然后通过名字调用匿名函数,也就是lam_fun(3)
# 通过赋值方法定义匿名函数lam_fun = lambda x: x ** 2print(lam_fun)print('通过赋值方法定义匿名函数', lam_fun(3))
<function <lambda> at 0x10b90a510>
通过赋值方法调用匿名函数 9
匿名函数的使用场景
由于匿名函数使得代码更为简洁,我们在各个Python领域经常用到。
比如匿名函数在大数据分析中非常方便,因为匿名函数可以作为参数直接传递给其他函数。
匿名函数的代码量比较小,将其作为参数传递,比写一个完整的函数或赋值给一个变量更为方便。
假如,
在一个培训机构的课程报名信息表中,我们使用字典 word保存部分信息。其中报名Python的有40名、报名Java的15名以及报名C++的20名。然后,为了方便对其计算,我们使用list()将其转化为列表 word_list。
报名信息
# 报名编程语言课的人数# 排序中使用lambdaword = {'Python':40, 'Java':15, 'C++':20}
# 转化为列表,请查看其类型和输出元素word_list = list(word.items())print(type(word_list))print('输出列表:', word_list)
通过输出word_list,我们知道其是一个由元组构成的列表。
如果我们计划对其排序,比如按照报名人数排序,我们需要用到 sorted或者 sort()中的参数key,指明按照元组中哪个元素排序,也就是排序规则。
通常,我们使用lambda函数定义参数key中的规则。比如 x表示列表中的一个元素,在这里,表示一个元组,x只是临时起的一个名字。x[0]表示元组里的第一个元素,当然第二个元素就是x[1]。
下面代码中的意思就是按照列表中第一个元素或者第二个元素排序。
排序报名信息
# 按照语言名字排序 sorted()中的key是规则,sorted_key = sorted(word_list, key=lambda x: x[0])print('按照元组中第一个元素(语言名字)排序:', sorted_key)
# 按照 value 排序print('按照元组中第二个元素(人数)排序', sorted(word_list, key=lambda x: x[1]))
按照元组中第一个元素(语言名字)排序: [('C++', 20), ('Java', 15), ('Python', 40)]
按照元组中第二个元素(人数)排序 [('Java', 15), ('C++', 20), ('Python', 40)]
更近一步,我可以把lambda函数当作参数,放在filter()或者map()函数中。
首先,我们查找报名人数大于18人的课程信息,
然后分别查看课程名字以及报名人数信息。
其他查询条件
# filter: 根据条件查找数据# 查找报名人数大于18的课程filtered_list = list(filter(lambda x:x[1] > 18, word_list))print('查找报名人数大于18的课程', filtered_list)
print()
# map()mapped_list = list(map(lambda x:x[0], word_list))print('只查看课程名字:', mapped_list)
print()
# map()mapped_list = list(map(lambda x:x[0], word_list))print('只查看报名信息:', mapped_list)
查找报名人数大于18的课程 [('Python', 40), ('C++', 20)]
只查看课程名字: ['Python', 'Java', 'C++']
只查看报名信息: ['Python', 'Java', 'C++']
04 reduce 函数
map和filter函数都是多入多出型,实质上是完成了特定的变换或筛选。
reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出。
不过可能是由于应用场景有限的原因,reduce在python3中已不再是全局调用函数,必须要从functools包中导入方可使用:
from functools import reducea = range(5)reduce(lambda x, y: x+y, a)# 10
reduce函数还可以接受一个可选的初始值作为参数。应用reduce函数可以实现很多小trick,就看能不能想的到用的出
from functools import reduces = 'abcdefg'reduce(lambda x, y: y+x, s, 'AA')# 'gfedcbaAA'
正是因为这些小而美的函数使得 Python更加流行,
但是,作为初学者不需要像背书一样背下来,而是要根据业务的需要去写代码,然后记住这些函数。老话说的很有道理,用多了就知道了。
另外,如果您是初学 Python,请往下阅读
以上内容摘自《零基础轻松学 Python》
零基础学 Python,请往看下嘛
只需7天时间,跨进Python编程大门,已有3800+加入
【基础】0基础入门python,24小时有人快速解答问题;
【提高】40多个项目实战,老手可以从真实场景中学习python;
【直播】不定期直播项目案例讲解,手把手教你如何分析项目;
【分享】优质python学习资料分享,让你在最短时间获得有价值的学习资源;圈友优质资料或学习分享,会不时给予赞赏支持,希望每个优质圈友既能赚回加入费用,也能快速成长,并享受分享与帮助他人的乐趣。
【人脉】收获一群志同道合的朋友,并且都是python从业者
【价格】本着布道思想,只需 69元 加入一个能保证学习效果的良心圈子。
【赠予】价值109元 0基础入门在线课程,免费送给圈友们,供巩固