1 函数简介
- 函数本质也是一个对象
- 函数保存一些可执行的代码,待需要时,可对这些语句进行多次调用
#语言
def 函数名([型参1,形参2,形参3...]):
代码块
- 注意:
- 函数名必须符合标识符规范(可包含字母、数字、下划线,但不能以数字开头)
- print也是一个函数对象,但print()是调用对象
2 函数的参数
2.1 形参和实参
- 形参(形式参数): 相当于在函数内部声明了变量,但并不赋值
- 实参(实际参数): 若指定了形参,那么在调用函数时必须传递实参,使得形参赋值,并且,实参将会赋值对应的形参,即有几个形参就有几个实参
2.2 函数的传递方式
- 定义形参时,可将形参指定为默认值,此时若用户传递了参数则默认值不生效,若没有传递,则默认值生效
- 位置参数:位置参数就是将对应位置的实参赋值给位置对应的形参
- 关键字参数:关键字参数可以不按照形参定义的顺序传递,而根据参数名传递
- 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前
3 不定长参数
- 定义参数时,可在形参前加*,则此形参可以获取到多个实参,并将它们保存在一个元组中
- 带*的形参是唯一的,只能有一个,但可以和其它参数配合使用
- *参数只能接收位置参数,不支持关键字参数
- **形参可以接收关键字参数,并将这些参数统一保存在字典中,字典的key就是参数的名字,字典的value就是参数的值
- **参数是唯一的,只有一个,必须写在所有参数后面
4 参数的解包
- 传递实参时,也可以在序列类型的参数前添加*,这样它会自动的将序列中的元素依此作为参数传递
- 序列中的元素必须和形参个数一致
5 函数基础练习
基础练习一: 创建并调用函数
#创建并调用函数,若不调用函数,程序不会执行函数代码块
def test(name=0): #name为形参,初始化默认值为 0
print('%s 说:你好'%(name))
n1=1
test() #不传入实参则调用默认值
test(n1) #传入实参则调用实参的值
'''
运行结果:
0 说:你好
1 说:你好
'''
基础练习二 :1. 进行位置参数传递
# def test(name,age=0,sex): SyntaxError: non-default argument follows default argument
#有默认值的参数必须在最后
# 若形参不设默认值,则调用时,传入的实参必须和形参数目相同,且位置一一对应
def test(name,age,sex):
print('姓名:%s 年龄:%s 性别:%s'%(name,age,sex))
n='张三'
a=15
s='男'
test(n,a,s)
test(s,a,n)
# test(n,a) TypeError: test() missing 1 required positional argument: 'sex'
'''
运行结果:
姓名:张三 年龄:15 性别:男
姓名:男 年龄:15 性别:张三
'''
基础练习二 :2. 解包方式进行位置参数传递
def test(name,age):
print('姓名:%s 年龄:%s '%(name,age))
n=['张三',15] #列表方式解包
a=('张三',15) #元组方式解包
s={'张三',15} #集合方式解包
test(*n)
test(*a)
test(*s)
基础练习三 :1. 进行不定长参数传递
def test(name,age,*sex):
print('姓名:%s 年龄:%s 性别:%s'%(name,age,sex))
n='张三'
a=15
s='男'
test(n,a,s,'as','df')
'''
运行结果:
姓名:张三 年龄:15 性别:('男', 'as', 'df')
姓名:张三 年龄:as 性别:('df',)
'''
基础练习三 :2. 解包方式进行不定长参数传递
def test(name,age,*sex):
print('姓名:%s 年龄:%s 性别:%s'%(name,age,sex))
n=['张三',15,'男','女']
a=('张三',15,'男','女')
s={'张三',15,'男','女'}
test(*n)
test(*a)
test(*s) # 集合方式解包会使集合内元素随机传递,不推荐
print(s)
'''
运行结果:
姓名:张三 年龄:15 性别:('男', '女')
姓名:张三 年龄:15 性别:('男', '女')
姓名:男 年龄:女 性别:('张三', 15) #第二次运行:姓名:张三 年龄:男 性别:('女', 15)
{'男', '女', '张三', 15}
'''
基础练习四:1. 进行关键字参数传递
def test(name,age,**sex):
print('姓名:%s 年龄:%s 性别:%s'%(name,age,sex))
n='张三'
a=15
s='男'
x=[a,2,3]
test(n,a,g1=a,g2=67)
'''
运行结果:
姓名:张三 年龄:15 性别:{'g1': 15, 'g2': 67}
'''
基础练习四:2. 解包方式进行关键字参数传递
def test(name,age,**sex):
print('姓名:%s 年龄:%s 性别:%s'%(name,age,sex))
a={'sex1':'男','sex2':'女'}
test('张三',15,**a)
print(a)
'''
运行结果:
姓名:张三 年龄:15 性别:{'sex1': '男', 'sex2': '女'}
{'sex1': '男', 'sex2': '女'}
'''
基础练习五:1. 进行命名关键字参数传递
def test(name,age,*,sex,city):
print('姓名:%s 年龄:%s 性别:%s,城市:%s'%(name,age,sex,city))
n='张三'
a=15
test(n,a,city='bj',sex='男')
# test(n,a) TypeError: test() missing 2 required keyword-only arguments: 'sex' and 'city'
# test()缺少2个必需的关键字参数:“sex”和“city”
'''
运行结果:
姓名:张三 年龄:15 性别:男,城市:bj
'''
基础练习五:2. 解包方式进行命名关键字参数传递
def test(name,age,*,sex,city):
print('姓名:%s 年龄:%s 性别:%s,城市:%s'%(name,age,sex,city))
n='张三'
a=15
s=dict(city='bj',sex='男')
test(n,a,**s)
'''
运行结果:
姓名:张三 年龄:15 性别:男,城市:bj
'''
基础练习六 参数组合
def test(name,age=0,*sex,a,b,**c): # a,b相当于命名关键字函数
print('姓名=%s 年龄=%s 性别=%s,a=%s,b=%s,c=%s'%(name,age,sex,a,b,c))
test("张三",18,'man',"woman",a='a',b='b',c='sd')
# test("张三",18,'man',"woman",c='sd') TypeError: test() missing 2 required keyword-only arguments: 'a' and 'b'
# test()缺少2个必需的仅限关键字的参数:“a”和“b”
'''
运行结果:
姓名=张三 年龄=18 性别=('man', 'woman'),a=a,b=b,c={'c': 'sd'}
'''
6 参数基础练习总结
- 可变参数:不定长参数(*参数),关键字参数(**参数)
- 不定长参数以元组(tuple)方式传递,关键字参数以字典(dict)方式传递
- 组合使用参数时,其顺序依次为位置参数、默认参数、不定长参数、命名关键字参数,关键字参数,并且此时命名关键字参数不需要 ” ,*, “作为分割
- 解包方式进行参数传递时,位置参数、不定长参数可以用列表、元组、集合进行解包,但集合解包会使集合内元素随机排列(如:基础练习三 :2. 解包方式进行不定长参数传递)
- 解包方式进行参数传递时,关键字参数和命名关键字参数需要用字典进行解包
- 解包方式进行参数传递时,不定长参数需要在实参前加一个*
- 解包方式进行参数传递时,关键字参数需要加两个 *
- 解包方式进行参数传递时,命名关键字参数除了要加两个*,还需要字典中关键字和参数中数量、名称保持一致
参考文章
Python之可变参数,参数,**参数,以及传入参数,**参数的解包 来源:优快云