09 python函数(上)

一、函数的介绍

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

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

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

1、体验一下函数

编写一个如下代码:

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

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

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

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

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

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

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

# 这是一个函数
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就是一个函数,甚至写成这样

# 这是一个函数
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

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

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

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

2、函数的好处:

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

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

二、函数的定义

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

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

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

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

函数的使用步骤:

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

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

三、函数的参数

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

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

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

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

1、必需参数

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

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

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

2、关键字参数

参数也可以不按顺序传入,通过参数名传入, 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分糖,这样领导说给他泡一杯咖啡时就不需要说加多少糖了。

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

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

4、不定长参数

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

有两种不同的定义方式:

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

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

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

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里的 

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 返回值

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

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

2、多个返回值

以前学过的语言可能只能返回一个值,但是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表示空的,啥都没有,表示没有返回值

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做相关处理

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.rhkb.cn/news/36464.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Androidstudio出现警告warning:意外的元素

这些警告信息通常与 Android SDK 或系统镜像的配置文件有关&#xff0c;可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤&#xff1a; 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具&#xff1a; 打开…

性能调优疑难问题解决-completablefuture造成oom

一 案例 1.1 背景描述 对公交易服务使用了热点资源组件&#xff0c;出现了在高并发下触发线程池资源耗尽&#xff0c;任务堆积&#xff1b;出现内存oom。 1.2 模拟场景 public class OrderSystemCrash {// 模拟高并发场景public static void main(String[] args) {for (int…

HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)

资料解读&#xff1a;HW华为流程管理体系精髓提炼华为流程运营体系&#xff08;124页PPT&#xff09; 详细资料请看本解读文章的最后内容。 华为作为全球领先的科技公司&#xff0c;其流程管理体系的构建与运营是其成功的关键之一。本文将从华为流程管理体系的核心理念、构建…

Python的内置函数 - min()

知识点1 在 Python 中&#xff0c;min() 和 max() 是两个非常实用的内置函数&#xff0c;分别用于找出可迭代对象中的最小值和最大值。 基本语法 min(iterable, *[, key, default]) min(arg1, arg2, *args, *[, key]) iterable&#xff1a;可迭代对象&#xff0c;如列表list…

【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍

前言 最近接到需求&#xff0c;需要我在企业微信端自建一个应用&#xff0c;用来接受PC端派发的工单&#xff0c;告警&#xff0c;公告等内容。 这里写一个帖子汇总一下我经历的全流程开发&#xff0c;当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充…

从毛坯房到梦想智家一步到位?三问赵瑞海读懂“曲美整家”

一年之计在于春&#xff0c;阳春三月&#xff0c;万物复苏&#xff01;在这充满生机的时节&#xff0c;众多家居企业也争先创新、变革&#xff01;走过32个春秋的知名家居品牌曲美家居也再一次破局、创变&#xff01;3月15日&#xff0c;“曲美家居 整家焕新发布会”在曲美家居…

【IDEA中配置Maven国内镜像源】

1. 为什么需要配置国内镜像源&#xff1f; 首先&#xff0c;Maven本身的工作原理是通过从仓库中下载依赖包。而这些依赖通常来自于 Maven中央仓库&#xff08;位于国外&#xff09;&#xff0c;由于网络原因&#xff0c;我们在国内访问这些远程仓库的速度比较慢&#xff0c;甚至…

蓝桥杯嵌入式赛道复习笔记4(TIM输出PWM,TIM输入捕获)

原理介绍 高级定时器 PWM计算 假如要得到输出频率为1000HZ 输入捕获的计算 实战练习 cubeMX的配置 TIM2的配置 TIM17的配置 同时输入捕获模式要开启中断模式 将NVIC Setting中的中段配置为enable 代码展示 main.c 中断配置

Linux驱动开发进阶 - 文件系统

文章目录 1、前言2、学习目标3、VFS虚拟文件系统3.1、超级块&#xff08;Super Block&#xff09;3.2、dentry3.3、inode3.4、file 4、文件系统的挂载5、文件系统的注册5.1、文件系统的注册过程5.1.2、定义文件系统类型5.1.3、注册文件系统5.1.4、注销文件系统 5.2、文件系统的…

WEB攻防-PHP反序列化-字符串逃逸

目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时&#xff0c;语法是以 ; 作为字段的分隔&#xff0c;以 } 作为结尾&#xff0c;在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…

蓝桥杯真题——洛谷Day13 找规律(修建灌木)、字符串(乘法表)、队列(球票)

目录 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 字符串 P8723 [蓝桥杯 2020 省 AB3] 乘法表 队列 P8641 [蓝桥杯 2016 国 C] 赢球票 找规律 P8781 [蓝桥杯 2022 省 B] 修剪灌木 思路&#xff1a;对某个特定的点来说有向前和向后的情况&#xff0c;即有向前再返回到该位置…

C语言内存函数

一、memcpy使用和模拟实现 函数原型: void * memcpy ( void * destination, const void * source, size_t num ); dest指向目标内存区域的指针&#xff0c;即数据要复制的地方。sour指向内存区域的指针&#xff0c;即数据要复制的地方。num要复制的字节数。 memcpy函数会将s…

Springboot项目打包成war包

1、首先创建一个springboot工程&#xff0c;然后我们改造启动类如&#xff1a; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuil…

【大模型基础_毛玉仁】3.3 思维链

目录 3.3 思维链3.3.1 思维链提示的定义3.3.2 按部就班1&#xff09;Zero-Shot CoT2&#xff09;Auto-CoT 3.3.3 三思后行1&#xff09;思维树&#xff08;Tree of Thoughts, ToT&#xff09;2&#xff09;思维图&#xff08;Graph of Thoughts, GoT&#xff09; 3.3.4 集思广益…

虚拟电商-延迟任务系统的微服务改造(二)

一、微服务注册中心Consul 编写完延迟任务系统的web层接口&#xff0c;也就是说可以基于http协议来访问延迟系统&#xff0c;接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现&#xff0c;服务的注册与发现都离不开服务的注册中心&#xff0c;本项目选取…

场景题:如何设计一个抢红包随机算法

面试官&#xff1a;咱来写个算法题吧 设计一个抢红包的随机算法&#xff0c;比如一个人在群里发了100块钱的红包&#xff0c;群里有10个人一起来抢红包&#xff0c;每人抢到的金额随机分配。 1.所有人抢到的金额之和要等于红包金额&#xff0c;不能多也不能少。 2.每个人至少抢…

Java开发经验——Throwable/Exception异常处理方式

摘要 文章主要探讨了 Java 开发中 Throwable 和 Exception 的异常处理方式。阿里巴巴 Java 开发手册规定&#xff0c;RPC 调用、二方包、动态代理类等场景推荐使用 Throwable&#xff0c;因为这些场景可能会出现类似 NoClassDefFoundError 这样的严重错误&#xff0c;使用 Thr…

[Mysql]创建数据库基础

数据库意义 更加利于管理的东西-数据库&#xff0c;他能有效的管理数据 举例一个生活化的案例说明 如果说&#xff0c;图书馆是保存书籍的&#xff0c;那么数据库技术保存数据的 数据库的简单原理图 Mysql数据库三层结构与本质 数据库管理系统与 mysqld&#xff1a;MySQL 数…

AMBA-CHI协议详解(二十五)

AMBA-CHI协议详解&#xff08;一&#xff09;- Introduction AMBA-CHI协议详解&#xff08;二&#xff09;- Channel fields / Read transactions AMBA-CHI协议详解&#xff08;三&#xff09;- Write transactions AMBA-CHI协议详解&#xff08;四&#xff09;- Other transac…

【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?

RabbitMQ基于AMQP协议实现&#xff0c;由多个核心组件组成&#xff0c;确保消息的可靠传递。 Rabbit的架构图&#xff1a; 1.RabbitMQ的基本架构&#xff1a; 1.核心组件&#xff1a; 1.Producer(生产者)&#xff1a; 发送消息到RabbitMQ。 2.Exchange(交换机)&#xff1a;接…