前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程思想(17):必会的函数知识点

Python编程思想(17):必会的函数知识点

作者头像
蒙娜丽宁
发布2020-06-16 12:18:51
5190
发布2020-06-16 12:18:51
举报
文章被收录于专栏:极客起源

函数就是封装代码的单元。如果某一段代码要至少调用2次,通常会将这段代码用函数封装。使用函数的好处如下:

1. 方便重复调用同样的代码;

2. 避免代码冗余

3. 容易维护

1. 函数的定义和调用

示例代码:func_test.py

在使用函数之前必须先定义函数,定义函数的语法格式如下:

代码语言:javascript
复制
def 函数名(形参列表)
    # 多条语句
    [return[返回值]]

Python声明函数必须使用def关键字,对函数语法格式的详细说明如下:

  • 函数名:从语法角度来看,函数名只要是一个合法的标识符即可;从程序的可读性角度来看,函数名应该由一个或多个有意义的单词的组合,如get_name,每个单词的所有字母都是小写的,多个单词通过下划线(_)连接;
  • 形参列表:用于定义该函数可以接收的参数。形参列表由多个形参名组成,多个形参名之间以英文逗号(,)隔开。一旦在定义函数时指定了形参列表,调用该函数时就必须传入对应的参数值;

下面的代码演示了函数的定义和调用:

代码语言:javascript
复制
## 定义一个函数,声明2个形参
def max_value(x, y) :
   result = x if x > y else y
   # 返回变量z的值
   return result
# 定义一个函数,声明1个形参
def greet(name) :
   print("正在执行greet函数")
   return f'hello {name}'
a = 3
b = 5
# 调用max_greet函数
result = max_value(a , b)
print("result:", result)
# 调用greet()函数,直接输出函数的返回值
print(greet("李宁"))

执行这段代码,会输出如下的结果:

代码语言:javascript
复制
result: 5
正在执行greet函数
hello 李宁

上面程序中定义了两个函数:max_value与greet,并且调用了这两个函数。其中max_value函数返回了一个变量,而greet函数返回了一个格式化的字符串,在函数体中使用 return语句可以显式地返回一个值,return语句返回的值既可以是有值的变量,也可以是一个表达式。

2. 多返回值函数

如果函数需要有多个返回值,则既可将多个值包装成列表之后返回,也可直接返回多个值。如果 Python函数直接返回多个值,Python会自动将多个返回值封装成元组。演示代码如下:

代码语言:javascript
复制

# 多返回值
def sum_and_avg(num_list):
    sum = 0
    count = 0
    for value in num_list:
        # 如果元素value是数值
        if isinstance(value, int) or isinstance(value, float):
            count += 1
            sum += value
    return sum, sum / count
num_list = [14, 145, 15.1, 'True', 3.5, 45.9, -31.8,13.4,"hello",False]
# 获取sum_and_avg函数返回的多个值,多个返回值被封装成元组
result = sum_and_avg(num_list)
print(result)
# 使用序列解包来获取多个返回值
s, avg = sum_and_avg(num_list)
print(s)
print(avg)

执行这段代码,会输出如下的内容:

代码语言:javascript
复制
(205.1, 25.6375)
205.1
25.6375

上面代码中的sum_and_avg函数返回了多个值,并且两次调用了sum_and_avg函数,第1次返回了列表,第2次使用序列解包来获取多个返回值。

3. 递归函数

在一个函数体内调用它自身,被称为递归函数。函数递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。最典型的递归算法是阶乘和斐波那契数列,下面就用斐波那契数列来演示递归函数的编写方法。

斐波那契数列的计算规则是:f(0) =1, f(1) =3 ,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数。

现在要求f(10)的值(通用的问题就是计算第n个位置的斐波那契数列的值),递归算法如下:

代码语言:javascript
复制
def fn(n) :
   if n == 0 :
      return 1
   elif n == 1 :
      return 3
   else :
      # 函数中调用它自身,就是递归函数
      return 2 * fn(n - 1) + fn(n - 2)
# 输出fn(10)的结果
print(f"fn(10)的结果是{fn(10)}")

执行这段代码,会输出如下内容:

代码语言:javascript
复制
fn(10)的结果是8119

在上面的fn函数体中再次调用了fn()函数,这就是函数递归。注意在fn()函数体中调用f(n)的形式:return 2*fn(n -1)+ fn(n-2)。对于fn(10)来说,也就是2*fn(9)+fn(8),其中fn(9)又等于2*fn(8)+fn(7),...,依此类推,最终会计算到fn(2)等于2*fn(1)+fn(0),而fn(2)是可计算的,这样递归带来的隐式循环就结束了(当不再调用自身时,递归函数结束)。然后一路反算回去,最后就可以得到fn(10)的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档