当前位置: 首页 > news >正文

[Python学习日记-31] Python 中的函数

[Python学习日记-31] Python 中的函数

简介

语法定义

函数的参数

简介

引子:

        你是某公司的一个高级程序员,现在老板让你写一个监控程序,需要24小时全年无休的监控公司网站服务器的系统状况,当 CPU、Memory、Disk 等指标的使用量超过阀值时即发邮件报警,这时你使出了浑身解数,写出了以下代码

while True:

        if CPU 利用率 > 90%:

                # 发送邮件提醒

                连接邮箱服务器

                发送邮件

                关闭连接

        if 内存占用 > 80%:

                # 发送邮件提醒

                连接邮箱服务器

                发送邮件

                关闭连接

        if 硬盘使用空间 > 90%:

                # 发送邮件提醒

                连接邮箱服务器

                发送邮件

                关闭连接

        上面的代码实现了功能,但即使是你隔壁座的老王也看出了端倪,轻蔑地说到你这个重复代码太多了,每次报警都要重写一段发邮件的代码,实在是太 low 了,你思考了一下发现这样干存在两个问题:

  1. 代码重复过多,一个劲的复制粘贴不符合高级程序员的气质
  2. 如果日后需要修改发邮件的这段代码时过于复杂,例如加入群发功能,那你就需要在所有用到这段代码的地方都修改一遍

        你觉得老王说的对,你也不想写重复代码,但又不知道怎么搞,老王好像看出了你的心思,居高临下的说道:“其实很简单,只需要把重复的代码提取出来,放在一个公共的地方,起个名字,以后谁想用这段代码,就通过这个名字调用就行了”,老王为了向你炫技飞快地写下了一段代码,如下所示

def 发送邮件(内容)

        # 发送邮件提醒

        连接邮箱服务器

        发送邮件

        关闭连接

while True:

        if CPU 利用率 > 90%:

                发送邮件('CPU报警')

        if 内存占用 > 80%:

                发送邮件('内存报警')

        if 硬盘使用空间 > 90%:

                发送邮件('硬盘报警')

        你看着老王写的代码气势恢宏、磅礴大气,代码里透露着一股内敛的傲气,心想:“老王这个 人真牛逼啊!”,瞬间对老王如何知道这种花式玩法感了兴趣,于是就问老王:“这些花式玩法你都是怎么知道的?”,老王拿起满是茶渍的茶杯抿了一口后常舒了一口气,淡淡的说道:“老夫当年从街头写代码写到街尾,人称计算机界浩南哥!”,你一听“浩南哥”这几个字,不由的娇躯一震,心想:“真牛逼啊!怪不得代码写的这么6。”,这“浩南哥”当年在江湖上可是数得着的响当当的名字,只可惜后期纵欲过度,卒于公元2024年,真是可惜了,只留下其哥哥孤守当年兄弟俩一起打下来的江山。 此时你看着的老王离开的身影,仿佛还能看到他当年英姿煞爽的身影...

函数的定义:

        函数是什么?函数一词来源于数学,但编程中的“函数”概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲。编程中的函数在英文中也有很多不同的叫法。在 BASIC 语言中叫做 Subroutine(子过程或子程序),在 Pascal 语言中叫做 Procedure(过程)和 Function,在 C 语言中就只有Function,在 Java 语言里面叫做 Method。

        总的来说,函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

函数的特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法定义

不带参数:

def say_hi():    # say_hi 是函数名print("Hello, I'm nobody!")if True:    # 在函数当中所写的代码也和其他的一样,可以进行各种判断print("True")say_hi()    # 调用函数

代码输出如下:

带参数:

        我们先看一段普通的代码

a,b = 5,8
c = a**b
print(c)

        这段代码可以看出是先定义了两个变量作为参数来参与 c = a**b 的运算,那我们使用函数就可以对这段普通的代码改写为以下的样子 

def calc(x,y):res = x**yreturn res    # 返回函数执行结果c = calc(5,8)    # 结果赋值给 c 变量
print(c)

代码输出如下:

        在带参数的函数代码当中可以看到 return 这个关键词,这个关键词其实就是返回的意思,而它后面跟的就是函数返回的返回值,当函数出现 return 时将意味着函数的中止,如果函数最后没有写 return 什么,它将会默认 return None,如下面的代码所示

def calc(x,y):res = x**yprint(res)c = calc(5,8)    # 结果赋值给 c 变量
print(c)

代码输出如下:

 

        总的来说,参数可以让你的函数更灵活,让函数不止只能做固定的动作,还可以根据调用时传参的不同来决定函数内部的执行流程。

函数的参数

一、形参与实参

形参:是指在函数定义时指定的参数,它们是占位符,用于接收函数调用时传入的实参。形参可以在函数体内使用,以便对传入的实参进行操作。

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先给实参赋值。

 

二、位置参数

        位置参数是函数定义时按照顺序指定的参数,调用函数时必须按照相同的顺序传入对应的实参,如下代码所示

def register(name,age,major):    # 函数中形参的值由调用时的顺序决定"""学籍注册程序:param name: str:param age: integer:param major: str ,Chinese, CS:return:"""staff_table = '''--------- 你的注册信息 ---------name   : %sage    : %smajor  : %s''' % (name,age,major)    # name,age,major位置参数print(staff_table)register("张三",22,"CS")
register("宫保鸡丁",26,"Math")
register("Mack",22,"CS")

代码输出结果如下:

三、关键参数(指定参数)

        关键字参数是指在函数调用时使用形参名进行传参,可以改变参数的顺序,如下代码所示

def register(name,age,major):"""学籍注册程序:param name: str:param age: integer:param major: str ,Chinese, CS:return:"""staff_table = '''--------- 你的注册信息 ---------name   : %sage    : %smajor  : %s''' % (name,age,major)print(staff_table)register(age = 22,major = "CS",name = "张三")    # 关键参数可以让参数的输入顺序打乱
register("宫保鸡丁",major = "Math",age = 26)
register("Mack",22,"CS")    # 位置参数只能按照顺序输入

代码输出如下:

 

        这里值得注意的是,在调用“宫保鸡丁”的时候为什么我要特意的把“宫保鸡丁”放在第一个位置呢?不能是第二第三第四吗?答案是不能的,会直接报错。如果把“宫保鸡丁”放在第二位,按照人类的正常理解应该是赋值到 age 上面了,但是 Python 会无法判断出到底应该赋值到那里去,既可以按照位置参数的定义赋值到 name 上,也可以 按照参数的位置赋值到 age 上去,这会产生歧义。由于 Python 是一门严谨的语言,所以这种写法是禁止的,报错如下图所示

 

四、默认参数

        默认参数是在函数定义时为形参指定的默认值,如果调用函数时没有传入实参,则使用默认值,如下代码所示

def register(name,age,major,country):"""学籍注册程序:param name: str:param age: integer:param major: str ,Chinese, CS:param country: JP,CN,US:return:"""staff_table = '''--------- 你的注册信息 ---------name   : %sage    : %smajor  : %scountry: %s''' % (name,age,major,country)print(staff_table)register("张三",22,"CS","CN")
register("宫保鸡丁",26,"Math","JP")
register("Mack",22,"CS","CN")

代码输出如下:

 

        从上面的输出可以发现 countny 这个参数基本都是“CN”,就像我们在网站上注册用户,像国籍这种信息,你不填写的情况下会默认填上中国, 这就是通过把 country 变成默认参数来实现,如下代码所示

def register(name,age,major,country="CN"):    # country 为默认参数,要放到最后"""学籍注册程序:param name: str:param age: integer:param major: str ,Chinese, CS:param country: JP,CN,US:return:"""staff_table = '''--------- 你的注册信息 ---------name   : %sage    : %smajor  : %scountry: %s''' % (name,age,major,country)    # name,age,major 为位置参数print(staff_table)register("张三",22,"CS")
register("宫保鸡丁",26,"Math","JP")
register("Mack",22,"CS","US")

代码输出如下:

         在代码当中可以看到,“张三”在没有填写参数时不指定值,那默认就是 CN,如果指定了的话,就用指定的值。

        另外,你可能注意到了,在把 country 变成默认参数后,我同时把它的位置移到了最后面,为什么呢?这与关键参数时所有的情况是一样的,这是因为如果默认参数、关键参数\默认参数之间存在着一种优先级关系,即位置参数 > 关键参数\默认参数。

五、非固定参数

        非固定参数分为:可变参数(Variable Arguments)和关键字可变参数(Keyword Variable Arguments)

可变参数:可变参数是指函数定义时不确定传入实参的个数,可以使用星号(*)来表示可变参数,传入的实参将被打包成一个元组(tuple)。

关键字可变参数:关键字可变参数是指函数定义时不确定传入实参的个数,可以使用两个星号(**)来表示关键字可变参数,传入的实参将被打包成一个字典(dict)。

代码如下:

def register(name,*args,**kwargs):print(name,args,kwargs)
register("Jove",22,"Math",sex="M")

代码输出如下: 

 

相关文章:

[Python学习日记-31] Python 中的函数

[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子: 你是某公司的一个高级程序员,现在老板让你写一个监控程序,需要24小时全年无休的监控公司网站服务器的系统状况,当 CPU、Memory、Disk 等指标的使用…...

Kafak入门技术详解

抱歉,没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…...

X-Spreadsheet:Web端Excel电子表格工具库

在数字化时代,数据管理与分析的重要性日益凸显。传统的电子表格软件如Microsoft Excel和Google Sheets在数据处理方面发挥着重要作用,但在Web端,一款名为X-Spreadsheet的工具库正以其独特的优势逐渐崭露头角。本文将详细介绍X-Spreadsheet&am…...

为什么很多APP取消网页版

厂商为了增加用户黏度把所有的内容都放在 APP 上,京东的网页也搜索不到东西了,就算看到东西要跳转过来还需要先登录一下。 对比亚马逊这类的其他的购物网站,基本上都是网页内容和 APP 的内容都是同步的,网页直接看也可以下单&…...

Kubernetes高级功能

资源配额 什么是资源配额 资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…...

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识

关卡任务 闯关任务需要在关键步骤中截图: 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…...

【python爬取网页信息并存储】

爬取网页信息并存储是一个常见的任务,通常涉及以下几个步骤: 发送HTTP请求:使用库如requests来发送HTTP请求获取网页内容。解析网页内容:使用库如BeautifulSoup或lxml来解析HTML内容,提取所需信息。存储数据&#xff…...

TCP、UDP

TCP和UDP的区别 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任…...

聊聊暖通空调系统的优化控制方法

目录 暖通空调系统的优化控制方法✈️part1 初版回归网络建模✈️part2 更新的回归网络✈️ 聊聊暖通空调系统的优化控制方法 这篇文章简单分享一下暖通空调(HVAC)领域常常提到的”优化控制“这一概念指的是什么,它控制的是哪些参数&#…...

2024年合肥市职业院校技能大赛(中职组)赛 网络安任务书样题

2024年合肥市职业院校技能大赛--中职组赛 网络安任务书样题 一、竞赛项目简介:二、竞赛注意事项模块A: 理论技能与职业素养模块B: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块C:CTF 夺旗…...

制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统

全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作,基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时,PowerProject …...

mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。

mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。在传统的TLS(Transport Layer Security)中,客户端通常只会验证服务器的身份&am…...

HUAWEI WATCH GT 系列安装第三方应用

文章目录 适用机型概述官方文档从源码构建 hap 文件和对源码签名下载和安装DevEco Studio下载和安装首次启动推荐:设置IDE推荐的兼容版本环境(可选)安装并启用中文菜单插件 使用DevEco Studio打开项目并进行构建构建问题解决一、生成密钥和证…...

Html jquery下拉select美化插件——selectFilter.js

1. Html jquery下拉select美化插件——selectFilter.js jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画以及Ajax交互,使得开发者能更高效地构建交互式网页。在本案例中,jquery.selectlist.js插件正是基于jQuery构建的&…...

使用ESP8266扫描WiFi列表

一、简介 准备用基于esp8266的nodemcu开发板做一个天气时钟。目前只实现了第一阶段任务的第一点要求。使用arduino编程,在基于esp8266的nodemcu开发板上实现开机自动连接wifi。 这里记录一下使用ESP8266扫描WiFi列表的方法。还需要研究怎么把列表显示在网页上&…...

Java对象访问机制:句柄访问与直接指针访问

在Java虚拟机(JVM)中,对象的访问方式是一个关键的设计选择,它影响着程序的性能和内存管理。JVM规范中只规定了对象引用(reference)必须指向对象,但并没有定义这个引用应该如何定位和访问堆中对象…...

基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务

开发学习过程中有个短信发送功能,阿里云腾讯云等等都要money,听说qq邮箱可以实现免费发送邮箱的功能(短信发送的平替),就用这个来实现!!!【找了好多好多方法才成功的啊啊啊啊&#x…...

【MySQL】聚合函数、group by子句

目录 聚合函数 count([distinct] column) sum([distinct] column) avg([distinct] column) max([distinct] column) min([distinct] column) group by子句 1.如何显示每个部门的平均薪资和最高薪资 2.显示每个部门每种岗位的平均薪资和最低薪资 3.显示平均工资低于200…...

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HandlerInter…...

阳光能源嵌入式面试及参考答案(2万字长文)

管道能够承载的最大传输数据量是多少? 在嵌入式系统中,管道能够承载的最大传输数据量取决于多个因素。 首先,管道的容量受到操作系统的限制。不同的操作系统对管道的大小有不同的规定。一般来说,管道的容量通常是有限的,并且在不同的操作系统版本和配置下可能会有所不同。…...

别再死记硬背了!用GNS3/EVE-NG模拟BGP、OSPF、RIP混合组网,带你理解路由选路优先级

动态路由协议实战:用GNS3/EVE-NG解密BGP、OSPF、RIP选路逻辑 当你面对一个同时运行BGP、OSPF和RIP的复杂网络时,路由器究竟如何选择最佳路径?这个看似基础的问题,却让无数网络工程师在深夜排障时抓狂。传统教材中那些枯燥的AD值表…...

S7-1200 PLC 五大核心实验精讲:从振荡电路到浮点数运算的仿真实战

1. 从零开始搭建S7-1200仿真环境 第一次接触西门子S7-1200 PLC时,我被它强大的功能和复杂的软件界面吓到了。后来发现只要掌握几个关键步骤,仿真环境搭建其实比想象中简单得多。这里分享我的踩坑经验,帮你省去80%的摸索时间。 首先需要安装…...

MTKClient终极指南:解锁联发科设备的完整刷机与调试解决方案

MTKClient终极指南:解锁联发科设备的完整刷机与调试解决方案 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 你是否曾经遇到过联发科设备变砖无法启动的困境?或者想…...

如何用本地OCR工具快速提取视频硬字幕:3步完成专业字幕制作

如何用本地OCR工具快速提取视频硬字幕:3步完成专业字幕制作 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字…...

内存数据库eXtremeDB核心技术解析与实践指南

1. 内存数据库技术概述在传统数据库系统中,磁盘I/O往往是性能瓶颈所在。每次数据查询都需要从磁盘读取数据到内存缓冲区,这个过程中涉及机械寻道、旋转延迟等物理限制。而内存数据库(IMDS)通过直接在内存中存储和处理数据,彻底绕过了这个瓶颈…...

CODE-II:百万级心电图AI评估基准与深度学习模型实践

1. 项目概述:当心电图遇上AI,我们如何量化“看懂”的能力?心电图,这个在临床诊断中司空见惯的波形图,背后是心脏每一次搏动的电生理活动记录。医生们通过识别P波、QRS波群、T波的形态、间期和节律,来判断心…...

Sora 2 + After Effects 24.4终极联动教程:含LUT自动映射、运动追踪反哺、动态遮罩同步(附独家.jsx插件)

更多请点击: https://intelliparadigm.com 第一章:Sora 2与After Effects 24.4深度整合概览 Adobe After Effects 24.4 正式引入对 OpenAI Sora 2 模型输出格式的原生支持,标志着生成式视频工作流首次在专业后期平台中实现端到端闭环。该整…...

线束工程化实践:从设计到测试的自动化工具链与开源资源

1. 项目概述:从“Awesome”清单到工程化实践在开源世界里,“Awesome”系列清单就像一个个精心整理的藏宝图,指引着开发者们快速找到某个领域内的优质资源。今天要聊的这个项目fastbeast2023-netizen/awesome-harness-engineering,…...

DenseNet参数量比ResNet少?从Bottleneck和Transition层设计,聊聊模型轻量化的核心思路

DenseNet与ResNet参数效率对比:从结构设计看模型轻量化本质 在深度学习模型设计中,参数量与计算效率一直是工程师们关注的核心指标。当DenseNet首次提出时,许多研究者对其参数效率感到惊讶——看似复杂的密集连接结构,实际参数量却…...

嵌入式固件安全更新与密钥管理实践

1. 嵌入式固件安全更新概述在嵌入式系统开发中,固件更新是设备生命周期管理的关键环节。不同于传统PC软件的更新,嵌入式设备的固件更新面临更多挑战:受限的计算资源、不稳定的通信环境、严苛的安全要求等。我曾参与过多个工业控制设备的OTA升…...