概述: 为了提高编写代码效率以及代码的重用,我们将功能独立的代码块组织为一个小模块,这就是函数。
def function_name(参数1, 参数2=默认值):
# 函数逻辑代码
return 返回值
定义两数想加,返回结果的函数:
def add2num(a, b):
return a+b
函数变量作用域是变量生效的作用范围,主要分为两大类: 局部变量和全局变量。
局部变量就是在函数内部定义的变量。起作用范围只在这个函数内部,在函数外部无法访问。
不同函数内部中的局部变量是可以重名。
函数调用时,局部变量被创建,函数调用玩后这个变量消失不在能够使用。
当在函数内部中 使用 变量名 = 数据 时,此时我们认为这是定义了一个局部变量。
当在函数内部出现 global 全局变量名 = 数据 时,则这里调用的是全局变量 对全局变量进行读写。
global 也可以对多个 全局变量在函数内部进行声明。
调用函数时,传递的参数顺序和个数要和参数一致。
函数调用也可以通过 “键=值” 形式加以指定,这时顺序可以不和函数定义的一致。
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', age=20, gender='⼥')
user_info('⼩明', gender='男', age=16)
def printinfo(name, age=35):
# 打印任何传⼊的字符串
print("name: %s" % name)
print("age %d" % age)
# 调⽤printinfo函数
printinfo(name="miki") # 在函数执⾏过程中 age去默认值35
printinfo(age=9 ,name="miki")
格式:
def functionname([formal_args,] *args,dfarg=val, **kwargs):
"""函数_⽂档字符串"""
function_suite
return [expression]
formal_args 表示普通的函数参数定义,
*args 表示所有未命名的参数都会以元组的形式存放到args参数当中。
**kwargs 会存放除了函数声明的参数外的所有形如 key=value 格式的参数。
如果函数有缺省参数放在*args后面
def arg_test(a, b, *args, **kwargs):
print(f"a = {a}, b = {b}")
print(f"args type is {type(args)} ,value = {args}")
print(f"kwargs type is {type(kwargs)} ,value = {kwargs}")
arg_test(1, 2, 5 , 60, 80, name='zhangsan', age=20)
"""
a = 1, b = 2
args type is ,value = (5, 60, 80)
kwargs type is ,value = {'name': 'zhangsan', 'age': 20}
"""
def func(*args):
for ele in args:
print(ele)
l = [1,2,3]
# 传递列表给可变参数,元组,集合用法相同
func(*l)
"""
1
2
3
"""
def func_dict(**args):
for k, v in args.items():
print(f"k={k}, v={v}")
d1 = {"name" : "张三", "age" : 20}
func_dict(**d1)
"""
k=name, v=张三
k=age, v=20
"""
如果给字典前面只加一个* 则只会将字典的key解包到函数形参里。
函数一次返回多个数据时,以元组类型进行返回。
def divid(a, b):
shang = a//b
yushu = a % b
return shang, yushu #默认是元组
result = divid(5, 2)
print(result) # (2, 1)
print(type(result)) #
对多个返回值也可以直接拆包获取
def divid(a, b):
shang = a//b
yushu = a % b
return shang, yushu #默认是元组
r1, r2 = divid(5, 2)
print(r1) # 2
print(r2) # 1