函数是组织好的,可重复使用的,用来实现单一或相关联的代码段。
函数能提高应用的模块性和代码的重复你用你。Python提供了很多内建函数,我们也可以自己创建函数,被叫做用户自定义函数。
Python定义函数使用def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
简单的函数示例:
1、定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
l函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
l任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
l函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明。
l函数内容以冒号起始,并且缩进。
lreturn[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。
2、函数变量作用域
定义在函数内部的变量拥有一个局部作用域,定义在函数外的变量拥有全局作用域,全局作用域的变量如果在函数内被赋值,则这个局部变量覆盖了全局变量,该改变仅函数体内有效。如果需要在函数体内使用全局函数,用global申明后使用。
示例如下:
3、参数传递
在Python中,不同类型的参数传递进入函数后,对参数操作后对原值影响会不一样。
l不可变类型(整数、字符串、元组):类似值传递,比如fun(a),传递的只是a的值,在函数内修改a,只是修改另一个复制的对象,不会影响a本身。
l可变类型(列表、字典):类似引用传递或地址传递,如fun(b),是将b真正的传进去,在函数内修改b,外部的b也会受到影响。
Python中一切都是对象,所以我们通常说传不可变对象和传可变对象。
4、参数
调用函数时可使用的正式参数类型:
l必备参数
l命名参数
l缺省参数
l不定长参数
必备参数
必备参数或称位置实参,须以正确的顺序传入函数。调用的数量必须和声明时一样。
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数运行函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。
函数也可以使用 kwarg=value的关键字参数形式被调用,例如内置函数print。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
lobjects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
lsep -- 用来间隔多个对象,默认值是一个空格。
lend -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
lfile -- 要写入的文件对象。
lflush -- 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
缺省参数
定义函数时,可以给某个参数赋值一个默认值,具有默认值的参数就叫做缺省参数
l调用函数时,如果没有传入缺省参数的值,则在函数内部使用参数默认值
l将常用的值设置为参数的缺省值,从而简化函数的调用
l要使用最常见的值作为默认值
l如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递
l必须保证带有默认值的缺省参数在参数列表末尾
l在调用函数时,如果有多个缺省参数,需要指定参数名,这样Python解释器才能知道参数的对应关系
示例如下:
多值参数
当函数需要处理的参数个数不确定时,可使用多值参数。Python有两种多值参数:
l元组:参数名前加一个星号(*)
l字典:参数名前加两个星号(**)
一般在给多值参数命名时,习惯使用以下两个名字
l*args存放元组参数
l**kwargs 存放字典参数(kw即keyword,kwargs即键值对参数)
拆包
在上面多值参数传递时,实际使用了拆包功能。拆包主要用于元组和字典参数的传递。在调用带有多值参数的函数时,使用拆包简化参数的传递:
直接将一个元组变量实参传递给元组形参args,在元组变量前,加星号(*)
直接将一个字典变量实参传递给字典形参kwagrs,在字典变量前加两个星号(**)
示例如下:
5、返回值
Python函数返回值使用return语句,可以将函数作为一个值赋值给指定变量,也可以返回空值。