基本定义
定义:函数是指将一组语句的集合通过一个函数名封装起来,如果想要执行这段函数,只需要调用其函数名即可。
特性:
- 减少重复代码
- 程序可扩展
- 程序易于维护
语法定义
def function_name(*args): # def关键字用来定义函数 function_name函数名,*args代表可以有任意个参数
code #代码块
...
function_name(*args) #调用函数
参数的作用在于调用函数时,通过传入不同的参数来决定函数内部的执行流程,从而满足自己不同的需求。
注意:如果想要调用函数,必须要加括号,参数的话视实际情况而定,如果不加参数,不是调用函数,而是函数的地址,如下:
#python解释器
>>> def fun():
print('help')
>>> fun
<function fun at 0x0000000002F8CAE8> # at之后是内存地址
>>> fun()
help
参数
形参
形式参数,只有在被调用时才会分配内存单元,在调用结束时,即刻释放所分配的内存单元,因此形参只在函数内部有效,可以简单的理解为只是一种意义上的参数,在定义的不是并不占内存地址。
实参
实际参数,实际占用内存地址,在调用函数时,实际传递给函数的参数,函数访问该参数的内存地址,可以是常量、变量、函数等。
def fun(x, y): # x和y代表形参
print x + y
fun(a, b) # a和b代表实参
部分特殊参数
默认参数
在定义函数的时候可能会遇到这么一种情况,比如学生注册,在注册国籍的时候,如果是在中国境内,那么国籍很大一部分是中国,这样的话每次频繁输入会比较麻烦,那么可以将国籍设置成默认参数,不填写的话默认就是默认值,如果不一样的话可以对改参数进行修改,同样可以省掉大部分重复的工作。
默认函数定义语法:
#位置参数:以位置顺序确定对应关系的参数
def fun(param1, param2,param3='default value'): # 这里param1,param2叫做位置参数,param3叫做默认参数
code
...
这里需要注意的是,默认函数必须放在位置参数之后,否则会报错,SyntaxError: non-default argument follows default argument。
关键参数
正常情况下,给函数传参数的时候需要按照函数参数的的顺序,如果不想按照顺序就可以使用关键参数,只需要指定参数名即可,指定了参数名的参数就叫做关键参数,但是,关键参数必须放在位置参数之后。如下所示:
#python解释器
>>> def stu_register(name, age, major='math', country='中国'):
print("---注册学生信息---")
print("姓名:%s\n年龄:%s\n国籍:%s\n专业:%s" % (name, age, country,major))
>>> stu_register("张三", major='Chinese', age=23) # 正确调用
---注册学生信息---
姓名:张三
年龄:23
国籍:中国
专业:Chinese
>>> stu_register("张三", major='Chinese', 23, country="印度") # 错误调用
SyntaxError: positional argument follows keyword argument
非固定参数
在实际场景中可能会遇到一种情况,就是你也不知道调用者会传递多少个参数,那么就可能会用到python中的非固定参数。
python中的非固定参数有两种,一种是args,一种是**kwargs,区别是args会将传入参数打成元组形式,通常传递位置参数,**kwargs会将传入的参数打成字典,通常传递关键参数。
*args:
#python解释器
>>> student_register("张三", 22)
张三 22 () # 这里的括号就是上面的args,因为没有传值,所以为空。
>>> student_register("张三", 22, '中国', '河北')
张三 22 ('中国', '河北') # 将最后两个元素打成了tuple
**kwargs:
#python解释器
>>> def student_register(name, age, *args, **kwargs):
print(name, age, args, kwargs)
>>> student_register("张三", 22, "本科", "数学")
张三 22 ('本科', '数学') {} # ‘{}’里就是**kwargs,没传值,所以为空
>>> student_register("张三", 22, "本科", "数学",native_place='河北石家庄',address="山东济南")
张三 22 ('本科', '数学') {'native_place': '河北石家庄', 'address': '山东济南'}
返回值
我们上面定义的函数,都是在调用的时候直接进行输出的,那么我们能接受他们的返回值吗?
#python解释器
>>> info = stu_register("张三", major='Chinese', age=23)
---注册学生信息---
姓名:张三
年龄:23
国籍:中国
专业:Chinese
>>> print(info)
None
结果为None,说明我们没有获取到函数的运行结果,那么如果想获取运行结果给外部调用,那么就需要使用return语句来讲结果返回给调用者(这里解释一下,个人理解,你没有写return语句,不代表这个函数没有返回,只不过是返回None)。
# python解释器
>>> def stu_register(name, age, major='math', country='中国'):
if(age < 50):
print("---注册学生信息---")
print("姓名:%s\n年龄:%s\n国籍:%s\n专业:%s" % (name, age, country,major))
return "注册成功"
else:
print("年龄太大,注册失败")
return "注册失败"
>>> info = stu_register("张三", major='Chinese', age=23)
---注册学生信息---
姓名:张三
年龄:23
国籍:中国
专业:Chinese
>>> print(info)
注册成功
tips:函数在执行过程中如果遇见return语句,那么就会停止执行并返回结果,也就是在return后面的语句就不会执行了,如下图,上面的’return语句之后’并没有被打印出来
>>> def stu_register(name, age, major='math', country='中国'):
if(age < 50):
print("---注册学生信息---")
print("姓名:%s\n年龄:%s\n国籍:%s\n专业:%s" % (name, age, country,major))
return "注册成功"
print('return语句之后')
else:
print("年龄太大,注册失败")
return "注册失败"
print('return语句之后')
>>> stu_register("张三", major='Chinese', age=23)
---注册学生信息---
姓名:张三
年龄:23
国籍:中国
专业:Chinese
'注册成功'