目录
记录python函数的相关内容,通过函数,可以定义一些重复性的操作为函数,方便重复调用。
一、函数的创建和调用
1.创建函数
创建格式:
def functionname([parameterlist]):
["""comments"""]
[functionbody]
- functionname:函数名称
- parameterlist:可选参数,各个参数间用","分隔,"()"不可省略
- comments:可选参数,用来为函数指定注释,有定义时,调用函数的时候可以显示注释内容
- functionbody:可选参数,用于指定函数题,若有返回值则使用return返回结果
2.函数的调用
functionname([parametersvalue])
- 直接通过函数名调用;
- funtionname:函数名称,必须是已经创建的函数;
- parametersvalue:可选参数,对应函数创建时指定的函数参数,多个参数用","分隔,没有参数保留"()";
二、参数传递
1.形式参数和实际参数
- 形式参数:函数定义是设置的参数;
- 实际参数:调用函数时实际传递给函数的参数;
- 值传递:不可变类型进行值传递,改变形参值,实际参数的值不会变;
- 引用传递:可变数据类型进行,改变形参值,实际参数的值会跟随改变;
示例:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo(obj):
"""
func:打印传入参数,并添加自身
obj:传入参数,可以是任意类型
"""
print("调用时:",obj)
obj += obj
print("-----------值传递------------")
string = "this is a string" # 字符串为不可变对象
print("调用前:",string)
funcdemo(string)
print("调用后:",string)
print("-----------引用传递------------")
list_test = ["ok","no","NG"]
print("调用前:",list_test)
funcdemo(list_test)
print("调用后:",list_test)
结果:
-----------值传递------------
调用前: this is a string
调用时: this is a string
调用后: this is a string
-----------引用传递------------
调用前: ['ok', 'no', 'NG']
调用时: ['ok', 'no', 'NG']
调用后: ['ok', 'no', 'NG', 'ok', 'no', 'NG']
>>>
2.位置参数
位置参数也称必备参数,调用函数时必须按照正确的顺序传递到函数中。
- 参数数量必须与定义时一致;
- 参数位置必须与定义时一致。
参数少了或者参数类型错误而内部调用时无法正常转换的会报TypeError。
3.可变参数
使用可变参数定义函数参数,可以传递任意多个参数。
3.1 *parameter可变参数
以元组形式接收任意更多个参数,可以传入元组
示例:
# _*_ coding:gbk _*_
def printUser(*user):
for index,item in enumerate(user):
print("I'm number : {}, my name is : {}".format(index,item))
print(r'printUser("Tom","Jim","Josn")')
printUser("Tom","Jim","Josn")
结果:
printUser("Tom","Jim","Josn")
I'm number : 0, my name is : Tom
I'm number : 1, my name is : Jim
I'm number : 2, my name is : Josn
3.2 **parameter可变参数
以字典形式接受任意多个带参数名的参数,也可以将字典加上“**”直接传入
示例:
# _*_ coding:gbk _*_
def printUser(**user):
for key,value in user.items():
print("I'm number : {}, my name is : {}".format(key,value))
print(r'printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")')
printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")
dict_user = {"Tom":"Tom", "Jim":"Jim","Json":"Josn"}
print("dict_user:",dict_user)
printUser(**dict_user)
print(r'printUser("Tom","Jim","Josn")')
printUser("Tom","Jim","Josn")
结果:
printUser(Tom = "Tom", Jim = "Jim",Json = "Josn")
I'm number : Tom, my name is : Tom
I'm number : Jim, my name is : Jim
I'm number : Json, my name is : Josn
dict_user: {'Tom': 'Tom', 'Jim': 'Jim', 'Json': 'Josn'}
I'm number : Tom, my name is : Tom
I'm number : Jim, my name is : Jim
I'm number : Json, my name is : Josn
printUser("Tom","Jim","Josn")
Traceback (most recent call last):
File "E:\Desktop\Demo.py", line 17, in <module>
printUser("Tom","Jim","Josn")
TypeError: printUser() takes 0 positional arguments but 3 were given
注意:
传入类型非字典或者没有参数名时会报错TypeError。
4.关键字参数
4.1 关键字参数
使用形式参数的名称来确认传入的参数值。
使用关键字参数可以不用与定义的参数顺序保持完全一直,只需要保持参数名正确即可,相对会更灵活方便。
示例:
# _*_ coding:gbk _*_
def personInfo(name,age):
print("My name is : ",name)
print("My age is : ",age)
print(r'personInof("Tom",18)')
personInfo("Tom",18)
print(r'personInof(name = "Tom",age = 18)')
personInfo(name = "Tom",age = 18)
print(r'personInof(age = 18,name = "Tom")')
personInfo(age = 18,name = "Tom")
结果:
personInof("Tom",18)
My name is : Tom
My age is : 18
personInof(name = "Tom",age = 18)
My name is : Tom
My age is : 18
personInof(age = 18,name = "Tom")
My name is : Tom
My age is : 18
4.2 命名关键字参数
def functionname([parameterlist],*,[parameterlist1]):
["""comments"""]
[functionbody]
- 通过“*”分隔函数的参数,*之后的参数就是命名关键字参数,传入是需要指定的名称才行,否则会报错
- 若先声明了可变参数,则元组可变参数(*parameter)后面的参数为命名关键字参数,不需要再行添加“*”
- 字典可变参数(**parameter)后不可添加名字关键字参数
示例1,命名关键字参数:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo(name,age,*,gender,job):
"""
func:打印传入参数
"""
print(name,age,gender,job)
funcdemo("小明",18,gender="M",job="混子")
结果:
小明 18 M 混子
>>>
若调用时没有使用关键字参数则会报错:
示例2,声明可变参数后,命名关键字参数:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo(name,age,*classes,gender,job):
"""
func:打印参数
"""
print(name,age,classes,gender,job)
funcdemo("小明",18,"英语","数学",gender="M",job="混子")
结果:
小明 18 ('英语', '数学') M 混子
若没有关键字,则会报错:
注:字典可变参数后不可添加命名可变参数,否则会报错。
5.为参数设置默认值
在定义函数的时候直接定义默认值,这样即使调用函数的时候没有传入参数,函数会自动调用默认值,避免因为参数没有传入导致函数异常报错。
格式:
def functionname([parameterlist = defaultvalue]):
["""comments"""]
[functionbody]
- functionname:函数名称
- parameterlist:可选参数,各个参数间用","分隔,"()"不可省略
- defaultvalue:默认值0,默认参数必须指向不可变对象,建议用None做默认值,若使用可变对象作为默认值,多次调用时可能会发生预期之外的结果。
- comments:可选参数,用来为函数指定注释,有定义时,调用函数的时候可以显示注释内容
- functionbody:可选参数,用于指定函数题,若有返回值则使用return返回结果
三、返回值
返回函数值。
return [value]
四、变量的作用域
1.局部变量
局部变量指在函数内部定义并使用的变量,只在函数内部才有效。
示例:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo():
"""
func:打印参数
"""
obj = "这个是是局部变量"
print("函数内打印局部变量::",obj)
funcdemo()
print("函数外打印局部变量::",obj)
结果:
函数内打印局部变量:: 这个是是局部变量
Traceback (most recent call last):
File "D:\Desktop\Demo.py", line 14, in <module>
print("函数外打印局部变量::",obj)
NameError: name 'obj' is not defined
>>>
局部变量只能在函数内使用,在外部调用时会报错NameError。
2.全局变量
全局变量指可以在函数外部使用的变量。有两种定义方式:
- 在函数体外部定义的变量
- 在函数体内定义,不过添加global关键字修饰后改为全局变量
示例1,在函数外声明全局变量:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo():
"""
func:打印参数
"""
print("函数内打印全局变量::",obj)
obj = "这个是是全局变量"
funcdemo()
print("函数外打印全局变量::",obj)
结果:
函数内打印全局变量:: 这个是是全局变量
函数外打印全局变量:: 这个是是全局变量
在外部生命全局变量,在函数内或者函数外都可以正常调用。
示例2,在函数类用global关键字声明全局变量:
# _*_ coding:utf-8 _*_
# 定义函数
def funcdemo():
"""
func:打印参数
"""
global obj
obj = "这个是是全局变量"
print("函数内打印全局变量::",obj)
funcdemo()
print("函数外打印全局变量::",obj)
结果:
函数内打印全局变量:: 这个是是全局变量
函数外打印全局变量:: 这个是是全局变量
注意:
- 使用global声明时,需要单独一行声明变量,不能声明变量的时候直接赋值。
- 外部调用时需要函数题内部先调用,否则也会报错。
五、匿名函数
使用lamba创建匿名函数,仅使用一次,不需要对函数进行命名。
格式如下:
result = lamba [arg1[,arg2,...,argn]]:expression
- result:用于调用表达式
- [arg1[,arg2,...,argn]]:可选参数,指定传递的参数列表,用“,”分隔
- expression:必选参数,使用某个功能的表达式
- 参数可以有多个,但表达式只能有一个,并且不能有for或while的表达语句。
六、常用函数
函数 | 说明 | 备注 |
---|---|---|
eval() | 获取表达式的值 | |