当前位置: 首页 > 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、…...

工作笔记【四】

对于这种&#xff0c;样式一样&#xff0c;但是图片和字体颜色不一样&#xff0c;动态渲染。 代码&#xff1a; <template><view class"page"><view class"rows" v-for"item in data"><view class"v0"><v…...

ArcEngine C#二次开发图层处理:根据属性分割图层(Split)

需求&#xff1a;仅根据某一属性&#xff0c;分割图层&#xff0c;并以属性值命名图层名称保存。 众所周知&#xff0c;ArcGIS ArcToolbox中通过Split可以实现图形分割一个图层&#xff0c;以属性值命名图层&#xff0c;如下图所示。 本文仅仅依据属性值&#xff0c;将一个shp…...

【二叉平衡搜索树】Treap

前置 本篇是平衡树-treap的补充学习笔记。 Treap - 树堆 学习基础&#xff1a;适合一定基础的&#xff1a;比如&#xff0c;实现了经典二叉搜索树&#xff08;常用的几个函数写过&#xff09;&#xff0c; 和二叉堆&#xff08;数组的上浮下沉会写吗&#xff1f;&#xff09;&a…...

Spring Boot 应用Kafka讲解和案例示范

Kafka 是一款高吞吐量、低延迟的分布式消息系统。本文将详细介绍如何在 Spring Boot 项目中使用 Kafka 进行消息接收与消费&#xff0c;并结合幂等和重试机制&#xff0c;确保消息消费的可靠性和系统的扩展性。我们将以电商交易系统为案例进行深入解析。 1. 系统架构概览 在电…...

以到手价为核心的品牌电商价格监测

在当今竞争激烈的电商时代&#xff0c;品牌的价格监测至关重要。传统的页面价监测已无法满足品牌对渠道管控的需求&#xff0c;而到手价监测则成为品牌控价的关键所在。 力维网络&#xff0c;作为深耕数据监测服务多年的专业机构&#xff0c;拥有自主开发的数据监测系统&#…...

Android中使用RecyclerView制作横向轮播列表及索引点

在Android开发中&#xff0c;RecyclerView是一个非常强大的组件&#xff0c;用于展示列表数据。它不仅支持垂直滚动&#xff0c;还能通过配置不同的LayoutManager实现横向滚动&#xff0c;非常适合用于制作轮播图或横向列表。本文将详细介绍如何使用RecyclerView在Android应用中…...

Llama 3.1 技术研究报告-2

3.3 基础设施、扩展性和效率 我们描述了⽀持Llama 3 405B⼤规模预训练的硬件和基础设施&#xff0c;并讨论了⼏项优化措施&#xff0c;这些措施提⾼了训练效率。 3.3.1 训练基础设施 Llama 1和2模型在Meta的AI研究超级集群&#xff08;Lee和Sengupta&#xff0c;2022&#x…...

【深度学习】05-RNN循环神经网络-02- RNN循环神经网络的发展历史与演化趋势/LSTM/GRU/Transformer

RNN网络的发展历史与演化趋势 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一类用于处理序列数据的神经网络&#xff0c;特别擅长捕捉数据的时间或上下文依赖性。在其发展的过程中&#xff0c;不断出现各种改进和变体&#xff0c;以解决不…...

C++学习9.27

1、顺序表、栈、队列都更改成模板类 &#xff08;1&#xff09;顺序表 #include <iostream> #include <cstring>using namespace std;template <typename T1,typename T2,typename T3> class My_string { private:T1 *ptr; //指向字符数组的指针T2…...

【STM32开发环境搭建】-1-Keil(MDK) 5.27软件安装和注册教程

目录 1 安装前装备工作 2 安装KEIL(MDK-ARM) 5.27软件 3 注册KEIL(MDK-ARM) 5.27软件&#xff0c;获取License许可证 4 手动安装STM32F0&#xff0c;STM32F1&#xff0c;STM32F4&#xff0c;STM32F7&#xff0c;STM32H7的支持包 4.1 下载STM32的支持包 4.2 安装STM32的支…...

武汉正向科技格雷母线公司,无人天车系统,采用格雷母线定位技术

正向科技-格雷母线高精确定位技术-实操视频 高精度格雷母线内胆采用刚性内胆&#xff0c;基板采用精密度数控加工工艺&#xff0c;穿线卡采用高精度模具制作&#xff0c;不采用泡沫板填充&#xff0c;提高了地址检测精度和线性度。 最新一代的格雷母线定位技术特点是全数字化检…...

【保姆级教程】批量下载Pexels视频Python脚本(以HumanVid数据集为例)

目录 方案一&#xff1a;转换链接为download模式 方案二&#xff1a;获取源链接后下载 附录&#xff1a;HumanVid链接 方案一&#xff1a;转换链接为download模式 将下载链接的后缀加入 /download 然后用下面的脚本下载&#xff1a; import argparse import json import o…...

Python画笔案例-067 绘制配乐七角星

1、绘制橙子 通过 python 的turtle 库绘制 配乐七角星,如下图: 2、实现代码 绘制 配乐七角星 ,以下为实现代码: """配乐七角星.py本程序需要coloradd模块支持,安装方法:pip install coloradd""" import turtle from coloradd import color…...

Spark Job 对象 详解

在 Apache Spark 中&#xff0c;Job 对象是执行逻辑的核心组件之一&#xff0c;它代表了对一系列数据操作&#xff08;如 transformations 和 actions&#xff09;的提交。理解 Job 的本质和它在 Spark 中的运行机制&#xff0c;有助于深入理解 Spark 的任务调度、执行模型和容…...

C#中NModbus4中常用的方法

NModbus4 是一个用于 Modbus 协议通信的 C# 库&#xff0c;它支持串行 ASCII、RTU、TCP 和 UDP 协议。以下是 NModbus4 中常用的一些方法&#xff1a; 创建连接&#xff1a; ModbusSerialMaster.CreateRtu(SerialPort serialPort): 创建一个 RTU 串行连接。ModbusSerialMaster.…...

【Linux】线程同步与互斥

一、线程间互斥 1 .进程线程间的互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区 互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界…...

003、网关路由问题

1. nginx配置404跳转回默认路由 https://blog.csdn.net/masteryee/article/details/83689954 https://blog.csdn.net/IbcVue/article/details/133230460 https://www.jb51.net/server/317970ynk.htm https://blog.csdn.net/u014438244/article/details/120531287 https://blog…...

Eclipse 快捷键:提高开发效率的利器

Eclipse 快捷键&#xff1a;提高开发效率的利器 Eclipse 是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为Java、C、PHP等编程语言提供了强大的开发支持。对于开发者来说&#xff0c;熟练掌握Eclipse的快捷键不仅能提高编码效率&#xff0c;还能减少…...

Agent智能体

Agent&#xff08;智能体&#xff09;是一个能够感知环境并采取行动的自主实体&#xff0c;通常被设计用于在特定的环境中执行任务。智能体可以通过学习、推理等方式来决策&#xff0c;目标是最大化某种效用或实现某个预定的目标。它们广泛应用于自动化系统、游戏AI、机器人、自…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...