python学习笔记整理03(函数)
1 语法:
1.1 基本语法:
# 1.定义函数 # 使用 def (define)关键字定义函数,且函数命名方法要遵循 标识符规则 def func1(): # 定义函数内的代码称为 函数体 print('函数1') # 2.调用函数 # 调用函数代码必须在函数体外,直接使用函数名即可调用 func1() #3.函数可嵌套使用 def func2(): fun1() print('函数2嵌套了函数1')
1.2 形参与实参:
# 形式参数,简称形参:定义函数时定义,起占位作用,没有实际数值 def func(num1, num2): # num1 num2 是形参 num = num1 + num2 # 在函数中会变化数值的参数,可以定义为形参 print(num) # 实际参数,简称实参:调用函数时传递,有实际数值 func1(1, 3) # 1 3 是实参,实参必须与形参数量一一对应
1.3 返回值:
# 用 return 关键字定义返回数据,若没有返回值可省略不写,或直接书写 return 不接数据 # 函数中得到的数据在后续的代码中还要使用,就需要将这个数据值返回,以供后续使用 def func(num1, num2): num = num1 + num2 return num # 函数代码遇到 return 就会结束执行
2 变量进阶
2.1 变量的本质
1)变量存储数据的方法是 引用地址,即将 数据地址 保存到 变量对应的内存中,可使用 id() 获取引用的数据地址
2)可变类型和不可变类型:数据所在的内存是否允许修改,允许修改就是可变类型,不允许修改就是不可变类型
①只有赋值运算符 = 可以改变变量的引用(不使用=,变量引用的数据中的内容是否会变化,会变化是可变的,不会变化是不可变的)
②可变类型:列表、字典、集合,不可变类型:整型、浮点型、字符串、元组
2.2 组包和拆包
a = 1 b = 2 # 组包 pack:将多个数据值使用逗号连接,组成元组 c = a, b # print(c) ===> (1, 2) #拆包 unpack:将容器中的数据值使用多个变量分别保存的过程 (a, b) = c # print(a) ===> 1,print(b) ===> 2 # 注意变量的个数和容器中数据的个数要保持一致 # 赋值运算符是将 右边代码的执行结果 保存在 左侧变量中 x, y, z = [1, 2, 3] # print(x, y, z) ===> 1, 2, 3
2.3 局部变量和全局变量
# 全局变量:在函数外部定义的变量,可以在整个代码中使用 g_num = 1 def func1(): # 局部变量:在函数内部定义的变量,只能在函数内部使用 num = 10 print(f'func1 函数中的局部变量{num}') def func2(): print(f'代码中的全局变量{g_num}') def func3(): # 函数内部默认是局部变量,若想在函数内部修改全局变量,必须先用 global 声明 global g_num g_num = 10 print(f'修改了全局变量{g_num}')
3 函数进阶
3.1 返回多个数据值
def func(a, b): num1 = a + b num2 = a - b # 函数中返回多个数据值,将多个数据值组成 容器 进行返回,一般是元组(组包) return num1, num2 # 获取数据方式一:索引 result = func(1, 2) print(result[0], result[1]) # 获取数据方式二:拆包 x, y = func(1, 2) print(x, y)
3.2 函数的参数
1)传参方式
def func(a, b, c): print(f'a:{a}, b:{b}, c:{c}') # 位置传参:按照形参顺序传递实参 func(1, 2, 3) # 关键字传参:指定具体形参传递数据值 func(a=1, b=2, c=3) # 混用:关键字传参必须在位置传参之后 func(1, 2, c=3)
2)完整的参数
def func(name, *args, sep=' ', **kwargs): pass # name 普通参数 # *args (arguments)不定长位置(元组)参数,可接收任意多个位置参数,必须写在 位置参数 的后面 # sep=' ' 默认参数(缺省参数),不传参时默认传递设置的默认值 # **kwargs (key arguments)不定长关键字(字典)参数,可接收任意多个关键字参数,必须写在 所有参数 的后面
# 不定长参数作为单个参数传参时需要先拆包 def func(*args, **kwargs): num = 0 for i in args: # num += i for j in kwargs.values(): num += j print(num) my_list = [1, 2, 3, 4] my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} # 想要将列表中的数据 分别作为位置参数 进行传参,需要用 * 对列表进行拆包操作 func(*my_list) # 想要将字典中的数据 分别作为关键字参数 进行传参,需要用 ** 对字典进行拆包操作 func(**my_dict)
3)匿名函数
# 标准函数:使用 def 定义的函数 # 匿名函数:使用 lambda 定义的函数 # 定义函数:lambda 参数: 一行代码,不需传参时,参数可省略,返回值是代码运行结果,不需要用 return # 使用函数:赋值给变量 变量 = lambda 参数: 一行代码 ,使用 变量() 调用函数 func1 = lambda: print('匿名函数') # func1() ===> 匿名函数 func2 = lambda: '匿名函数' # print(func2()) ===> 匿名函数 func3 = lambda a, b:print(a+b) # func3(1, 2) ===> 3 func4 = lambda a, b: a + b # print(func4(1, 2)) ===> 3
# 使用匿名函数作为参数为字典排序 # 列表.sort(key=lambda x: x[key]) user_list = [{'name': 'zhangsan', 'age': 18}, {'name': 'lisa', 'age': 28}, {'name': 'zhaosi', 'age': 20}] user_list.sort(key=lambda user_list: user_list['age']) print(user_list)