09 python函数(上)

news/2025/3/20 14:16:04/

一、函数的介绍

什么是函数? 函数的诞生为了解决两个问题:可读性、重复性。使用函数可以将一些代码放在一起成为一个功能,方便调用,出现了函数也方便用户阅读代码。

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

在我们的hello world中,就使用了print这个函数

1、体验一下函数

编写一个如下代码:

python">string = "我是一个机器人"
length = len(string)
print(f"str的长度是{length}") # str的长度是7

len是一个python内置的函数,用于得到一个对象的长度。

假如我们没有函数,那就需要自己编写len的功能,代码就变成下面这样

python">string = "我是一个机器人"
counter = 0
for i in string:counter += 1
print(f"string的长度是{counter}") # str的长度是7

如果我们要得到3个字符串的长度,如果没有函数,那代码就变成这个样子

python">string1 = "我是一个机器人"
counter = 0
for i in string1:counter += 1
print(f"string1 的长度是{counter}") # string1 的长度是7string2 = "我是一个超级机器人"
counter = 0
for i in string2:counter += 1
print(f"string2 的长度是{counter}") # string2 的长度是9string3 = "我是一个人造人"
counter = 0
for i in string3:counter += 1
print(f"string3 的长度是{counter}") # string3 的长度是7

非常的啰嗦,而且求解长度的代码都是重复的,那我们把重复的代码提取出来,就变成这样

python"># 这是一个函数
def get_length(string):counter = 0for i in string:counter += 1return counterstring1 = "我是一个机器人"
print(f"string1 的长度是{get_length(string1)}") # string1 的长度是7string2 = "我是一个超级机器人"
print(f"string2 的长度是{get_length(string2)}") # string2 的长度是9string3 = "我是一个人造人"
print(f"string3 的长度是{get_length(string3)}") # string3 的长度是7

是不是明了多了,get_length就是一个函数,甚至写成这样

python"># 这是一个函数
def get_length(string):counter = 0for i in string:counter += 1return counterprint(f'"我是一个机器人" 的长度是{get_length("我是一个机器人")}') # 输出 "我是一个机器人" 的长度是7
print(f'"我是一个超级机器人" 的长度是{get_length("我是一个超级机器人")}') # 输出 "我是一个超级机器人" 的长度是9
print(f'"我是一个人造人" 的长度是{get_length("我是一个人造人")}') # 输出 "我是一个人造人" 的长度是7

对于这种常用的功能函数,都内置了,我们的代码变成这样

python">print(f'"我是一个机器人" 的长度是{len("我是一个机器人")}') # 输出 "我是一个机器人" 的长度是7
print(f'"我是一个超级机器人" 的长度是{len("我是一个超级机器人")}') # 输出 "我是一个超级机器人" 的长度是9
print(f'"我是一个人造人" 的长度是{len("我是一个人造人")}') # 输出 "我是一个人造人" 的长度是7

 代码就变得简洁,容易阅读。

2、函数的好处:

将功能放在一起,然后提供一个名称告诉别人,方便重复利用,就像一个牛马提供了泡咖啡功能,每个领导都能叫牛马去泡咖啡

减少代码量,提升效率,要不每个领导都要去泡咖啡,有了牛马的泡咖啡功能,领导就省事多了,提高领导工作效率,就可以多研究哪儿美女漂亮了。

二、函数的定义

python的函数长这样,def表明这是函数,同样的用:进行结束,缩进为函数体

def 函数名(参数列表):函数体return 返回值

参数不需要,可以省略,返回值不需要,也可以省略

python"># python支持中文做函数名
# 做演示用,实际编程一般不建议使用中文
def 打招呼():print("你好!")
打招呼()
# 你好

函数的使用步骤:

先定义,后使用,如果变成下面这样就执行不了了

python">打招呼()
def 打招呼():print("你好!")

三、函数的参数

为了函数更灵活,可以定义参数,函数接收参数,然后对参数进行处理,返回,就像牛马的倒咖啡功能,定义一个加几分糖的参数给他,下次喊他泡咖啡,就可以说几分糖了。

def 函数名(参数列表):
        函数体
函数名(参数)

函数定义中的参数,称为形式参数

函数调用中的参数,成为实际参数

1、必需参数

这里函数的参数必须传进去的,比如

python">def add(x, y):return x + yprint(add(1, 2))

必须把参数按顺序传进去,一个也不能少,否则就会报错

2、关键字参数

参数也可以不按顺序传入,通过参数名传入, Python 解释器能通过参数名找到对应的参数值

python">def robot_info(name, age):print("名字: %s,年龄:%d" % (name, age))return
# 调用robot_info函数,参数顺序可以不一样
robot_info(name="机器人1号", age=3)
robot_info(age=2, name="机器人2号")# 名字: 机器人1号,年龄:3
# 名字: 机器人2号,年龄:2

3、默认参数

当函数带参数时,调用函数又不想传入参数,那函数可以定义一个默认参数,就像牛马有个泡咖啡的默认糖量5分糖,这样领导说给他泡一杯咖啡时就不需要说加多少糖了。

python">def make_coffee(sugar = 5):print("泡一杯咖啡:%d分糖" % sugar)return
make_coffee(6)
make_coffee()# 泡一杯咖啡:6分糖
# 泡一杯咖啡:5分糖

如示例:我们传入参数6时就是6分糖,不传就默认的5分糖

4、不定长参数

有时候,函数需要处理比一开始计划更多的数据,那我们就不确定参数的个数,这时候就出现了不定长参数,就像泡咖啡的牛马接收不同的要求一样。

有两种不同的定义方式:

python">def 函数名(参数1, *其他参数):
def 函数名(参数1, **其他参数):

其中
带一个星号*的参数,会把多出来的 “参数” 装在一个元组里
带两个星号**的参数,会把多出来的 “参数” 装在一个字典里

看下面的例子:不理解元组和字典可以不用理会,知道有这两个不定参数的定义形式就好,元组和字典后面会介绍到

python">def make_coffee(sugar, *other):print("输出: ")print(sugar)print(other)
# 调用make_coffee函数
make_coffee(5, 60, 50)# 输出: 
# 5
# (60, 50)

5就是装在sugar里的,(60, 50)就是装在other里的 

python">def make_coffee(sugar, **other):print("输出: ")print(sugar)print(other)
# 调用make_coffee函数
make_coffee(5, water = 60, milk = 50)# 输出: 
# 5
# {'water': 60, 'milk': 50}

5就是装在sugar里的,{'water': 60, 'milk': 50}  就是装在other里的 

四、函数的返回值

1、返回值定义

啥叫返回值,就是泡咖啡的牛马收到命令后泡好的咖啡
通过return 来返回结果,同时函数体碰到return就结束了,后面的不会再执行。

def 函数名(参数列表):
        函数体
        return 返回值

python">def sum(arg1, arg2):total = arg1 + arg2print("函数内 :  ", total)return totalprint("我不会执行到")
# 调用sum函数
total = sum(10, 20)
print("函数外 :  ", total)
# 函数内 :   30
# 函数外 :   30

如示例代码,返回两数之和。

2、多个返回值

以前学过的语言可能只能返回一个值,但是python返回值很灵活,可以返回多个,比如牛马泡完咖啡拿给领导时,也同时拿包烟。

python">def calculate(arg1, arg2):sum = arg1 + arg2sub = arg1 - arg2return sum, sub
# 调用sum函数
sum, sub = calculate(20, 10)
print("和 :  ", sum)
print("差 :  ", sub)
# 和 :   30
# 差 :   10

同时返回了和与差,不用再定义两个函数了

真好,随着社会发展,两个牛马一个牛马完成了,不单要泡咖啡,还要买烟。

3、返回None

如果函数没有return,那还有返回值么?有的,这个就是None
None表示空的,啥都没有,表示没有返回值

python">def say_name(name):print("Hello, " + name)val = say_name("John")
print(val, type(val))
# Hello, John
# None <class 'NoneType'>

示例代码:say_name,接收了一个参数,输出一句话就结束了,没有return,但是我们可以用一个变量去接收返回值,这个返回值就是None,在别的语言中没有返回值可能就报错了。

python是不是很好用?就像使用一个牛马一样,你感觉牛马好用,实际牛马做了很多工作。

五、None类型的应用场景

None作为一个特殊的字面量,表示空、什么都没有,有很多的应用场景

1、用在函数的返回值上

2、用在if的判断上,None等同于False。
一般用于函数的主动返回None,配合if做相关处理

python">def say_name(name):if name == "John":return Noneelse:print("Hello, " + name)val = say_name("John")
print(val, type(val))
# None <class 'NoneType'>
val = say_name("Jane")
# Hello, Jane

3、用在声明无内容的变量上

比如我先定义一个变量,我不知道这个变量会存放什么,那么我们可以先给它一个None
比如:name = None


http://www.ppmy.cn/news/1580615.html

相关文章

《C#上位机开发从门外到门内》3-5:基于FastAPI的Web上位机系统

文章目录 一、项目概述二、系统架构设计三、前后端开发四、数据可视化五、远程控制六、系统安全性与稳定性七、性能优化与测试八、实际应用案例九、结论 随着互联网技术的快速发展&#xff0c;Web上位机系统在工业自动化、智能家居、环境监测等领域的应用日益广泛。基于FastAPI…

腾讯云MySQL数据库架构分析与使用场景

TDSQL-C for MySQL TDSQL-C MySQL 版&#xff08;TDSQL-C for MySQL&#xff09;是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势&#xff0c;为用户提供具备高弹性、高性能、海量存储、安全可靠的数据库服务。TDSQL-C MySQL 版100%兼容…

如何使用PHP爬虫获取Shopee(虾皮)商品详情?

在跨境电商领域&#xff0c;Shopee&#xff08;虾皮&#xff09;作为东南亚及中国台湾地区领先的电商平台&#xff0c;拥有海量的商品信息。无论是进行市场调研、数据分析&#xff0c;还是寻找热门商品&#xff0c;获取Shopee商品详情都是一项极具价值的任务。然而&#xff0c;…

Qt/C++项目积累:3.日志管理系统 - 3.2 项目初步实现

上一篇:Qt/C项目积累&#xff1a;3.日志管理系统 - 3.1 项目介绍-CSDN博客 说明&#xff1a; 该项目是实现一款简易好用的日志系统&#xff0c;支持终端打印&#xff0c;界面同步展示&#xff0c;界面等级过滤&#xff0c;日志缓存&#xff0c;文件写入等&#xff0c;是调试好…

图论之cruskal算法(克鲁斯卡尔)

我们已经学了prim算法了&#xff0c;接下来我们来学一下cruskal算法&#xff0c;和prim算法不同的点就在于prim是不断的加结点&#xff0c;而cruskal是不断的加边&#xff0c;不断的加最小的边&#xff0c;我们需要把每个边的权值用结构体存起来&#xff0c;然后排序&#xff0…

游戏引擎学习第162天

回顾与即将进行的调试工作概述 有人提了一个关于 C 运行时库的问题&#xff0c;所以画面有些不同。不过现在已经调整回正常的画面&#xff0c;大家看到的就是平时熟悉的界面了。 今天的内容是继续在不使用任何引擎和库的情况下&#xff0c;编写一个完整的游戏。 上周已经完成…

第十五届蓝桥杯C/C++B组拔河问题详解

解题思路 这道题目的难点在于枚举所有区间&#xff0c;并且区间不能重合&#xff0c;那么这样感觉就很难了。但是用下面这种方法就会好很多。 我们只需要将左边的所有区间的各种和放在一个set中&#xff0c;然后我们在枚举右边的所有区间的和去和它进行比较&#xff0c;然后…

【初学者】请介绍一下指针分析(Pointer Analysis)?

李升伟 整理 指针分析&#xff08;Pointer Analysis&#xff09; 指针分析&#xff08;Pointer Analysis&#xff09;是一种静态程序分析技术&#xff0c;用于确定程序中指针可能指向的内存位置或对象。它是编译器优化、程序验证、漏洞检测和并行化等领域的重要基础。 1. 指…