专栏首页极客起源Python编程思想(17):必会的函数知识点

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

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

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

2. 避免代码冗余

3. 容易维护

1. 函数的定义和调用

示例代码:func_test.py

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

def 函数名(形参列表)
    # 多条语句
    [return[返回值]]

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

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

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

## 定义一个函数,声明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("李宁"))

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

result: 5
正在执行greet函数
hello 李宁

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

2. 多返回值函数

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

# 多返回值
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)

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

(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个位置的斐波那契数列的值),递归算法如下:

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)}")

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

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)的值。

本文分享自微信公众号 - 极客起源(geekculture),作者:geekori

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp。不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的S...

    蒙娜丽宁
  • Python编程思想(16):压缩与排序列表

    使用zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象),这样可以使用一个循环并行遍历两个列表。为了测试zip()函数的功能,可以使用下面的代码:

    蒙娜丽宁
  • Python编程思想(15):for循环表达式

    for表达式可以利用其他元组、列表等集合对象创建列表。for表达式的语法格式如下:

    蒙娜丽宁
  • Office 远程溢出漏洞测试与分析

    在 2017 年 11 月,微软发布的 11 月更新布丁中,微软将隐藏许久的 office 远程代码执行漏洞 (CVE-2017-11882)给修复了,由于该漏...

    信安之路
  • 并发篇-python多进程

    >>>Process([group [, target [, name [, args [, kwargs ] ] ] ] ])

    小团子
  • Open3D版本和Ubuntu的关系

    Open3D是一个开源库,支持快速开发和处理3D数据。Open3D在c++和Python中公开了一组精心选择的数据结构和算法。后端是高度优化的,并且是为并行化而...

    点云PCL博主
  • 递归【重点】

        1. 将所有的实际参数、返回地址(被调函数下一条语句的地址)等信息传递给被调函数保存

    爱学习的孙小白
  • NIO之缓冲区【基础内容】

      我们知道NIO的三大核心是buffer,channel和selector,本文开始详细介绍下buffer

    用户4919348
  • 第二章(1.6)Python基础知识(高阶函数)

    定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

    两只橙
  • 第8章 函数式编程(FP) 《Kotin 编程思想·实战》

    8.1 函数式编程概述 8.1.1 面向对象编程OOP特征 8.1.2 函数式编程FP特征

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券