python基础第十五节

函数: 是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
在之前的章节中, 其实我们已经接触到了许多的python内建函数, 如print, len, max等等.
比如len: 可以重复使用, 实现了统计长度这一特定功能的代码段.
好处: 提高程序的复用性, 减少重复性代码, 提高开发效率.

15.1 函数的定义和调用

def function_name(params):
       """注释"""
       # 函数体
       return [expression]

定义一个由自己想要功能的函数,以下定义语法:

function_name(params)
# 如此代码则是调用了名为function_name的函数.

例1: 定义一个打招呼的函数.

def say_hi():
    print('Hi')

例2: 编写一个函数实现类似pythono内置函数len的功能.
注意点:

  1. 函数必须先定义, 才可以使用.
  2. 参数如果不需要,可以省略不写.
  3. 返回值如果不需要, 可以省略不写.

15.2 函数的参数传递

在函数进行计算的时候, 可以接受外部提供的数据. 参数的个数, 可以是多个, 也可以不给参数.

def func(a, b):
    pass
# 在函数定义中, 提供的a, b称为: 形式参数, 简称为形参, 表示函数声明将要使用2个参数.参数之前用`,`分隔.
func(1, 2)
# 在函数的调用中, 传入的1,2 成为实际参数, 简称为实参, 表示函数执行的时候真正使用到的参数值, 传入参数时, 按照顺序传入对应的参数, 使用`,` 分隔.

如上面打招呼的函数, 每次调用, 都只能输出一个hi 用来打招呼, 如果我们需要对指定的人打招呼, 则上述的函数做不到. 这时我们就可以给函数传递参数.
案例1: 定义一个函数来实现任意2个数相加.
案例2: 自制一个计算器实现加减乘除.
扩展: eval(): 用于动态执行字符串形式的代码。它接受一个字符串参数作为输入,并将该字符串作为有效的Python表达式进行求值.

15.3 函数的返回值

在函数完成要做的事情之后, 向调用者返回数据.

def func():
    # 函数体
    pass
	return [表达式(返回值)]

变量 = func()

return [表达式] 表示退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None.
None: python中特殊的数据类型, 其类型是NoneType, 表示 空的, 无实际意义的.
None和False不一样, None不是0, 也不是空字符串.
用于表示变量或表达式没有值. None在条件判断是会被视为False.
案例: 完善上述的计算器功能.
注意点:

  1. return表示退出函数, return后续的代码不会执行.
  2. return语句可以返回多个值.返回多个值默认以元组的形式返回.

15.4 函数的嵌套调用

函数的嵌套调用是指在一个函数内部调用另一个函数.

def func1():
    print(1)
    func2()
    print(3)


def func2():
    print(2)


func1()

案例: 使用函数的嵌套调用, 实现计算器.

15.5 函数的递归

函数的递归是指函数在其定义中调用自身的过程。递归是一种重要的编程技术,用于解决可以被拆分为相似子问题的问题.
递归函数需要满足以下两个重要条件:

  1. 基本情况(终止条件):递归函数必须包含一个或多个基本情况,即不再进行递归调用的条件。这是确保递归结束的关键,避免无限递归。
  2. 递归调用:递归函数在其定义中必须包含对自身的调用。通过递归调用,函数可以反复执行相同的操作,但在每次调用中传递不同的参数。
    需要注意的是,递归函数的实现必须具备合适的终止条件,否则会导致无限递归,最终引发栈溢出错误。另外,递归的效率可能较低,因为它可能涉及多次函数调用和重复计算。在使用递归时,需要确保问题适合于递归解决,并根据实际情况评估其效率。
    函数的递归在许多算法和数据结构问题中都有应用,例如树的遍历、阶乘计算、斐波那契数列等。递归的思想能够简化问题的表达和解决.
    案例1: 倒计时.
    案例2: 斐波那契数列.