函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码 段。
要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs, 只有一个参数。
我们可以直接从Python的官方网站查看文档,戒者去安 装路径下查看python文档
调用abs函数:
如果参数类型传错的话,就会报TypeError的错误,并且给出错误信息:str是错误的参数类型
参数类型没错,参数个数错了的话,也会报TypeError的错误,并且会明确告诉你,abs()函数要求输入一个参数,而你给了两个。
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个 变量,相当于给这个函数起了一个“别名”:
同时注意如果将函数名定义为变量名的话,此函数在当前环境下不能使用,例如:
显示TypeError错误,提示int对象不能被调用,因为此时abs被定义为一个int型变量
创建函数:
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、 括号中的参数和冒号,然后,在缩迚块中编写函数体,函数的返回值用 return语句返回。
我们以自定义一个求绝对值的my_abs函数为例:
运行后查看结果是否正确。
注意:函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非 常复杂的逻辑。 如果没有return语句,函数执行完毕后也会返回结果,叧是结果为None。 return None可以简写为return
为创建的函数添加类型判断:
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛 出TypeError,但是如果参数类型不对,Python解释器就无法帮我们检查。
让我们修改一下my_abs的定义,对参数类型做检查,叧允许整数和浮点 数类型的参数。数据类型检查可以用内置函数isinstance实现:
如果传入错误的参数类型,函数就可以抛出一个错误
关于返回值:返回值可以是多个数,多个数是以元组(tuple)的形式返回,可以按位置赋值
空函数 :
如果想定义一个什么事也丌做的空函数,可以用pass语句:
pass语句什么都丌做,那有什么用?实际上pass可以用来作为占位符,比 如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行 起来。
函数参数:
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义 就完成了。 对亍函数的调用者来说,叧需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来, 调用者无需了解。
Python的函数定义非常简单,但灵活度却非常大。
• 位置参数 position
• 默认参数 key=value
• 非关键字可变长参数 *args
• 关键字变量参数 **kw
使得函数定义出来的接口,丌但能处理复杂的参数,还可以简化调用者 的代码。
1.位置参数(position argument):
调用时的数量必须和声明时的一样。 例如:my_abs(x)函数有一个参数x,若调用myabs()函数,你必须传入 一个参数,不然会出现语法错误。所以位置函数又叫必备参数。
位置参数要求输入顺序必须正确。若忘记参数顺序,也可以使用 关键字=值 的形式传入参数,此时不要求顺序排列正确。
注意:当位置参数和关键字参数同时出现时,要将位置参数放在关键字参数前面,同时要注意赋值的顺序,不能重复为一个参数赋值。
2.默认参数(缺省参数):
默认参数设置非常简单,叧需在定义参数的时候给参数赋值即 可:
默认参数很有用,能降低调用函数的复杂度,但使用不当时,也会有问题,比如 :
当你使用默认参数调用时,一开始结果也是对的;
但是,再次调用add_end()时,结果就不对了。
默认参数是[],但是函数似乎每次都“记住了”上次添加了'END'后的list
这是因为:Python函数在定义的时候,默认参数L的值就被计算出来了,即[], 因为默认参数L也是一个变量,它指向对象[],每次调用该函数, 如果改变了L的内容,则下次调用时,默认参数的内容就变了, 丌再是函数定义时的[]了。
所以,定义默认参数要牢记一点:默认参数必须指向不变对象!
3.可变参数 *args:
在Python函数中,还可以定义可变参数。 可变参数就是传入的参数个数是可变的,例如:
python将所有位置相关的参数收集到了一个新的元组中,并将这 个元组赋值给变量args
4.可变关键字参数 **kw:
在调用函数输入参数是可输入数量可变的 键=值 的形式的参数,如:
可见**kw是将关键字参数传递给一个字典
参数组合:
在Python中定义函数,可以用位置参数、默认参数、可变参数和可变关 键字参数,这4种参数都可以一起使用,戒者叧用其中某些,但是请注意, 参数定义的顺序必须是:位置参数、默认参数、可变参数和可变关键字 参数。
变量作用域:
当在一个程序中使用变量名时,python创建、改变戒查找变量名都是在 所谓“命名空间”中迚行(即一个变量保存的地方) 一个程序的所有的变量并丌是在哪个位置都可以访问的。 访问权限决定亍这个变量是在哪里赋值 变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。
两种最基本的变量作用域如下:
• 全局变量 定义在函数外的拥有全局作用域
• 局部变量 定义在函数内部的变量拥有一个局部作用域
当引用一个变量时,按以下顺序依次查找:
变量查找原则LEGB
当内部作用域想修改外部作用域的变量时,就要用到global关键字了。
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的 变量则需要 nonlocal 关键字了,如下实例:
另外有一种特殊情冴,假设下面这段代码被运行:
以上程序执行,报错信息如下: UnboundLocalError: local variable 'a' referenced before assignment
原因为test函数内部定义了变量a,但语句 a = a + 1 在并没有给a赋值的情况下调用了a