函数
一、介绍
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
语法定义
def func():#函数名 print("Hello,world") func() #调用函数
带参数
def add(a,b): c = a+b return c #返回函数执行结果 f = add(1,2)
二、函数参数
2.1形参和实参
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
def add(a,b): # a , b 为形参
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
f = add(1,2) # 1, 2 实参
2.2默认参数
def person_info(name,age,country,sex): print("-----个人信息-----") print("姓名:",name) print("年龄:",age) print("国籍:",country) print("性别:",sex) person_info("张三",23,"CN","M") person_info("李四",24,"CN","F") person_info("王五",25,"CN","F") person_info("赵六",26,"CN","M")
country这个参数的值都是CN,一般而言国籍如果我们不填写,默认就是中国,这就是通过默认参数实现的。我们可以把country设置成默认参数。
def person_info(name,age,sex,country="CN")
这样这个参数在调用时,就不用指定了,默认就是"CN",如果指定的话,就是指定的值。
2.3关键字参数
一般情况下,函数传递要按照顺序,不想按顺序可以使用关键字参数,指定参数名,但是关键字参数必须放在位置参数之后。
def person_info(name, age, gender, country='CN', province='ZJ'): print('姓名:', name) print('年龄:', age) print('性别:', gender) print('国籍:', country) print('省份:', province) person_info('bigberg', 20, 'M', province='JS', country='US') # 两个关键词参数可以交换位置,但是不能放在位置参数前面
三、参数组
- 非固定位置参数(*args)
- 非固定关键字参数(**kwargs)
3.1非固定位置参数
- 接收N个位置参数,转换成元组的形式
- 定义:
def test(*args): print(args) test(1,2,3,4,5) #输出 (1, 2, 3, 4, 5) # 参数转换为元组
如果只有一个非固定参数:
def test(*args): print(args) test(1) #输出 (1,)
3.传入列表
def test(*args): print(args) print("1".center(20,'-')) test() #空 print("2".center(20,'-')) test(*[1,2,3,4]) # 参数前面加*,输出的args = tuple([1,2,3,4]) print("3".center(20,'-')) test([1,2,3,4]) # 参数前面不加* ,则列表被当作单个位置参数 #输出 ---------1---------- () ---------2---------- (1, 2, 3, 4) ---------3---------- ([1, 2, 3, 4],)
4.位置参数和非固定位置参数
def test(a,*args): print(a) print(args) print("1".center(20,'-')) test(1,2,3,4,5) #输出 ---------1---------- 1 (2, 3, 4, 5)
5.关键字参数和非固定位置参数
def test(a,*args): print(a) print(args) print("1".center(20,'-')) test(x=1,2,3,4,5) #输出 File "G:/python/untitled/study2/parament.py", line 7 test(x=1,2,3,4,5) ^ SyntaxError: positional argument follows keyword argument 位置参数要在关键字参数之后
3.2非固定关键字参数
- 吧N个关键字参数,转换为字典形式
- 定义:
def test(**kwargs): print(kwargs) test(name="bigberg",sex="M") 输出 {'name': 'bigberg', 'sex': 'M'}
3.传入字典
def test(**kwargs): print(kwargs) test(**{"name":"bigberg","sex":"M"}) #输出 {'name': 'bigberg', 'sex': 'M'} #传入字典时,一定要加 ** ,否则会报错
4.位置参数和关键字参数
def test(a,**kwargs): print(a) print(kwargs) print("1".center(20,'-')) #只有位置参数 test("bigberg") print("2".center(20,'-')) test("bigberg",sex="M",country="CN") print("3".center(20,'-')) #只有关键字参数 test(a="bigberg",sex="M",country="CN") #输出 bigberg {} ---------2---------- bigberg {'sex': 'M', 'country': 'CN'} ---------3---------- bigberg {'sex': 'M', 'country': 'CN'}
5.位置参数、关键字参数和非固定关键字参数
def test(a,age=20,**kwargs): print(a) print(age) print(kwargs) print("1".center(20,'-')) #只有位置参数 test("bigberg") print("2".center(20,'-')) #age 传位置参数 test("bigberg",25,sex="M",country="CN") print("3".center(20,'-')) #关键字参数,位置在最后没有影响 test(a="bigberg",sex="M",country="CN",age=25) #输出 ---------1---------- bigberg 20 {} ---------2---------- bigberg 25 {'sex': 'M', 'country': 'CN'} ---------3---------- bigberg 25 {'sex': 'M', 'country': 'CN'}
6.位置参数、关键字参数、非固定位置参数和非固定关键字参数
def test(a,age=20,*args,**kwargs): print(a) print(age) print(args) print(kwargs) test("bigberg",25,1,2,3,4,sex='M',country='CN') #输出 bigberg 25 (1, 2, 3, 4) {'country': 'CN', 'sex': 'M'}
如果age传入的是关键字参数(age=25)并且在飞固定位置参数之前,就会报错
test("bigberg",age=25,1,2,3,4,sex='M',country='CN') #输出 File "G:/python/untitled/study2/parament.py", line 8 test("bigberg",age=25,1,2,3,4,sex='M',country='CN') ^ SyntaxError: positional argument follows keyword argument