1.12 浅谈 Python 中的函数¶
0. 前言
真实开发工作中,有很多朋友拿到需求立马就动手去实现,甚至不愿意多花一分钟去设计自己的程序。
于是,写着写着,很自然地就出现了很多冗余的代码段,甚至有些代码段非常类似,处理逻辑基本相同。
程序员小王一看需求太开心拉,直接拷贝下来稍作调整就完事,可以开心地去泡杯咖啡了。
其实,对于业务逻辑相近,代码重复率高的情况,我们可以通过 函数
的封装来减少我们程序中冗余的代码,只需传递不同的 参数
给函数,便能实现不同的处理过程,进一步提升开发效率。
1. 什么是函数
那么,什么是 Python 的函数呢?
函数是组织好的,可重复使用的,用来实现单一、或相关联功能的代码段。
函数包括
声明关键词、函数名、函数体、返回值、参数
五部分,当然,函数也可以没有返回值与参数。
你看,函数就是我们抽取出来的一段代码,只不过是根据我们自己的需求做了一些包装,并且给它取了个新的名字而已。
在 Python 中,我们一般使用 def
关键词声明,后面紧接着是函数标识符名称与圆括号 -
()
,最后接一个冒号 - :
,函数体
必须有缩进,业务逻辑便是在函数体中实现的,我们调用函数只需要使用函数名 +
小括号即可。
def my_func():
"""我定义的函数"""
print("这里是函数体")
my_func() # 函数调用
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、欢迎在留言区讨论,有任何疑问也可与小编联系,也欢迎大家分享一些有趣的案例。