Python函数概述
几乎每种编程语言都有函数,Python中函数也是非常重要的内容。通俗讲Python中函数是一段代码,并给这段代码起个名字,通过名字来使用这段代码(调用)。
为什么需要函数呢?
看个例子,当我们程序中多个地方都要使用功能相同的一段代码时怎么处理呢?是每个使用这段代码的地方都复制一份吗?如图:
图:代码复制与复用
例子简单给出两种方法:
每个用到的地方都复制一份;
把这段代码放到一个地方,使用时都执行这段代码,这段代码执行完毕,继续执行其他处理。
如果把代码复制多份:
1、增加了代码量(占用更多的内存);
2、如果需要修改代码,比如把 a > b 改成 a
方法二改善了这种情况,方法二的缺点是增加代码的跳转,对于流水线执行的指令来讲,会降低效率,这种降低大多数情况可以忽略不计,整体而言优点大于缺点。采用函数就可以实现方法二的效果。
采用函数的好处:代码模块化设计,提高可读性;提高代码复用率;提高开发效率;使代码便于维护,降低出错率等等。
Python 函数分类:Python函数可分为,Python内建函数、开发者自己编写的函数、其他开发者编写的函数。另外,Python中对象的方法其实也是函数。
学习Python函数主要需要了解:定义函数(创建对象),使用函数(调用)两方面内容。
使用函数称为函数调用,调用函数需要遵循函数的使用规则。如之前使用过的函数:
print("Hello Python")
r = len([1, 2, 3])
a = [1, 2, 3]
a.append(4)
print(),len(), a.append() 都是函数,上面都是函数调用。
Python函数的几个要素:函数名、函数参数、函数返回值。
Python 函数定义
Python使用关键字 def 定义函数,Python自定义函数语法:
1、def 必须写(大小写一致)
2、函数名要有,用户自定义,命名规则同变量(标识符命名规则),通常建议:小写字母+下下划线,如: goods_add()
3、() 必须有,英文
4、: 必须有,英文
5、参数列表:可选
6、"函数文档字符串":可选,如有需要缩进
7、语句块:至少一条语句,可以使用pass,需要缩进
代码示例:
Python调用函数:
调用语法:
[变量] = 函数名([实参列表])
变量 =:可选,需要接收函数返回值时,否则 变量 = 均不需要。
函数名:必须有,需要和定义时一致包括大小写。
():必须要有,英文。
实参列表:可选,这个情况多些,后续说明。
示例:
print("Hello Python")
r = len([1, 2, 3])
a = [1, 2, 3]
a.append(4)
示例2:
函数创建、调用说明:
1、定义是函数创建对象(可执行对象,callable()),并不执行
2、调用时执行,从调用处跳转到函数代码
3、函数执行到最后一条语句则返回调用处,继续执行下一条语句,或者执行到return 语句结束执行,返回调用处,继续执行下一条语句。
return 语句
函数返回语句,只要执行到return语句,函数即结束运行,返回调用处。
return 语句语法:
return [表达式]
表达式:可选,有表示函数返回的值(对象),可以是 None,没有时等同None。
示例:
带参数的函数定义举例:
几点说明:
定义函数时,需要确定函数名和参数个数
参数可以没有(根据需要确定)
如果有必要,可以检查参数的合法性(后续讲解)
函数必须先定义,再使用
Python函数声明和定义可以看作一回事
函数体内部可以使用 return
return 可以返回值,有可以不返回值
return 可以随时出现函数体中,执行return即返回,后续语句不再执行
函数执行完毕也没有return语句时,自动 return None
函数可以同时返回多个值,但其实就是一个元组。
Python函数参数
形参与实参的概念:
函数定义时,参数列表中的参数为形式参数
函数调用时,给定的参数为实参
图-形参实参
Python函数参数传递:
传递方式有,位置传参、序列传参;
关键字传参、字典关键字。
位置传参:
调用函数时,给定的实参个数和位置均需和定义时的形参相符。
位置传参(序列传参:元组传参,*())
元组元素个数和参数个数相同
对应位置上的元素类型和函数参数类型相同
位置传参(序列传参:列表传参,*[])
位置传参(序列传参:字符串传参,*字符串)
关键字参数
关键字传参是从调用角度来说的,调用函数时以名字给形参传递实际的对象值
调用时实参和形参按名字匹配,不按位置匹配。
代码示例
测试以下调用:
#位置传参
print_str(1, 2, 3)
#关键字传参
print_str(b = 2, c = 3, a = 1)
print_str(c = 3, a = 1, b = 2)
print_str(1, c = 3, b = 2)
#正确?
print_str(c = 3, a = 1)
Traceback (most recent call last):
File "
", line 1, in
print_str(c = 3, a = 1)
TypeError: print_str() missing 1 required positional argument: 'b'
print_str(a=1, 2, 3)
File "", line 1
SyntaxError: positional argument follows keyword argument
print_str(1, c = 3, 2)
SyntaxError: positional argument follows keyword argument
关键字参数(通过字典进行传参 **字典)
位置参数、关键字参数小结
函数位置传参和序列传参可以混合使用,个数,类型
print_str(100, *[200, 300]) # 正确
print_str(*[100, 200], 300) # 正确
print_str(*[100], *[200], *[300]) # 正确
print_str(*[100], 200, *[300]) # 正确
print_str(*[100], 200, *[300]) # 正确
函数位置传参和关键字参数传参可以混合使用
print_str(100, c = 300, b = 200) # 正确
print_str(c = 300, b = 200, 100) # 错误
函数位置传参和字典传参可以混合使用
print_str(100, **{"c" : 300, "b" : 200})
print_str(**{"c" : 300, "b" : 200}, a=100)
在实参能唯一匹配到相应形参的情况下可以任意组合
函数的缺省参数
缺省参数语法:
注:
1、函数参数可以不采用缺省参数,如之前的例子,也可以有多个(可以全部都是)。
2、缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
示例:
图:缺省参数示例
示例2:
图:一旦出现缺省,后面都要缺省
图:一旦出现缺省,后面都要缺省
参数个数可变函数:
如之前学过的print函数,函数的参数个数是可以变化的,我们自定义的函数也可以很简单的实现函数参数个数可变。
1、*() 即 *元组 方式:
以元组方式实现函数参数个数可变。
2、**{} 即 **字典 方式:
以字典的方式实现参数个数可变函数。
3、参数可变(混合式):
采用元组,字典混合使用,实现参数个数可变函数。
命名关键字参数
图:问题
上例,函数期望要求kw输入中有 school和address两个关键字参数,但是实际调用时,不给的这两参数函数也会调用,这不是期望的。如何解决这个问题呢?命名关键字参数可以解决这个问题。
*号之后的参数,name1,name2就是命名关键字参数,函数调用时不指定 name1,name2就报错。
注:命名关键字参数和位置参数不同
示例:
函数小结:
1、Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
2、默认参数一定要用不可变对象
3、要注意定义可变参数和关键字参数的语法
*args是可变参数,args接收的是一个元组
**kw是关键字参数,kw接收的是一个字典
4、调用函数时如何传入可变参数和关键字参数:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})
def 语句实时运行
def 语句实际上是可执行的,当他运行时候,他创建一个新的函数对象,并将其绑定到一个变量名。
def 语句可以出现在其他任何语句出现的地方。
函数嵌套:
Python函数可以嵌套,实时运行另外一个例子。
函数变量
可以把函数名赋值给变量,通过变量调用函数。
一切皆对象!
函数做实参
可以把函数名赋值给变量,通过变量调用函数位置传参。
函数做返回值:
函数可以作为函数的返回值。
领取专属 10元无门槛券
私享最新 技术干货