函数(二)
函数
函数的定义与调用
此处所讲的函数的定义与调用的规则主要针对的是用户自定义函数
'''
1. 函数的调用一定要在定义之后
函数在定义完成之前调用,该函数名是没有作用的(会报错),所以函数的调用应该在定义之后
2. 函数在定义阶段,不会执行函数体代码,但是会检测基础语法
3. 函数体代码只有调用函数的时候才会执行,函数的调用是通过函数名+小括号实现的,其中括号内如果在定义阶段有参数的话需要传递参数
4. 函数名相当于变量名指向函数体代码所在的内存空间
'''
# 例:
func_name() # 报错
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
func_name() # 成功调用
函数的分类
内置函数
Python解释器提前已经定义好的函数,是可以直接调用的。比如我们经常使用的函数关键字:print、open、len等。这些内置函数的内部代码是可以通过ctrl+鼠标左键或者鼠标长时间指向该关键字进行查看
自定义函数
自定义函数就是指程序员自己编写定义的函数。自定义函数又可以分为有参数函数、无参函数、和空函数三种。
'''
1. 有参函数:在函数定义时小括号里有参数,调用阶段也必须写参数
例:
def func_name(arg): # 定义函数变量名
print(arg) # 函数体代码
func_name('hahaha') # 成功调用,输出结果为 hahaha
2. 无参函数:在函数定义时小括号里没有参数,调用阶段无需在括号里写参数
例:
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
func_name() # 成功调用
3. 空函数:在函数定义时函数体代码为pass或者...进行语法结构补全。其实该函数暂时无任何功能。空函数的作用目前有:罗列程序功能框架,使程序结构框架更清晰。
函数的返回值
函数的返回值即函数的定义阶段,尾部return返回的那个数据。其实就是函数调用后返回的结果。
# 例:
str1 = 'CHINA NO.1'
res = len(str1) # 获取len的返回值赋给res
print(res)
获取函数返回值
变量名 = 函数调用
关于函数返回值
- 函数定义阶段没有return的时候,返回值是None
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
res = func_name() # 函数调用后返回值赋给res
print(res)
- 函数定义阶段有return,但是其后没有任何值得时候,返回值是None
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
return
res = func_name() # 函数调用后返回值赋给res
print(res)
- 函数定义阶段有return,且其后跟了数据,跟什么返回什么
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
return 'CHINA NO.1'
res = func_name() # 函数调用后返回值赋给res
print(res)
- return后面可以跟多个返回值,并且所有的返回值会以元组的形式返回出去
def func_name(): # 定义函数变量名
print('CHINA NO.1') # 函数体代码
return 'CHINA NO.1', 'PUTIN 牛逼'
res = func_name() # 函数调用后返回值赋给res
print(res)
注:定义函数时,注意return不仅有返回值的作用,另一个作用是遇见return直接结束函数体代码的执行
函数的参数
函数的参数分类(参数出现时间)
- 形式参数
形式参数是在定义函数时写在函数名后面括号里的参数,简称形参 - 实际参数
实际参数是在调用函数时写在函数名后面括号里的参数,简称实参
两种参数的关系:形参类似于变量名,实参类似于实际数据,在函数调用时,实参会临时赋值给形参,函数执行结束会自动解除绑定
def func_name(arg): # 定义函数变量名
print(arg) # 函数体代码
func_name('hahaha') # 函数调用时,字符串'hahaha'会临时赋值给arg,结束后会与参数arg断开绑定
位置参数
位置参数是在变量名括号内从左至右依次填写的参数,又分为位置形参和位置实参,分别是函数定义和函数调用阶段的参数。
位置参数的特征
-
位置形参与位置实参在赋值关系时是从左至右依次对应的
-
位置形参与位置实参的个数一定相同,多一个或者少一个都不行
关键字参数
关键字参数出现在实参中,作用就是指定给某个形参赋值
def func_name(name, age):
print(f'my name is {name}, my age is{age}')
func_name(age = 23, name = 'oliver') # 无需考虑参数位置,指定给赋值
# func_name(23, name = 'oliver') # 错误
# func_name(age = 23, 'oliver') # 错误
# func_name('oliver', age = 23) # 相当于位置参数
注:通过后三种实参的情况,我们可以认为,当形参指定不完全时,参数的对应位置不能忽略,否则两个实参会重复绑定给一个形参
默认参数
默认参数出现在实参中,作用是给某个参数设定一个默认值,当没有数据传给该参数时,默认参数值就会是该参数的值,有数据传给该参数的话,会使用传入的值,注意默认参数一定要在位置的参数后面。
def func_name(name, age, job = 'student'): # 定义参数是将job参数的默认值设定为student
print('#' * 16)
print(f'my name is {name}\nmy age is {age}\nmy job is {job}')
print('#' * 16)
func_name('oliver', 23, 'no job') # 有第三参数时直接使用传给的第三参数值
func_name('kevin', 23, 'major')
func_name('tony', 23) # 无第三参数时是直接使用默认参数值作为第三参数
可变长参数
可变长参数产生的背景:为了保证在定义函数时,传入参数多余的话,仍然不影响该函数的功能。
'*'号
在定义函数时,可以用''加变量名将多余的位置参数收集到一个元组里去,然后将该元组赋值给''后面的变量名。
def func_name(name, age, *args):
print(f'名字:{name}\n年龄:{age}\n多余参数:{args}')
func_name('oliver', 23, 66, 88, 99)
注:此处的实参个数是需要等于或者大于位置形参的,否则会报错。应用该方法是首先要满足位置形参的个数需求
'**'号
''在定义函数时,可以用''加变量名将多余的关键字参数收集到一个字典里去,然后将该字典赋值给'*'后面的变量名。
def func_name(name, age, **kwargs):
print(f'名字:{name}\n年龄:{age}\n多余参数:{kwargs}')
func_name(name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)
可变长形参('*','**')
可变长形参是指如果在不确定函数有多少实际参数时,可以采用'*'和'**'都用的方法,保证无论传给该函数的参数有多少,函数都可以正常执行
def func_name(*args, **kwargs):
print(f'位置参数:{args}\n关键字参数:{kwargs}')
func_name('oliver', 23, 66, 88, 99, name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)
可变长参数在实参中的作用
# '*'和'**'在实际参数中的作用效果作用对象不同,其实作用效果差不多
# '*'在实参中的作用主要是将列表和元组的元素暴露出来,以位置参数的形式依次传入函数
# '**'在实参中的作用是将字典的内容打散成字典,以字典的形式传入函数
def func_name(*args, **kwargs):
print(f'位置参数:{args}\n关键字参数:{kwargs}')
func_name('oliver', 23, 66, 88, 99, name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)
2022/03/16结束
