课程简介
本课程为Python入门课程,主要介绍了Python的函数相关知识、lambda的语法和使用,还介绍了map、reduce、filter的用法。
函数知识,是一个编程开发者和爱好者迈不过去的坎,懂得函数,才能称得上是程序入门了,运用函数作为主体编程的方式我们叫做函数式编程,是本文要讲解的内容之一。python自身带有很多常用的内置函数,本文着重介绍map/reduce/filter 这哥仨,它们有不同的本领,但有着共同的一个特点,操作对象都是列表。
课程导学
Hi~ 同学,你好啊~ ,很高兴和你一起通关学习,我是本门课程的老师,加法老师。
在课程的一开始,加法老师准备了两个程序,请你分别点击“运行”按钮查看运行效果:
常规编程:
print("我要做 蛋糕")print("准备做面包工具")print("面团的搅拌")print("基础醒发")print("分割面团")print("滚圆面团")print("烘烤")print("做好了1个面包了!")print("准备做面包工具")print("面团的搅拌")print("基础醒发")print("分割面团")print("滚圆面团")print("烘烤")print("做好了2个面包了!")print("准备做面包工具")print("面团的搅拌")print("基础醒发")print("分割面团")print("滚圆面团")print("烘烤")print("做好了3个面包了!")print("我一共做了三个蛋糕")
函数式编程:
print("我要做 蛋糕")def baker(i):print("准备做面包工具")print("面团的搅拌")print("基础醒发")print("分割面团")print("滚圆面团")print("烘烤")print("做好了%d个面包了!" %i)for i in range(1,4):baker(i)print("我一共做了三个蛋糕")
观察运行结果,这两个程序得到的结果是一样的,我们按照一定的顺序成功的做出了三个“蛋糕”。
回头观察一下两个程序的代码,代码长度明显差异很大,第一个要比第二个长一些。
扩展来想想,如果不是做三个蛋糕,而是做二十个,甚至更多。。。哇,第一种代码要长到哪里去啊(我们可不想代码长度绕地球一圈啊)。更好的编码方法来了,就是函数式编程,不管你做多少蛋糕,代码长度不变,唯一变的就是函数参数,改变参数大小就可以改变做蛋糕的个数。
试着改变一下函数参数,运行之后,看看你能做出多少个蛋糕?
print("我要做 蛋糕")def baker(i):print("准备做面包工具")print("面团的搅拌")print("基础醒发")print("分割面团")print("滚圆面团")print("烘烤")print("做好了%d个面包了!" %i)#改变参数,可以把“4”改成“10”甚至是“100”for i in range(1,4):baker(i)print("我一共做了三个蛋糕")
函数是编程语言最基本的单位,是代码复用和模块化的基础,学任何一门编程语言都要学习的知识点。
课程中加法老师将带你学习Python函数的语法,同时学习函数的几个常用内置函数:比如lambda、map、reduce、filter等等。
小白同学:那加法老师,我要学习这门课有什么要求吗?
加法老师:这门课对零基础的小白非常友好,只要掌握Python的基本语法就能学习,还等什么呢,快点儿来吧!!!
老师希望你能够在学习完这门课程之后获得的技能点:
- 掌握函数式编程的语法
- 掌握匿名函数lambda的用法
- 掌握map、reduce、filter函数的用法
以上几个模块就是本文学习的主要内容,跟上节奏,开始我们的第一关吧。
第一关 编程语言的猪脚——函数
用我们的猪脚——函数来编程,我们给它定义了一个新称号——函数式编程,这一关我们将详细了解一下函数式编程的语法等。
1. 函数式编程的概念
到底什么是函数式编程呢?
函数式编程是一种编程方式,是以函数为基本单位的编程方式,每一个函数完成独立的功能,需要该功能的时候直接调用就可以了,还可以反复调用同一个函数。
程序直接编写就可以了,为什么要用到函数呢?
👇👇👇
老师还是以导学中的“做蛋糕”举例:
比如说,你要做一个蛋糕,需要经历哪些步骤?你需要准备材料,然后一步一步的手工去做,最终做出一个蛋糕。
只是做一个,肯定没什么,但是如果你需要做很多个蛋糕,每一个蛋糕都这样一步一步的手工做,实在太慢了。。。
机灵的你马上想到了此刻需要一台全自动面包机,这样你就可以快速做出蛋糕了。也就是不管烤面包的机器怎么做的,你只要知道,最后你能拿到蛋糕就行了。
其实,函数(function)就相当于这台全自动面包机,函数把一步一步的过程封装了起来(做成了烤面包的机器),你只需要传递参数(做蛋糕的材料),然后让机器自动运行,最后获得一个结果(蛋糕)。
通过这个例子,你大概也了解了函数的作用,简单的说,函数能够节省时间,提高我们的效率。函数占编程的主要组成部分,通常就是我们刚才说的函数式编程。
小白同学:“老师老师,函数这么有用,我们赶紧安装函数、耍起来吧!我已经学到Python安装的精髓啦,是不是我们首先要‘pip’安装一下函数啊,比如 pip install hanshu 。。。。”
加法老师:“我丢。。。”
加法老师:“我打你个满头包,还pip,函数是不需要安装的,函数是几乎所有编程语言里都有的,是一种编程方式。”
2. 函数的语法
在不同的编程语言体系下,函数的使用有不同的规则,Python中的函数也有其独有的规则。
Python函数, 是符合以下规则的:
- 函数代码块以 def 关键词开头,后接函数的名字和圆括号()。
- 圆括号之间可以用于定义参数(个数不受限制),任何传入参数和自变量必须放在圆括号中间。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明,当然你也可以不写,这只是个建议。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
概念这么长,我们把一个实列函数给大家分解以下看看,下图是一个函数:
用实际的代码,来看看怎么定义和调用一个函数,点击“运行”查看运行结果:
def square( x ):s=x*xreturn s#以上是定义函数res=square(2) #调用函数,res是函数返回的结果print(res) #打印出来,看看函数的结果
在这个例子里,我们把2传给了函数square,函数执行了s=2*2, 并把结果返回给了res变量。
通过这个例子,我们学会了如何定义和使用一个函数,下面老师来更进一步解释函数。
3. 函数的分类
函数的作用就是被调用,调用者传递给函数参数,也可以不传递参数。被调用后的函数,有的返回了结果给调用者,有的没有返回结果给调用者,根据这几种情况,把函数分为4种类型:
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
3.1 无参数,无返回值的函数
这类函数,不能用于接收参数,也没有返回值,一般用于实现打印提示类似的功能。
def print_info():print('这是一个没参数的函数')print('也是是一个没有返回值的函数,没有return')print('我只想做我想做的,不需要理会其他任何的事情。')#以上是函数定义# 调用函数print_info()# 运行一下,看看效果吧。
这是最“没责任感的”一种函数,既不需要理会参数,也不给代用它的代码任何反馈,只做函数体里的代码。
3.2 无参数,有返回值的函数
此类函数,不能接收参数,但是可以返回某个数据,一般用于采集数据的情况。
import requestsdef get_sohu_info():# 读取文件,或数据库,或者请求网页res=requests.get("http://www.sohu.com")# 对数据进行处理,# 返回处理后的数据,供其他调用return res #返回值reshtml_sohu=get_sohu_info()#调用函数get_sohu_info()print(html_sohu.text)
注意比较上个例子的函数,这个函数虽然没有参数,但函数体产生了结果res ,并通过return 把res 传给了变量html_sohu。这就是没有参数,但是却有返回值的函数类型。
3.3 有参数,无返回值的函数
此类函数,可以接收参数,但是不会返回数据,因此一般用于不需要结果的场合。
def mul_num(i):# 对i进行计算res=i*i# 将结果展示print("%d X %d等于%d" %(i,i,res))print("我想知道5X5等于多少,调用mul_num函数来算算,还的打印出来看看哦")mul_num(5)#调用此函数,把5 作为参数传入函数,函数体直接打印结果,不需要返回值。
本例调用了mul_num(5),把5作为参数传入了函数,mul_num函数把参数进行了乘积运算,并把结果打印了出来。也没有返回值的需求,因此没有return返回值。
3.4 有参数,有返回值的函数
此类函数,不仅能接受参数,还可以返回某个数据,一般适用于像数据处理,并需要结果的场景。
# 计算1~n的累计和def calcu_sum(n):res = 0for i in range(1,n+1):res += ireturn resprint("小白,计算1-5的累计和,并把最后结果给我")result=calcu_sum(5)print("老师,1-5的累计和是%i" %result)
最后一种函数,需要传入参数,对参数处理后还要把结果返回调用它的程序。calcu_sum中5作为参数被传入函数,经过运算得到累计和复制给变量res,并且通过 return res 把结果给了函数外部的变量result。
4. 通关练习
这一关的知识非常简单,主要就是概念的介绍,讲了函数的语法结构和函数的分类。函数是编程语言里非常重要的内容,要好好把握。这里来做一个编写函数的小练习,要求是传递一个参数给函数,参数类型是一个整形数据,函数功能是计算这个数据乘以3的结果,并把结果返回后打印。one.py
def mul(x):#这里缺函数体,帮老师给补充上吧return resresult=mul(x)print(result)
参考答案:
def mul(x):res=x*3return resresult=mul(x)print(result)
note:完成本题的功能,参数是必须要传入的,返回值是可有可无的,因为打印既可以在函数体内,也可以在函数外完成,没有任何区别,这根据你的喜好来哦。
5. 本关总结
本关介绍了函数式编程的概念,对函数的语法格式以及分类进行了一个详细的介绍,下面简单列一下所学内容的思维导图,如下图所示:
了解了函数式编程的概念,对函数有了初步的了解,下面更进一步,来聊聊lambda —— 一个没有名字的函数。
第二关 小身材蕴含大能量——lambda
1. lambda是何方神圣
lambda是什么呢?
lambda x:print("我只是打印下参数 %s,刷刷存在感" %x)
lambda是一个函数,一个有点特殊的函数。它有自己的特点,由于函数体只有一行,决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。
小白同学:“有了函数为什么还要用lambda啊,我没看出lambda有什么作用”
加法老师:“这个问题牵扯到比较深奥的问题,不过可以总结为性能的原因,因为函数调用是要降低性能的,如果函数功能很简单,就没必要写个传统形式的函数来调用了,直接用lambda就可以了,提高性能哦。”
2. lambda的语法格式
lambda函数是如何定义的呢?
lambda的语法是唯一的。其形式如下:
lambda **“参数列表” : “函数表达式”**
参数:
- 参数列表:传递给函数的参数
- 函数表达式:对参数所做的函数处理
下面用一个例子来热身一下,运行下方程序,查看运行结果。
# 给lambda函数传递两个参数 arg1 和arg2 ,函数功能是求两者之和sum = lambda arg1, arg2: arg1 + arg2# 调用sum函数print "相加后的值为 : ", sum( 10, 20 )
上面的代码用lambda实现了两数之和的功能。lambda 后面紧跟两个参数 arg1 ,agr2 ,然后是冒号:,后面跟着函数体arg1+arg2 ,整个lambda函数传递给变量sum保存,然后通过sum(10,20)的方式调用这个lambda函数。
3. lambda的使用场景
由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。
在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种:
(1)将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。
请你结合上一节的例子,试着编写老师刚才所举的这个例子,例如,执行add(1,2),正确输出结果应该为3,点击“运行”查看运行结果:
# 给lambda函数传递两个参数 x 和y ,函数功能是求两者之和,并将其赋值给变量addadd =# 调用具有加法功能的函数
可以试着输入不用的参数,看看结果的变化。
参考答案:
add=lambda x,y:x+yprint(add(5,7))
(2)将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
例如,为了把标准库time中的函数sleep的功能屏蔽,我们可以在程序初始化时调用:time.sleep=lambda x:print(“You were fooled”)。这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。
执行time.sleep(3),点击“运行”查看运行结果
import time #导入库time.sleep=lambda x:print("You were fooled") #time.sleep(3)
从运行结果可以看出,执行time.sleep(3)时,程序不会休眠3秒钟,而是打印我们写的字符串 ‘’You were fooled’’。
(3)将lambda函数作为其他函数的返回值,返回给调用者。
函数的返回值也可以是函数。例如return lambda x, y: x+y返回一个加法函数。
def exm(x,y):print("这是函数体,什么都没做")return lambda x,y:x+y #在返回值的使用了lambda函数,实现了加法功能。
注意到和前面的不同了吗,这里的lambda函数并没有赋值给任何变量,而是在return 后面直接作为exm()函数的返回值给返回了,这样也可以?
当然可以,lambda很灵活的,作为return的返回值,参数为函数内部的x,y两个变量,直接把x+y作为 exm()函数的返回值返回了。
(4)将lambda函数作为参数传递给其他函数。
部分Python内置函数接收函数作为参数。
举个栗子, 此时lambda函数可以用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x)),将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5的差值从小到大进行排序。
#按照元素与5的差值从小到大进行排序sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
上面的例子中用到了两个知识点,下面介绍一下,sorted和abs是Python内置的函数,它们的公式如下:
sotrted(**“待排序列表”,“排序的条件表达式”**)
它的返回结果是依据后面的条件对前一个列表进行排序,返回一个排序好的列表。
abs(“单个数值”)**
abs的功能是对参数进行求绝对值。
4. 通关练习
对我们来说lambda还真是一个全新的概念,来个练习热热身吧,本关讲了lambda,顺便介绍了一个内置函数sorted(这种内置函数Python还有很多),就用这两个知识点,做一个程序,要求对1, 2, 3, 4, 5, 6, 7, 8, 9 进行条件排序,条件是按照元素与7的差值从小到大进行排序。two.py
#对1, 2, 3, 4, 5, 6, 7, 8, 9 进行条件排序,按照元素与7的差值从小到大进行排序sotrted(“待排序列表”,“排序的条件表达式”)
5. 本关总结
这一关学习了lambda的概念和使用,顺带还介绍了内置函数sorted,abs内置函数。

第三关 我不是地图——map
Python有很多内置函数,上一关我们接触了sorted() 和abs()这两个,这一关呢,隆重介绍下一个非常有用的内置函数:map()。map函数可以把一个或多个列表按照给出的规则操作得出一个新的列表哦,适合你对一个列表里的元素进行同样操作的时候,用map()没错。
1. map的语法格式
首先,老师介绍一下map()函数的语法格式,map() 会根据提供的函数对指定序列做映射,它接收一个函数 function 和一个序列 list,并通过把函数function依次作用在 list 的每个元素上,得到一个新的 list 并返回。
map(**function, list**)
参数:
(1) function:函数名称
(2) list:一个或多个列表
返回值:返回一个新列表list
如果没有用map的话,就需要用for循环来写一堆代码,而map一行就搞定了,而且性能还会提升。
2. map的用法和作用
利用map()函数,可以把一个 list(或者多个list) 转换为另一个 list,只需要传入转换函数,根据转换函数的处理结果形成一关新的list。
>>>def square(x) : # 定义计算平方数的函数... return x ** 2>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方[1, 4, 9, 16, 25]>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数[1, 4, 9, 16, 25]# 提供了两个列表,对相同位置的列表数据进行相加>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])[3, 7, 11, 15, 19]
上面程序使用了map的两种传入函数的方式。
一种是传入传统的函数的方式:
map(square, [1,2,3,4,5])
另外一种是用了lambda的方式:
map(lambda x: x ** 2, [1, 2, 3, 4, 5]) #传入一个参数
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) #传入两个参数
观察运行结果可以发现,map() 的最后结果都是生成一个列表。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数可以处理这种数据类型。
3. 通关练习
本关介绍了map函数的使用方法,我们就用map和lambda这两个知识点来做一个练习,请你把列表[1, 4, 9, 10, 25, 36, 49, 64, 81] 运用map方法和lambda函数方式,求出他们的平方。
#map方法#lambda函数方式
参考答案:
lexa=[1, 4, 9, 10, 25, 36, 49, 64, 81]reslist=map(lambda x:x*x,lexa)print(list(reslist))
4. 本关总结
本关介绍了内置函数map,这个函数的作用就是对给出的列表中每一个元素,放到给出的函数里进行操作,把得出的值放到一个新列表里,这个新列表就是map函数的输出结果。
map(**function, list**)
参数:
(1) function:函数名称
(2) list:一个或多个列表
返回值:返回一个新列表list
第四关 别被我的表面欺骗了—-reduce
reduce 在英文中的意思是减少,但在Python reduce() 函数中,却是对参数序列中元素进行累积,完全相反,所以,不用只看函数的字面意思哦。
1. reduce的语法格式
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合list中的第 1、2 个元素进行操作,得到的结果再与第3个数据用 function 函数运算,最后得到一个结果。
reduce( function**, list)**
参数:
(1)function :函数,有两个参数
(2)list:列表,其元素被reduce函数累积
2. reduce的用法和作用
reduce函数能做什么,什么情况下要用reduce呢,看下面的例子。
例如,实现一个整形集合的累加。假设lst = [1,2,3,4,5],实现累加的方式有很多:
第一种:用sum函数
sum(lst) #sum是内置函数,用于对一个整数列表里的元素进行求和
第二种:循环方式
def customer_sum(lst):result = 0for x in lst:result+=xreturn result
第三种:reduce方式
from functools import reducereduce(lambda x,y:x+y,lst)
这种方式用lambda表示参数,因为没有提供reduce的第三个参数,所以第一次执行时x=1,y=2;第二次x=1+2,y=3,即列表的第三个元素。
以上三种方式实现的是相同的功能,就是累加,从代码复杂度来看,第二种是代码量最多的,也是我们日后要避免的。
小白:“老师,我看出问题了,第一种sum 和第三种reduce 功能是一样的,好像第一种更短哦,是不是第一种更应该学习,抛弃第三种啊?”
加法老师:“嗯,看的挺准嘛,有进步,在这个求和问题上,第一种sum方式看起来更简洁,但reduce不仅仅是求和哦,它还可以求积,老师给你举个例子,看下面”
上面这个例子是把lst=[2,3,4]这个列表的元素进行了乘积,得到了2X3X4=24这样一个结果,所以说reduce的功能更全面,使用面更广,要好好掌握哦。
3. 通关练习
既然说到reduce的功能更广,那我们就大胆猜测一下,它能不能拼接字符呢?
动手试一下吧,老师给你一个字符串列表 charlst=[‘I’,’ ‘,’l’,’o’,’v’,’e’,’ ‘,’f’,’r’,’e’,’e’,’d’,’o’,’m’], 你来通过reduce把它拼接起来吧。four.py
from functools import reducecharlst=['I',' ','l','o','v','e',' ','f','r','e','e','d','o','m']#老师把字符串写好了,动动你的小手,在下面写下reduce的语句吧
参考答案:
from functools import reducecharlst=['I',' ','l','o','v','e',' ','f','r','e','e','d','o','m']lolst=reduce(lambda x,y:x+y ,charlst)
4. 本关总结
本关主要讲解了“表里不一”的函数reduce,它可以对一个列表元素进行累加、求乘积、拼接,可以操作整形、字符串等数据类型,看起来深不可测呢,另外,我们顺带着把reduce与sum这个内置求和函数比较了一下。
reduce( function**, list)**
参数:
(1)function :函数,有两个参数
(2)list:列表,其元素被reduce函数累积
了解了reduce,下一关我们再来了解另外一个对列表操作的内置函数filter,看看它的本领吧。
第五关 我是一个质检员——filter
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表,像不像一个质检员?
1. filter的语法格式
我们先来看看filter()的语法格式,接收两个参数,第一个为函数function,第二个为序列list,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
filter(**function, list**)
参数:
- function :判断函数,对列表元素基于一定的规则进行过滤
- list :待过滤的列表
2. filter的用法和作用
有了语法的概念,在实例中加深了解,看看下面的例子。
过滤出1~100中能被3整除的数,点击“运行”查看运行结果:
def is_three(x):return x%3==0#定义is_three 函数newlist = filter(is_three, range(1, 101))#range(1,101)生成1到100为元素的列表,运用filter函数,过滤掉不能被3整除的数print(list(newlist))
输出结果 :
观察输出结果,range(1,101) 生成了从1到100共一百个元素的列表,通过filter函数,以 x%3==0 这个条件做判断,我们就得出了1-100直接能被三整除的所有元素。
3. 通关练习
有了概念还不行,绝知此事要躬行,下面来个练习检验一下吧。
老师出个题目,上面的例子我们用了一个函数,请你改一下,不用函数,用lambda来完成上面的例子,挑战一下吧?five.py
#马上看到胜利的曙光了,你已经学到这里了,很了不起了,加油啊,在下面写下你的代码
参考答案:
newlist = filter(lambda x:x%3==0, range(1, 101))print(list(newlist))
4. 本关总结
filter函数真是一个矜矜业业的质检员,只要你给它规定好条件,它就能从目标列表里把符合条件的元素都找出来,组成一个新的列表给你,这可帮了我们不少忙。
reduce( function**, list)**
参数:
(1)function :函数,有两个参数
(2)list:列表,其元素被reduce函数累积
到现在为止,我们可讲了不少内置函数了,是不是感觉有点消化不良了,在课程总结环节老师会将课程中这些代表性函数依次总结一下。
课程总结
本文主要讲解的内容是函数,函数是编程语言中不可或缺的、非常重要的概念,几乎所有编程语言都有函数的概念,当然Python语言也如此,函数式编程是一种编程方式,是基于函数为单位的编程方式,由于函数具有可以反复调用的特点,节省了大量的代码。
在Python中,有一种特殊的函数 lambda。由于函数的调用是需要消耗资源的,对于函数内容非常简单,反复调用消耗的资源对比函数体来说性价比不高的话,lambda是非常明智的选择。
在Python中,有很多很多的内置函数,本文讲的主要有map、reduce、filter这三个函数,还有几个简单的内置函数 sum 、abs、sorted,课程中简单介绍了一下。
如果要在Python学习上有所收获,Python的内置函数是必须要学习的,Python本身内置了很多常用的功能函数,覆盖面非常广。了解了内置函数,甚至说学会了它们,你才能说自己是一名合格的Python开发者,再者学会了内置函数,会让你避免重复造车的事情发生,提高你的开发效率。
本文限于篇幅,仅仅介绍了几个常用的内置函数,找本Python开发基础书籍,好好提升下你的内置函数知识量吧。
