一、函数的定义和调用

  把具有某一段功能的代码提取出来, 封装成一个代码块, 在需要的时候进行调用

二、特点

  1、去除重复的代码
  2、当函数功能发生修改时, 只需要修改函数体即可
    (增强程序的拓展性)

三、函数体

  实现函数功能的代码
  1、函数声明的时候, 不会执行函数体  

  2、函数调用的时候, 才会执行函数体

  3、一个函数体可以被多次执行(一个函数可以被多次调用)

  函数名建议:1、不能与python内置的函数名重名
          2、不要使用拼音,多个英文单词组成的时候,中间以下划线连接

四、函数的注释: 解释说明程序

  1、功能
  2、参数(函数的使用方法) 函数名(参数)
  3、返回值

  在函数体中,输入三对引号,回车,自动生成函数说明文档格式;

  查看函数的说明文档 函数名.__doc__   

  如果该函数没有说明文档, 函数名.__doc__ 返回一个 None

1 def get_sum(a, b):
2 """
3 求两个数的和
4 :param a: 一个数
5 :param b: 另一个数
6 :return: 两个数的和
7 """
8     return a + b
1 def get_big_num(a, b):
2     if a > b:
3         return a
4     else:
5         return b
6 
7 print(get_big_num.__doc__)  # None

五、函数的参数

  1、位置参数:postional arguments 默认的参数
     实参的个数与形参相同, 实参与形参一一对应;

  2、默认值参数: default arguments
     定义一个函数的时候,给形参一个默认的值,给默认值参数的形参传值时, 函数会采用实参的值

    注意
      (1)默认值参数的赋值时机: 函数声明的时候就被赋值了;
         程序执行的过程:顺序执行
           函数的声明定义语句(默认值参数的赋值)——> 被执行
           函数体 ——> 不被执行(调用时才执行)
·        (2)如果默认值参数的值是一个可变数据类型对象,那么函数多次调用, 操作的是同一个参数对象
        如果不想使用同一个参数变量,可以使用实参进行覆盖

  3、可变参数

   可变长的参数 ,参数的个数是不确定的,用于接收(0-N)个参数

    (1)可变元祖参数: *参数名
      传入的实参 *元组: *具有打散序列的功能, 将元组中的每个元素作为可变参数传入

    (2)可变字典参数:**参数名
      传入实参时: key=value, key=value, 关键字参数形式传入
      传入实参时 **字典: **具有打散字典的功能, 将字典中的键值对以关键字参数的形式传入  

  要求遵守顺序: 位置参数, 可变元组参数, 默认值参数, 可变字典参数

六、递归函数

  如果一个函数在内部调用自身,这个函数就是递归函数

 

  使用递归求n的阶乘

1 def get_factorial(n):
2     if n == 2:
3         return 1 * 2
4     else:
5         return get_factorial(n-1) * n
6 
7 print(get_factorial(5))