• 📢博客主页:盾山狂热粉的博客_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)
⭕总结

👉面向过程——以过程为中心的编程思想,是一种程序化的编程

👉面向对象——以人中心的编程思想,是一种拟人化的编程,编程逻辑更符合人类的思想

 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!