第十课 函数
一.定义函数
def 函数名(参数1,参数2,...):
"""文档描述"""
函数体
return 值
def: 定义函数的关键字;
函数名:函数名指向函数内存地址,是对函数体代码的引用。函数的命名应该反映出函数的功能;
括号:括号内定义参数,参数是可有可无的,且无需指定参数的类型;
冒号:括号后要加冒号,然后在下一行开始缩进编写函数体的代码;
"""文档描述""": 描述函数功能,参数介绍等信息的文档,非必要,但是建议加上,从而增强函数的可读性;
函数体:由语句和表达式组成;
return 值:定义函数的返回值,return是可有可无的。
二. 函数的调用
函数的使用分为定义阶段与调用阶段,定义函数时只检测语法,不执行函数体代码,函数名加括号即函数调用,只有调用函数时才会执行函数体代码。
#定义阶段
def foo():
print('in the foo')
bar()
def bar():
print('in the bar')
#调用阶段
foo()
三.函数的返回值
使用关键字return
若需要将函数体代码执行的结果返回给调用者,则需要用到return。return后无值或直接省略return,则默认返回None,return的返回值无类型限制,且可以将多个返回值放到一个元组内。
四.形参和实参
>>>def Myfirstfunction(name):
函数定义过程中的name是形式参数叫形参
name只是一个形式,表示占据一个参数位置
>>>Myfirstfunction(‘小甲鱼’)
传递进来的小甲鱼叫做实参,因为他是具体的参数值
关键字实参:在调用函数时,实参可以是key=value的形式,称为关键字参数,凡是按照这种形式定义的实参,可以完全不按照从左到右的顺序定义,但仍能为指定的形参赋值
eg:
>>> register(sex='male',name='lili',age=18)
Name:lili Age:18 Sex:male
需要注意在调用函数时,实参也可以是按位置或按关键字的混合使用,/*但必须保证关键字参数在位置参数后面,且不可以对一个形参重复赋值*/
默认形参:默认形参调用时,可以不传值,那么就是默认值,传值就覆盖默认值。
eg:
>>> def register(name,age,sex='male'): #默认sex的值为male
print('Name:{} Age:{} Sex:{}'.format(name,age,sex))
notes:
默认参数必须在位置参数之后
默认参数的值仅在函数定义阶段被赋值一次
默认参数的值通常应设为不可变类型
五.变量的作用域
在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,最后都没有找到就会抛出异常
x=100 #全局作用域的名字x
def foo():
x=300 #局部作用域的名字x
print(x) #在局部找x
foo()#结果为300
print(x) #在全局找x,结果为100
global关键字
在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,则需要用到global关键字
x=1
def foo():
global x #声明x为全局名称空间的名字
x=2
foo()
print(x) #结果为2
六.闭包
如果在一个内部函数里,对在外部作用域的变量进行应用,测成为闭包
x=1
def outer():
x=2
def inner():
print(x) #此处的x就是外部函数的变量x,因此inner为闭包函数
return inner
func=outer()
func() # 结果为2
“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量。
七.lambda表达式
>>>def ds(x):
return 2 *x+1
>>>ds(5)
11
>>> lambda x : 2*x+1 // 冒号左边是函数值 右边是函数的表达式
>>>g = lambda x : 2*x+1
>>>g(5)
11
# 1、定义
lambda x,y,z:x+y+z
#等同于
def func(x,y,z):
return x+y+z
# 2、调用
# 方式一:
res=(lambda x,y,z:x+y+z)(1,2,3)
# 方式二:
func=lambda x,y,z:x+y+z # “匿名”的本质就是要没有名字,所以此处为匿名函数指定名字是没有意义的
res=func(1,2,3)
12
两个BIF
filter() //相当于一个过滤器。只保留true,删除false
map() // 将一串数字一次作为函数的实参进行运算并返回结果