认识函数
在一个完整的项目中,某些功能会反复使用。那么会将这部分功能封装成函数,使用这些功能时直接调用即可。函数的本质:对功能的封装。
函数分类
函数分为两类:
1.系统内建函数,如print()、len()等。
2.用户自定义函数
函数优点
1.简化代码结构,增加了代码的复用性(重复使用的程度)
2.如果想修改某些功能获取调试某个BUG,只需要修改对应的函数即可。
定义函数
格式
def:函数代码块以def关键字开始,
函数名:需遵循标识符规则。
参数列表(参数1,参数2,参数3,......,参数n):任何传入函数的参数和变量必须放在小括号之中,用英文逗号分隔。函数从函数调用者处获取信息。
冒号:函数内容(封装的功能)以冒号开始,并且缩进。
语句:函数封装实现具体业务的功能。
return:一般用于结束函数,并返回信息给函数调用者。
表达式:是要返回给函数的调用者信息;如果不写return,则没有返回即return None。
示例如下:
def 函数名(参数列表):
语句
return 表达式
创建函数
创建一个最简单的函数,没有参数没有返回的函数。
示例如下:
def test():
print('hello world')
函数的调用
格式:函数名(参数列表)
函数名:要调用的功能封装后的函数名称
参数列表:函数的调用者给函数传递的信息
函数调用的本质:实参给形参赋值的过程。
示例如下:
def test():
print('hello world')
# 调用最简单的函数
test()
test()
# 运算结果
# hello world
# hello world
函数参数
形参(形式参数):定义函数时小括号中的变量,本质是变量
参数必须按照顺序传递,个数也要对应。
实参(实际的参数):调佣函数时给函数传递的信息,本质是值。
函数传参示例
编写一个函数,输入名称和年龄,在函数内容打印出来。
示例如下:
def get_student(name, age):
print(name, age)
get_student('小明', 18)
# 运算结果
# 小明 18
不按照顺序
把名称和年龄交换位置进行传递。
示例如下:
def get_student(name, age):
print(name, age)
# get_student('小明', 18)
get_student(18, '小明')
# 运算结果
# 18 小明
结果并没有报错;但如果业务在复杂点,比如把变量整理成一段话;
因为变量的值不同,处理也不同,交换了变量的值就会产生错误。
示例如下:
def get_student(name, age):
# print(name, age)
print(name + '的岁数是' + str(age))
# get_student('小明', 18)
get_student(18, '小明')
结果如下:
Traceback (most recent call last):
File "E:\lianxipy\day3\函数1.py", line 27, in <module>
get_student(18, '小明')
File "E:\lianxipy\day3\函数1.py", line 24, in get_student
print(name + '的岁数是' + str(age))
TypeError: unsupported operand type(s) for +: 'int' and 'str'
个数不对应
个数不对应就是只传一个名称或者年龄。
示例如下:
def get_student(name, age):
# print(name, age)
print(name + '的岁数是' + str(age))
# get_student('小明', 18)
# get_student(18, '小明')
get_student('小明')
结果如下:
Traceback (most recent call last):
File "E:\lianxipy\day3\函数1.py", line 28, in <module>
get_student('小明')
TypeError: get_student() missing 1 required positional argument: 'age'
函数返回值
编写一个函数,传递两个数值类型的参数,返回这两个数的和。
示例如下:
def get_sum(num1, num2):
""" 计算两数之和 """
# 返回表达式
return num1 + num2
num_sum = get_sum(20, 34)
print(num_sum)
num_sum = get_sum(18, 34)
print(num_sum)
# 运算结果
# 54
# 52
在函数内部,执行完return语句,该函数就执行完成了,其后代码将不再执行。
传递参数
值传递
传递的不可变类型;String、tuple、number是不可变的
示例如下:
def fun1(num):
num = 20
num = 10
fun1(num)
print(num)
# 运算结果
# 10
实例中有int对象10,指向它的全局变量是num,在传递给 fun1 函数时,按传值的方式复制了全局变量 num,都指向了同一个Int对象,在num=20时,则新生成一个int值对象20,并让局部变量num指向它;但未改变全局变量num,故最后打印值没有改变。
引用传递
传递的可变类型;List、dict、set是可变的
示例如下:
def fun2(list1):
list1[0] += 10
list1 = [1, 2, 3, 4, 5]
fun2(list1)
print(list1)
# 运算结果
# [11, 2, 3, 4, 5]
实例中传入函数的和在方法内修改内容的对象用的是同一个引用,所以结果改变了。
关键字参数
关键字参数:允许函数调用时参数的顺序与定义不一致
示例如下:
def get_student(name, age):
print(name + '的岁数是' + str(age))
# 使用关键字参数
get_student(age=18, name='小明')
# 运算结果
# 小明的岁数是18
默认参数
默认参数:调用函数时,如果没有传递参数,则使用默认参数。
给方法设置了默认名称和默认年龄:
示例如下:
def get_student(name='小明', age=18):
print(name + '的岁数是' + str(age))
get_student()
get_student('小红')
get_student('小刚', 19)
# 运算结果
# 小明的岁数是18
# 小红的岁数是18
# 小刚的岁数是19
当不传递参数时,使用默认参数;如果有参数,则使用传递的参数。
注意:默认参数需要放到最后,否则会报错。
当设置名称为默认参数,年龄为必填参数时。
示例如下:
def get_student(name='小明', age):
print(name + '的岁数是' + str(age))
get_student(18)
直接调用会抛出错误:
E:\lianxipy\venv\Scripts\python.exe E:\lianxipy\day3\函数1.py
File "E:\lianxipy\day3\函数1.py", line 69
def get_student(name='小明', age):
^
SyntaxError: non-default argument follows default argument
正确设置为最后一个设置默认。
示例如下:
def get_student(name, age=18):
print(name + '的岁数是' + str(age))
get_student('张三')
# 运算结果
# 张三的岁数是18
不定长参数
概念:能处理比定义时更多的参数。
一个星号
示例如下:
def fun3(name, *arr):
print(name)
for x in arr:
print(x)
fun3('张三', '李四', '王五', '赵六')
# 运算结果
# 张三
# 李四
# 王五
# 赵六
加了星号(*)的变量存放所有未命名的变量值。
也就是:李四、王五、赵六
*arr格式为元组;如果在函数调用时没有指定参数,则*arr为一个空元组。
示例如下:
def fun3(name, *arr):
print(name)
print(arr)
for x in arr:
print(x)
fun3('张三', '李四', '王五', '赵六')
print('--'*10)
fun3('张三')
# 运算结果
# 张三
# ('李四', '王五', '赵六')
# 李四
# 王五
# 赵六
# --------------------
# 张三
# ()
两个星号
不定长参数的另一种实现方式,存储字典形式的参数值。
示例如下:
def fun4(**kwargs):
print(kwargs)
print(type(kwargs))
fun4(a=1, b=2, c=3)
# 运算结果
# {'a': 1, 'b': 2, 'c': 3}
# <class 'dict'>
**代表键值对的参数字典,和*所代表的意义类似。
示例如下:
def fun4(*arr, **kwargs):
# 数字 字符串类型的会被arr接收
print(arr)
print(type(arr))
# 字典类型的参数会被kwargs接收
print(kwargs)
print(type(kwargs))
fun4(1, 2, 'a', 'b', a=1, b=2, c=3)
# 运算结果
# (1, 2, 'a', 'b')
# <class 'tuple'>
# {'a': 1, 'b': 2, 'c': 3}
# <class 'dict'>
匿名函数lambda
概念
不适用def这样的语句定义函数,使用lambda来创建匿名函数
特点
1.Lambda只是一个表达式,函数体比def简单
2.Lambda的主体是一个表达式,而不是代码块,
仅仅只能在lambda表达式中封装简单的逻辑
3.Lambda函数有自己的命名空间,
且不能访问自由参数列表之外的或全局命名空间的参数
4.lambda是一个表达式且只能写一行,与C和C++内联函数不同
示例如下:
sum = lambda num1, num2:num1+num2
print(sum(2, 3))
# 运算结果
# 5
总结
通过学习python函数教学视频整理的笔记