2022年 11月 5日

【Python 26】函数的定义和调用

目录

1、函数的创建和调用

2、函数的参数传递

3、函数的返回值

4、函数的参数定义

5、变量的作用域

6、递归函数

 6.1 什么是递归函数

 6.2 递归的组成部分

 6.3 递归的调用过程

 6.4 递归的优缺点


1、函数的创建和调用

(1) 函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数。

(2) 复用代码,隐藏实现细节,提高可维护性
(3) 提高可读性便于调试

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 14:41
  3. def calc(a, b): # 形参
  4. c = a + b
  5. return c
  6. result = calc(10, 20) # 位置实参
  7. print(result)
  8. rec = calc(b=10, a=20) # 关键字实参
  9. print(rec)

2、函数的参数传递

如果是不可变对象,在函数体的修改不会影响实参的值
如果是可变对象,在函数体的的修改会影响到实参值的修改

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 14:57
  3. def fun(arg1, arg2):
  4. print('arg1', arg1)
  5. print('arg2', arg2)
  6. arg1 = 100
  7. arg2.append(10)
  8. print('arg1', arg1)
  9. print('arg2', arg2)
  10. n1 = 11
  11. n2 = [22, 33, 44]
  12. print('n1', n1)
  13. print('n2', n2)
  14. fun(n1, n2)
  15. print('n1', n1)
  16. print('n2', n2)

3、函数的返回值

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 15:07
  3. print(bool(0))
  4. print(bool(8))
  5. def fun(num):
  6. odd = [] # 存奇数
  7. even = [] # 存偶数
  8. for i in num:
  9. if i % 2:
  10. odd.append(i)
  11. else:
  12. even.append(i)
  13. return odd, even
  14. lst = [10, 29, 34, 44, 53, 55]
  15. print(fun(lst)) # 返回的是元组: 元素是列表
  16. '''
  17. (1) 函数可以没有返回值
  18. (2) 函数的返回值,如果是只有一个,返回原类型
  19. (3) 函数的返回值,如果是只有多个,返回元组
  20. '''
  21. def fun():
  22. print('hello')
  23. fun()
  24. def fun2():
  25. return 'hello'
  26. ref = fun2()
  27. print(ref)
  28. def fun3():
  29. return 'hello','world'
  30. print(fun3())

4、函数的参数定义

默认值参数

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 15:23
  3. def fun(a, b=10): # b为默认值形参
  4. print(a, b)
  5. fun(100)
  6. fun(10, 20)
  7. print('hello', end='\t')
  8. print('world')

 位置参数、关键字参数:

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 15:27
  3. def fun(*arg): # 函数定义时,个数可变的位置参数,结果是元组
  4. print(arg)
  5. print(arg[0])
  6. fun(10)
  7. fun(10, 20)
  8. fun(10, 20, 30)
  9. def fun1(**args): # 函数定义时,个数可变关键字的参数,结果是字典
  10. print(args)
  11. fun1(a=10, b=20, c=40)
  12. # def fun2(*args,*a): # 报错。只能一个位置可变参数
  13. # def fun2(**args,**a): # 报错。只能一个关键字可变参数
  14. def fun2(*args,**arg2):
  15. pass
  16. # def fun2(**args,*arg2): # 报错。在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前
  17. # pass

 将元素转换为位置实参、关键字实参:

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 16:30
  3. def fun(a, b, c):
  4. print('a=', a)
  5. print('b=', b)
  6. print('c=', c)
  7. fun(10, 20, 30) # 位置实参
  8. lst = [11, 22, 33] # 将列表中的每个元素都转化为位置实参
  9. fun(*lst)
  10. fun(a=10, b=20, c=30)
  11. dict = {'a': 100, 'b': 200, 'c': 300}
  12. fun(**dict) # 将字典中的每个元素都转化为关键字实参

在函数定义中,默认值参数、位置参数、关键字参数混合使用:

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 16:44
  3. def fun(a, b, c, d):
  4. print('a=', a)
  5. print('b=', b)
  6. print('c=', c)
  7. print('d=', d)
  8. fun(10, 20, 30, 40)
  9. fun(a=10, b=20, c=30, d=40)
  10. fun(10, 20, c=30, d=40)
  11. def fun2(a, b, *, c, d): # * 之后的用关键字参数传递
  12. print('a=', a)
  13. print('b=', b)
  14. print('c=', c)
  15. print('d=', d)
  16. # fun2(10, 20, 30, 40) # TypeError: fun2() takes 2 positional arguments but 4 were given
  17. fun2(a=10, b=20, c=30, d=40)
  18. fun2(10, 20, c=30, d=40)
  19. def fun3(a, b, *, c, d, **args):
  20. pass
  21. def fun4(*args, **args2):
  22. pass
  23. def fun5(a, b=4, *args, **args2):
  24. pass

5、变量的作用域

(1) 局部变量:在程序中使用变量都定义在函数内部,作用范围:被局限于所在函数内。  [  例如:形参就是局部变量。  ]

(2) 全局变量:定义在函数外而不属于任何函数的变量称为全局变量。

作用范围:对所有函数都起作用。生命周期:从开始定义到程序所在文件的结束。

 注意:global 的使用

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 16:59
  3. def fun(a, b):
  4. c = a + b # a,b,c都为局部变量
  5. print(c)
  6. name = '杨老师' # name为全局变量
  7. print(name)
  8. def fun2():
  9. print(name)
  10. fun2()
  11. def fun3():
  12. global age # global 在函数内部定义全局变量
  13. age = 20
  14. print(age)
  15. fun3()
  16. print(age)

6、递归函数

 6.1 什么是递归函数

        如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数

 6.2 递归的组成部分

        递归调用与递归终止条件

 6.3 递归的调用过程

        每递归调用一次函数,都会在栈内存分配一个栈帧

        每执行完一次函数,都会释放相应的空间

 6.4 递归的优缺点

        缺点:占用内存多,效率低下

        优点:思路和代码简单
        

下面代码最好设置断点调试:

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/22 17:11
  3. def fun(n):
  4. if n == 1:
  5. return 1
  6. else:
  7. res = n * fun(n - 1)
  8. return res
  9. print(fun(6))

实现菲波那切数列:

原理:第一项为1,第二项为1,从第三项开始为前两项之和。

  1. # 作 者:要努力,努力,再努力
  2. # 开发日期:2022/4/23 7:51
  3. def fun(n):
  4. if n == 3:
  5. return 1 + 1
  6. elif n == 2 or n == 1:
  7. return 1
  8. else:
  9. return fun(n - 1) + fun(n - 2)
  10. for i in range(1, 11, 1):
  11. num = fun(i)
  12. print(num, end='\t')