💡大纲
- 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
⭕在解决一个复杂问题的时候,顺序式编程在可读性和代码复用性方面的体验感很差,可以采用面向过程的编程。
一、函数的定义及调用👉掌握函数的定义和调用
👉掌握位置参数、关键字参数和参数默认值的使用
👉掌握参数返回值的定义和使用
(一)为什么要用函数
提高代码复用性,简化代码框架,把需要重复利用的代码抽象出来,封装为函数
采用模块化设计的思想,将复杂的大问题分解成一系列小问题来解决
利于代码的维护和管理,对于某个函数的修改相对于顺序式程序的修改更简单方便
(二)函数的定义及调用
💡整体结构:输入---处理---输出
1、函数的定义
def 函数名(参数):
函数体
return 返回值
2、三要素:参数、函数体、返回值
3、函数的调用
👉函数名(参数)
# 求正方形的面积
def fun(side):area = pow(side, 2)return area area = fun(5)
area # 25
(三)参数
1、形参与实参
👉形参(形式参数):函数定义时的参数---变量名
👉实参(实际参数):函数调用时的参数---变量的值
2、位置参数
👉严格按照位置顺序,用实参对形参进行赋值(关联)
👉实参与形参个数必须一一对应,一个不能多,一个不能少
👉一般用在参数比较少的时候
def fun(x, y, z):print(x, y, z)fun(1, 2, 3) # x = 1; y = 2; z = 3
3、关键字参数
👉打破位置限制,以形参 = 实参的形式进行值的传递
👉实参与形参数量上一一对应
👉多用在参数比较多的场合
def fun(x, y, z):print(x, y, z)fun(y=1, z=2, x=3) # x = 3; y = 1; z = 2
👉位置参数可以与关键字参数混合使用,位置参数必须放在关键字参数前面
👉不能为同一个形参重复传值
fun(1, z=2, y=3) # 1 3 2
fun(1, z=2, x=3) # 报错,重复给x赋值
4、默认参数
👉在定义阶段就给形参赋值
👉默认参数必须放在非默认参数后面
👉调用函数时,可以不对该形参传值;也可以按正常的形参进行传值,会覆盖默认值
👉默认参数赋值等号两侧不需加空格
def stu(name, age, sex="male"):print(name, age, sex)stu("努力君", 24) # 努力君 24 male
stu("幽默君", 25, "female") # 幽默君 25 female
⚠️默认参数应该设置为不可变类型(数字、字符串、元组)
💡让参数变成可选的
def name(first, last, middle=None):if middle:return first+middle+lastelse:return first+lastprint(name("马", "梅")) # 马梅
print(name("马", "梅", "冬")) # 马冬梅
5、 可变长参数 *args
💡不知道会传过来多少参数,已知数量的形参正常赋值,多余的传给*args
💡也可以将实参打散
def fun(x, y, z, *args):print(x, y ,z)print(args)fun(1, 2, 3, 4, 5, 6) # 多余的参数,打包传递给args
'''
1 2 3
(4, 5, 6)
'''def fun(x, y, z, *args):print(x, y ,z)print(args)fun(1, 2, 3, [4, 5, 6])
'''
1 2 3
([4, 5, 6],)
'''
fun(1, 2, 3, *[4, 5, 6]) # 打散的是列表、字符串、元组或集合
'''
1 2 3
(4, 5, 6)
'''
6、可变长参数 **kwargs
def fun(x, y, z, **kwargs):print(x, y ,z)print(kwargs)fun(1, 2, 3, a=4, b=5, c=6) # 多余的参数,以字典的形式打包传递给kwargs
'''
1 2 3
{'a': 4, 'b': 5, 'c': 6}
'''fun(1, 2, 3, **{"a": 4, "b": 5, "c":6}) # 本身是一个字典,打散传递
'''
1 2 3
{'a': 4, 'b': 5, 'c': 6}
'''
def fun(*args, **kwargs):print(args)print(kwargs)fun(1, 2, 3, a=4, b=5, c=6)
'''
(1, 2, 3)
{'a': 4, 'b': 5, 'c': 6}
'''
(四)函数体与变量作用域范围’
1、函数体
2、变量
💡局部变量:仅在函数体内定义和发挥作用
👉在函数体中定义的变量,在函数执行完毕,局部变量就已经被释放掉了,不能再使用
💡全局变量:外部定义的都是全局变量,整个代码中都能使用
⭕如何在函数体里定义全局变量???
👉global 变量
def add(x, y):global zz = x+yreturn z print(add(2, 9))
print(z) # 11,可以正常使用
(五)返回值
1、单个返回值
2、以元组的形式返回多个值
👉返回值以逗号分开,打包返回,可以解包赋值
def fun(x):return 1, x, x**2, x**3 # 逗号分开,打包返回a, b , c, d = fun(3) # 解包赋值
print("a={},b={},c={},d={}".format(a,b,c,d)) # a=1,b=3,c=9,d=27
3、没有return语句,返回值为None
def fun():print("我是盾山狂热爱好者")bool1 = fun() # 我是盾山狂热爱好者
print(bool1) # None
⚠️可以有多个return 语句,一旦其中一个执行,代表了函数运行的结束
二、关于函数的建议(一)命名格式
👉字母小写及下划线组合
👉有实际意义,见明知意
⚠️保留字(关键字)不能作为函数名
(二)对于函数功能,复杂函数要有注释
(三)函数定义前后各空两行
def f1():# 空出两行
def f2():def f3():
三、附加:匿名函数
(一)基本形式
👉lambda 变量: 函数体
(二)匿名函数的用法
👉最适合使用在参数列表中,尤其是与key = 搭配
1、排序sort()、sorted()
ls = [(93, 88), (79, 100), (86, 71), (85, 85), (76, 94)]
ls.sort() # 对第一个参数进行升序排序
ls
# [(76, 94), (79, 100), (85, 85), (86, 71), (93, 88)]ls.sort(key = lambda x: x[1]) # 改为根据第二个参数进行排序
ls
# [(86, 71), (85, 85), (93, 88), (76, 94), (79, 100)]ls = [(93, 88), (79, 100), (86, 71), (85, 85), (76, 94)]
temp = sorted(ls, key = lambda x: x[0]+x[1], reverse=True)
temp
# [(93, 88), (79, 100), (85, 85), (76, 94), (86, 71)]
2、 最大最小值max()、min()
ls = [(93, 88), (79, 100), (86, 71), (85, 85), (76, 94)]
n = max(ls, key = lambda x: x[1])
n
# (79, 100)n = min(ls, key = lambda x: x[1])
# (86, 71)
⭕总结
👉面向过程——以过程为中心的编程思想,是一种程序化的编程
👉面向对象——以人中心的编程思想,是一种拟人化的编程,编程逻辑更符合人类的思想
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!