第一节 函数的基础
一、函数的使用步骤
(1)函数的定义。
(2)函数的使用。
二、函数的定义
语法:
def <函数名>(<参数列表>):
<函数体>
return <返回值列表>
说明:
(1)函数必须先定义后调用。
(2)根据不同的需求,函数可有可无。
(3)函数定义后不能直接运行,需要经过调用后才可以运行。
(4)函数的执行与黑盒相似,使用者不需要了解函数内部实现原理,只需要了解函数的输入输出方式即可。
(5)保留字pass表示不进行任何操作,仅起到占位的作用。
三、函数的参数
函数调用时候指定的数字和定义函数时候接收的数字即是函数的参数。参数的类型分位置参数、关键字参数、默认参数、不定长参数。
1. 位置参数
位置参数:调用函数时根据函数定义的参数位置来传递参数。
示例代码:
def user_info1(name,age,gender):
info="姓名:{},年龄{},性别{}".format(name,age,gender)
print(info)
user_info1("白良贺",38,"男")
注意:
(1)定义调用时,所有位置参数必须出现在默认参数前。
(2)函数调用时,如果为缺省参数传值则修改默认参数值﹔否则使用这个默认值。
2. 关键字参数
关键字参数:函数调用时,通过"键=值"形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
示例代码:
def user_info2(name,age,gender):
info="姓名:{},年龄{},性别{}".format(name,age,gender)
print(info)
user_info2(age=38,name="白良贺",gender="男")
注意:
(1)关键字参数和位置参数在定义时方法相同,仅在调用时有区别。其调用方式为"键=值"。
(2)函数调用时,如果同时使用位置参数和关键字参数,则位置参数必须在关键字参数的前面,否则调用函数时代码会报错。这句话的理解:定义在前面的参数可以使用位置参数,并且必须放在使用位置参数的前面。
(3)函数调用时,关键字参数之间不存在先后顺序。
(4)使用关键字参数时,参数个数也应同定义时的个数一致,否则运行时会报错。
(5)如果使用第三方库时,弄不清楚参数的位置,可以尝试一下全部使用关键字参数。
3.默认参数
默认参数也叫缺省参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。函数定义定义时,默认参数通过"键=值"形式加以指定。
示例代码:
def user_info3(name,age,gender="女"):
info="姓名:{},年龄{},性别{}".format(name,age,gender)
print(info)
user_info3("李小红",18)
注意:
(1)定义调用时,所有位置参数必须出现在默认参数前。
(2)函数调用时,如果为缺省参数传值则修改默认参数值﹔否则使用这个默认值。
4.不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
(1)包裹位置参数传递
包裹位置参数传递:定义时用的关键字*args
示例代码:
def user_info4(*args):
print(args)
user_info4("李小红",18)
注意:
①使用*args定义不定长参数时,使用时以位置参数的形式输入所需要传入的参数。
②传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
③参数的输出结果是一个元组。
(2)包裹关键字参数传递
包裹关键字参数传递:定义时用的关键字**kwargs
示例代码:
def user_info5(**kwargs):
print(kwargs)
user_info5(姓名="白良贺",年龄=38,性别='男')
注意:
①使用**kwargs定义不定长参数时,使用时以关键字字参数的形式输入所需要的参数参数。
②参数的输出结果是一个字典。
③通过"键=值"形式,前面的“键”不能放在引号中,否则会报错。
④无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
⑤args:arguments的缩写,表示位置参数kwargs:是keyword arguments的缩写,表示关键字参数。这其实就是python中的可变参数的两种形式,并且*args必须放在**kwargs前面。
四、指定函数参数类型和返回值
在 Python 中,可以使用注释的方式来指定函数参数的类型,但这并不是强制的类型检查。以下是一种常见的写法示例:
def myFunction(a:int,b:int)->bool:
if a>=b:
return True
else:
return False
print(myFunction(a=1,b=2))
在参数名后面使用 :加上类型,在箭头->后面指定返回值的类型。
五、变量的作用域
根据程序中变量所在的位置和作用范围,变量分为局部变量和全局变量。局部变量仅在函数内部使用,且作用域也在函数内部。全局变量可以跨越函数使用,作用域覆盖整个程序。
1.局部变量
局部变量指在函数内部定义并使用的变量,仅在函数内部有效,当函数退出时变量将不再存在。示例代码:
a=100
def testA():
a=200
print(a)
testA() # 200
print(a) # 100
说明:函数tetA()外面的a=100,这里变量a是全局问题,而函数testA()内部的a=200是局部变量。函数testA()执行结果,局部变量a将不存在,所以下面print(a)输出的只能要函数体外面的全局变量a=100
2. 全局变量
全局变量指在函数之外定义的变量,在程序执行全过程有效。全局变量在函数内部使用时,需要提前使用保留字global声明,语法形式如下:
global<全局变量>
示例:
a=100
def testB():
global a
a=200
print(a)
print(a) # 100
testB() # 200
print(a) # 200
说明:函数体内部使用global声明了a是全局变量。函数体内部的a=200,是重新为a赋了一个200,也就意味着如果函数testB()被调用后,a会被重新赋一个值200,函数testB()未调用之前,a的值依然为100。这就代码testB()之间两个print(a)输出结果不致的原因。
六、返回值的作用
表示返回值的关键字return ,其作用:
1.负责函数返回值
2.退出当前函数、导致return下方的所有代码(函数体内部)不执行
3.多个返回值会以元组的形式输出。
七、函数的嵌套调用
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
八、函数的说明文档
1.函数的说明文档,即即函数的解释说明信息。
2.查看函数说明文档
(1)方法,可以使用help函数查看,语法:
help(函数名)
(2)使用help()函数查找函数sum()说明文档时,help()中一定要不加函数名称后面的特号,否则会查不到。
3.函数说明文档有两种写法:
(1)书写方法一:函数缩进的第一行的位置书写;使用三对引号"""""",在其中书写说明文档。
(2)在书写方法一的三对引号""""""中,回车一下,可以按照提示书写更详细详细的函数说明文档信息。
九、单词释义
arguments /ˈɑːgjʊm(ə)nts/ 参数
keyword /ˈkiːwɜːd/ 关键字
global /ˈɡləʊb(ə)l/ [计]全局的
第二节 递归
函数是一种代码封装,能够被其他程序调用,当然,也可以被函数自身的内部代码调用。这种函数定义中调用函数自身的方式称为递归。
递归和数学归纳法都利用了递推原理,本质相同。
计算机递归的次数是有限制的,一般不超过1000次,比如自己的电脑递归次数限制为995次,这种递归次数限制称为递归深度。
一、递归的特点
1.函数内部自己调用自己
2.必须有出口
二、递归调用过程
第三节 lambda函数
如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化。在英语中lambda的意思是匿名函数。个人理解:lambda是函数的简写方法。
1.lambda语法
lambda参数列表︰表达式
个人理解:lambda相当于函数的名称,参数列表相当函数的参数,返回结果相当return也可以理解成简单的函数体。
说明:
1.lambda函数能接收任何数量的参数但只能返回一个表达式的值。
2.表达式可以使用三元表达式。
2.示例
获取lambda表达式结果的方法:
(lambda参数列表︰返回的结果)(对参数列表进行赋值)
参数的输入方法同函数参数相关内容一致。
(1)无参数
print((lambda: 100)())
(2)一个参数
print((lambda a: a)('hello world'))
(3)默认参数
print((lambda a, b, c=100: a + b + c)(10, 20))
(4)可变参数:**args
print((lambda *args: args)(10, 20, 30))
(5)可变参数:**kwargs
print((lambda **kwargs: kwargs)(name='python', age=20))
第四节 高阶函数
一、高阶函数的概念
把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
示例代码:
def fuc(a,b,k):
return k(a)+k(b)
r1=fuc(-8,-2,abs)
print(r1) # 10
说明:
1.函数fuc(a,b,k)中最后一个参数k表示函数名称。这里的函数名称参数可以任何标识符。
2.最后一个参数一定要传入函数名称,记得函数名称后面不带括号,否则会报错。
二、内置高阶函数
本节内容举例的三个内置高阶函数,其实并不常用,仅作为了解即可。用时再查找用法不迟。
1.map(func,lst)
作用:map(func,lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
2.reduce()
作用:reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。
说明:这一个函数使用需要导入模块functools
3.filter(func,lst)
作用:filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,。如果要转换为列表,可以使用list()来转换。