函数
1.1 函数关键字
1.2 函数的定义
1.3 函数参数与作用域
1.4 函数返回值
函数就像乐高的积木一样,可以模块化又可以彼此组合,可以构成许多甚至优秀的作品。
一 函数关键字
关键字:def
二 函数定义
在python中,函数有5大基本要点,分别是def、函数名、函数体、参数,返回值等部分组成。
def: 函数的关键字
函数名:函数的名字,根据函数名调用函数
函数体:所写函数的具体内容
参数:为函数体提供数据
返回值:函数执行完毕后,返回的数据
一个函数的小例子:
>>>4
#定义函数 function1, 其作用是:参数的数值加上2,前提是参数a也是具体的数值
二 函数参数和作用域
2.1 函熟参数
函数的参数有必选参数,默认参数,可变参数,关键字参数,命名关键字参数
2.1.1 必选参数
input: function1(2)
output: 4
NOTE: 如代码所示,a就是一个必选参数
2.1.2 默认参数
>>>18
其中b就是默认参数
注:1.设置默认参数时,必选参数在前,默认参数在后,否则Python的解释器会报错;
2.定义默认参数要牢记:默认参数必须指向不可变对象!
2.1.3 可变参数
(1)当参数是可变的时候,我们可以把参数作为一个list或者tuple传进来。
>>>15
在调用函数的时候,需要将参数进行list话,如a=[1,2,3,4,5],然后才能调用。
(2)采用 *参数的形式 将参数变成可变参数‘
’
函数调用的时候:
(1)可以用function1(1,2,34,5)
或者
(2)a=(1,2,3,4,5)
function1(*a)
2.1.4 关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
1 #引入关键字参数,默认为**kw
2 def person(name, age, **kw):
3 print('name:', name, 'age:', age, 'other:', kw)
1 #调用关键字参数
2 >>>def person(name,age,**kw):
3 ... print('name:',name,'age:',age,'other:',kw)
4 ...
5 >>>person('Jack')
6 Traceback (most recent call last):
7 File "<stdin>", line 1, in <module>
8 TypeError: person() missing 1 required positional argument: 'age'
9 >>>person('Jack',36)
10 name:Jack age:36 other:{}
11 >>>person('Jack',36,city='Hangzhou')
12 name:Jack age:36 other:{'city':'Hangzhou'}
13 >>>person('Jack',36,city='Hangzhou',job='Engineer')
14 name:Jack age:36 other:{'city':'Hangzhou','job':'Engineer'}
2.1.5 命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。
仍以person()函数为例,我们希望检查是否有city和job参数:
2.2 函数作用域
全局名称空间:创建的存储“变量名与值的关系”的空间叫做全局名称空间
局部名称空间:在函数的运行中开辟的临时的空间叫做局部名称空间
内置名称空间:内置名称空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
python中的作用域分4种情况:
- L:local,局部作用域,即函数中定义的变量;
- E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的(闭包常见);
- G:globa,全局变量,就是模块级别定义的变量;
- B:built-in,系统固定模块里面的变量,比如int, bytearray等。
加载变量的优先级顺序依次是:py 内置作用域>当前模块中的全局(文件从上而下读取)>外层作用域>局部作用域
搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。
当然,local 和 enclosing 是相对的,enclosing 变量相对上层来说也是 local 。