1.12 浅谈 Python 中的函数

0. 前言

真实开发工作中,有很多朋友拿到需求立马就动手去实现,甚至不愿意多花一分钟去设计自己的程序。

于是,写着写着,很自然地就出现了很多冗余的代码段,甚至有些代码段非常类似,处理逻辑基本相同。

程序员小王一看需求太开心拉,直接拷贝下来稍作调整就完事,可以开心地去泡杯咖啡了。

其实,对于业务逻辑相近,代码重复率高的情况,我们可以通过 函数 的封装来减少我们程序中冗余的代码,只需传递不同的 参数 给函数,便能实现不同的处理过程,进一步提升开发效率。

1. 什么是函数

那么,什么是 Python 的函数呢?

函数是组织好的,可重复使用的,用来实现单一、或相关联功能的代码段。

函数包括 声明关键词、函数名、函数体、返回值、参数 五部分,当然,函数也可以没有返回值与参数。

你看,函数就是我们抽取出来的一段代码,只不过是根据我们自己的需求做了一些包装,并且给它取了个新的名字而已。

在 Python 中,我们一般使用 def 关键词声明,后面紧接着是函数标识符名称与圆括号 - (),最后接一个冒号 - :函数体 必须有缩进,业务逻辑便是在函数体中实现的,我们调用函数只需要使用函数名 + 小括号即可。

def my_func():
    """我定义的函数"""
    print("这里是函数体")

my_func()  # 函数调用
函数1.jpg

函数1.jpg

2. 函数的优势

函数的优势也非常明显,它能提高我们程序的模块性与代码的重复利用率。

在实现业务逻辑时,我们只需调用对应的功能函数去实现,可避免代码的冗余,让程序代码结构更加清晰、更易于维护。

这也是 Python 的强大之处,开发者已经帮我们封装好了很多内置的函数,在实现相关的需求时,我们只需调用对应的函数即可。

3.函数的细分

函数可分为内置函数与自建函数,有参数与无参数的函数,有返回值与无返回值函数以及有名称与无名称的函数等等,我们今天主要讨论自建函数,也就是我们自己声明的函数。

3.1 有无参数的函数

我们通过实现两数之和的函数来演示两者的区别。

定义一个无参数的计算两数之和的功能函数,并将计算结果返回,函数中使用 return 语句返回数据。

def add_func():
    """计算两数之和"""
    a = 1
    b = 2
    return a + b


add_result = add_func()
print(add_result)  # 3

我们可以发现这个函数只能计算 1+2 的结果,这难免太过于死板,我们可以改得灵活一些,计算传递进来的两数之和。

def add_func_plus(a, b):
    """计算两数之和"""
    return a + b


add_result = add_func_plus(3, 4)
print(add_result)  # 7

你看,这就是带参数的函数与不带参数的函数的区别,前者更加灵活,适用范围更加广泛。

3.2 有无返回值的函数

函数的返回值可有可无,设计者根据需求来决定,我们通过实现判断传入参数是否是 回文 的功能函数来演示两者的区别。

顺序与逆序读取的内容是相同的,就说明此数据为回文。

定义一个带参数的判断传入参数是否是回文的功能函数。

def is_palindrome(str_data):
    """判断是否是回文"""
    str_ = str_data[::-1]
    if str_data == str_:
        return_data = "是回文"
    else:
        return_data = "不是回文"
    print(return_data)   # 是回文


is_palindrome("上海自来水来自海上")

我们可以发现,在函数打印出来的判断结果是回文,但是假设我们需要根据此判断来做后续的业务逻辑呢?

若不将判断结果返回的话,我们在函数外部就不知道这个数据到底是不是回文,当然也有其他的方式实现,我们这里不做考虑。

def is_palindrome(str_data):
    """判断是否是回文"""
    str_ = str_data[::-1]
    if str_data == str_:
        return_data = "是回文"
    else:
        return_data = "不是回文"
    return return_data


result_dada = is_palindrome("上海自来水来自海上")
if result_dada == "是回文":
    print("这里是回文的业务逻辑")

你看,我们将判断的结果返回,这样在函数外部便可通过返回的结果,做后续的业务逻辑处理,后者才能更加透彻为我们的程序服务,起到实质性的帮助。

当然,函数还支持返回多个返回值,如定义一个函数返回传递两个参数的和与积。

def return_two(a, b):
    """计算两数之和与两数之积"""
    return a+b, a*b


first_result, second_result = return_two(3, 4)
print(first_result, second_result)  # 7 12

3.3 有无名称的函数

上面例子中的函数都是拥有自己名称的,在 Python 中还有没有名字的函数,我们称之为 匿名函数 ,Python 中使用 lambda 关键字来声明匿名函数。

我们定义一个计算数字平方的函数:

lambda_func = lambda x: x ** 2
print(lambda_func(2))  # 4

使用 def 定义相同功能的函数:

def def_func(x):
    return x**2


print(def_func(2))  # 4

通过这个例子还看不出匿名函数的强大之处,下面我们结合内置函数 - map 来计算存放10个数字的列表的每一个数字的平方,并返回一个新的列表。

使用 def 定义功能函数:

def def_func():
    return_list = []
    for i in [x for x in range(100)]:
        return_list.append(i**2)
    return return_list


print(def_func())
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

使用 lambda + map 函数定义:

print(list(map(lambda x: x**2, [x for x in range(10)])))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在开发中还有很多场景可以使用匿名函数来简化代码,后面会发现还是蛮有意思!

4.函数应用之笑话生成器

我们声明一个笑话生成器的函数,每次调用函数都会生成不一样的笑话,在学习工作之余,大家乐一乐,放松放松。

1、定义笑话生成器函数,这里使用 Python 中第三方库 requests 实现笑话的获取。

import requests


def get_joke():
    """笑话生成器"""
    # 1. 笑话获取接口 URL
    url = "https://autumnfish.cn/api/joke"
    # 2. 获取返回数据
    joke_data = requests.get(url)
    # 3. 解析数据并返回
    return joke_data.text


joke_ = get_joke()
print(joke_)

2、调用笑话生成器函数,并打印获取到的内容。

# 调用笑话生成器函数
joke_ = get_joke()
print(joke_)

获取的笑话内容示例一:

一个四岁的男孩亲了三岁的女孩一口!

女孩对男孩说:“你亲了我可要对我负责啊。”

男孩成熟地拍了拍女孩的肩膀,笑着说:“你放心,我都四岁了,又不是一两岁的小孩子了”

获取的笑话内容示例二:

小学二年级的时候,我妈说要把我卖掉,我妈的语气特别真实。我当真了,上学的时候哭着告诉了我们班长。

班长也很着急,放学后帮我叫了全班同学到我家里,求我妈不要把我卖掉。当一大片孩子跪倒在地的时候,正在打麻将的我妈彻底震惊了…

5.总结

1、Python 中的函数声明有严格的格式要求,声明时需要特别注意格式。

2、灵活设计好参数与返回值,函数会给你带来意想不到的惊喜,有兴趣的朋友可研究下源码,学习下开发者的函数设计理念与设计逻辑。

3、匿名函数建议去熟悉、练习一下,结合其他函数使用,可以大大简化我们的代码结构。

4、原创文章已全部更新至 Github:https://github.com/kelepython/kelepython

5、本文永久博客地址:https://kelepython.readthedocs.io/zh/latest/c01/c01_12.html

6、欢迎在留言区讨论,有任何疑问也可与小编联系,也欢迎大家分享一些有趣的案例。