函数的基本使用(二)
函数的基本使用(二)
1、函数的返回值
- 函数体代码没有return关键字,默认返回None
实例如下:
# 返回值
# 没有return关键字,返回None
def max(a,b):
if a>b:
print(a)
else:
print(b)
res = max(1,2)
print(res)
# 结果
2
None
- 函数体代码只有关键字return,return后面没有跟返回值,默认也是返回None
实例如下:
# 返回值
# 有return关键字,return后面没有跟返回值,返回None
def max(a,b):
if a>b:
print(a)
else:
print(b)
return
res = max(1,2)
print(res)
# 结果
2
None
- 函数体代码有关键字return,return后面跟了返回值,那么就会返回return后的值,如果return后面跟了多个返回值,返回值组织成为元组返回
实例如下:
# 返回值
# 函数体代码有关键字return,return后面跟了返回值,那么就会返回return后的值
# 跟了单个值
def max(a, b):
if a > b:
print(a)
else:
print(b)
return '单个值'
res = max(1, 2)
print(res)
# 结果
# 2
# 单个值
# 跟多个值
def max(a, b):
if a > b:
print(a)
else:
print(b)
#以元组的形式返回
return '跟了','多个值'
res = max(1, 2)
print(res)
2、函数参数两大分类
① 参数的思维导图
② 函数参数的两大分类
-
形式参数 -- 形参
- 在函数定义阶段括号内所填的参数
-
实际参数 -- 实参
- 在函数调用阶段括号内所填的参数
实例如下:
注意:形参的表现形式只有一种就是以变量名的形式出现,
而实参的表现形式可以有很多种(数值,表达式·····)
③ 位置参数
定义:按照从左往右顺序依次填入的参数
- 位置形参
- 在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
- 位置实参
- 在函数调用阶段括号内按照从左往右的顺序依次填入的数据值
注意:位置形参与位置实参的位置一一对应,传参的时候不能多传入或者少传入
实例如下:
④ 关键字参数
-
关键字参数只有实参赋值用
-
在函数调用阶段通过形参名 = 数据值的形式使用
实例如下:
def max(a,b):
if a>b:
print(a)
else:
print(b)
# 调用
# 默认位置参数传值
max(4,2)
# 关键字实参
max(4,b=2)
max(b = 2,a = 4)
# 结果
4
4
4
# 位置参数必须在关键字参数前
# max(a=4,2) # 关键字实参在位置实参前报错
# SyntaxError: positional argument follows keyword argument
⑤ 默认参数
-
默认参数只有默认形参
-
该形参在函数调用阶段如果不给赋值,则使用函数定义形参时的默认参数。
-
默认形参在调用阶段可以赋值,如果赋值就使用赋值的数据
-
位置参数必须在默认参数前
实例如下:
# 默认参数
# 定义形参,name,age为位置形参,sex为默认参数
def login(name,age,sex ='male'):
print(name,age,sex)
# 调用函数
# 调用函数不传入默认参数的时候
login('HammerZe',18)
# 结果
# HammerZe 18 male
# 调用函数传入默认参数的时候
login('HammerZe',18,'famale')
login('HammerZe',18,sex='shemale')
# 结果
# HammerZe 18 famale
# HammerZe 18 shemale
⑥ 可变长参数
函数无论传入多少位置参数都可以正常运行
可变长形参
① 第一种可变长形参:
- 格式:
- def fun(*args)
- 定义:
- 用于接收多余的位置参数,并组织成元组的形式赋值给*号后面的变量名
实例如下:
def info(name,age,*args):
print(name,age,args)
info('HammerZe',18,'male','199****1234')
# 结果
HammerZe 18 ('male', '199****1234')
只能用于位置参数,关键字参数不能用*args来接收
② 第二种可变长形参:
- 格式
- def fun(**kwargs)
- 定义
- 用于接收多余的关键字参数,并组织成字典的形式赋值给**号后面的变量名
实例如下:
def info(name,age,**kwarg):
print(name,age,kwarg)
info('HammerZe',18,sex = 'male',number ='199****1234')
# 结果
HammerZe 18 {'sex': 'male', 'number': '199****1234'}
③ 综合使用
实例如下:
def info(name,age,*args,**kwarg):
print(name,age,args,kwarg)
info('HammerZe',18,
'male',number ='199****1234')
# 结果
HammerZe 18 ('male',) {'number': '199****1234'}
注意!可变长形参定义格式* 和 * * 后面的变量名其实可以随便定义,但是在python中推荐使用 * args和 ** kwargs!!
可变长实参
① 第一种可变长实参:
-
格式:
-
def fun(*args):
fun( *list / *tuple)
-
-
定义:*号在实参中的使用是将列表、元组的元素打散成位置参数的形式一一传值
实例如下:
def info(*args):
print(args)
userinfo = ['HammerZe',18,'male','199****1234']
userinfo1 = ('HammerZe',18,'male','199****1234')
# 使用列表和元组都可以,输出的结果都为元组
info(*userinfo)
info(*userinfo1)
# 结果
('HammerZe', 18, 'male', '199****1234')
('HammerZe', 18, 'male', '199****1234')
① 第二种可变长实参:
-
格式:
-
def fun( **kwargs ):
fun(**dict)
-
-
定义:**号在实参中使用会将字典内的键值对打散成关键字参数传入
实例如下:
def info(**kwargs):
print(kwargs)
userinfo = {'name':'HammerZe','age':18,'sex':'male','numbers':'199****1234'}
# 使用字典被当作关键字参数传入,输出结果为字典
info(**userinfo)
# 结果
{'name': 'HammerZe', 'age': 18, 'sex': 'male', 'numbers': '199****1234'}
⑦函数参数补充
命名关键字参数
实例如下:
# 定义格式
def register(name,age,*,sex,number):
print(name,age,sex,number)
return name,age,sex,number
# 位置形参传参完成后的参数必须使用关键字实参传参
register('HammerZe',18,sex='male',number='199****1234')
# 不使用关键字参数传参报错
register('HammerZe',18,'male','199****1234')
#TypeError: register() takes 2 positional arguments but 4 were given
3、名称空间 -- namespaces
① 名称空间简介
-
定义:用于存放变量名与变量值绑定关系的地方
-
名称空间分类:
内置名称空间:
定义:python解释器提前定义好的
实例如下:
print()/len()/range()·····
全局名称空间:
定义 : 在py文件中顶格写的代码运行之后都会存入全局名称空间
实例如下:
name = 'HammerZe'
def fun(): # fun为全局名称
pass
if True:
a = 123 # a为全局
for i in range(10):
print(i) # i为全局
while True:
a = 1 # a为全局
局部名称空间:
定义 : 函数体代码运行之后产生的都是局部名称空间
实例如下:
x = 1 # 全局
def fun(x):
'''代码体'''
x=123
# 局部
print(x)
fun(x)
# 全局
print(x)
# 结果
123 # 函数体的结果为局部x返回123
1 # 全局x 返回1
② 存活周期
-
内置名称空间
python解释器启动与关闭而创建和销毁
-
全局名称空间
随着python文件的运行与结束而创建和销毁
-
局部名称空间
随着函数体代码的执行与结束而创建和销毁
③ 名字的查找顺序
- 如果在局部查找:
- 局部 → 全局 → 内置
- 如果在全局查找:
- 全局 → 内置
实例如下:
# 用len举例,来验证查找顺序
len = '全局名称'
def findname():
len = '局部名称'
print(len)
# 调用函数输出局部名称
findname()
# 全局名称
print(len)
# 结果
# 局部名称
# 全局名称
查找内置:
- 找不到局部全局名称>>到局部
实例如下:
# 用len举例,来验证查找顺序
# len = '全局名称'
# def findname():
# len = '局部名称'
# print(len)
#
# 调用函数输出局部名称
# findname()
# 全局名称
print(len)
# 全部注释掉,最后查找的就是内置
#结果
<built-in function len>
局部名称空间特例:
函数在定义阶段,名字的查找顺序就固定了!
在哪个区间找名字输出的就是什么名称
局部变量在赋值前被引用是错的,先定义后查找
实例如下:
def f1(): # f1为全局
# 在f1下查找输出222
x = 222
def f2():
# 在f2下查找输出333
x = 333
def f3():
# 在f3下查找输出444
x = 444
def f4():
# 在f4下查找输出555
x = 555
print(x)
# x = 555 # 特例,局部变量在赋值前被引用是错的,先定义后查找
f4()
f3()
f2()
# 通过调用f1()来查找
f1()
# 结果
555
函数思维导图:
持续更新中······