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

news2024/12/23 23:04:17

[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**y
    return res    # 返回函数执行结果

c = calc(5,8)    # 结果赋值给 c 变量
print(c)

代码输出如下:

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

def calc(x,y):
    res = x**y
    print(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   : %s
    age    : %s
    major  : %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   : %s
    age    : %s
    major  : %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   : %s
    age    : %s
    major  : %s
    country: %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   : %s
    age    : %s
    major  : %s
    country: %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")

代码输出如下: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支,也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生,旨在通过构建…

如何使用ssm实现基于Java的高校物业工程报修系统

TOC ssm736基于Java的高校物业工程报修系统jsp 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速,使用起来非常简单容易,用户甚至不用掌握相关的专…

一行命令将Cmder添加到系统右键菜单中----配置环境

第一步,去官网下载一个简版的文件 ** 第二步,将下载的文件解压后如图,找到Cmder.exe右键以管理员身份运行 第三步,在窗口输入cmder /register all然后回车 第四步,OK!不管在哪里都可以使用了,直接右键即可

vscode环境迁移

关注B站可以观看更多实战教学视频:hallo128的个人空间 vscode环境迁移 Setting 即可打开settings.json {"python.pythonPath": "/Users/apple/opt/anaconda3/bin/python","cmake.cmakePath": "/usr/local/bin/cmake",&qu…

[c++高阶]模版进阶

1.前言 在我们学习c的时候,常常会遇见要使用函数重载的情况。而当使用函数重载时,通常会使得我们编写很多重复的代码,这样就显得非常臃肿,并且效率非常的低下。 重载的函数仅仅只是类型不同,代码的复用率比较低&#x…

浮点数的这些特性你了解吗

问题1:下面的代码,输出结果是什么: public class CaclTest{public void test1(){float f 1.0F / 0.0F;System.out.println("f:" f)}public static void main(String[] args){CaclTest ct new CaclTest();ct.test1();}} A. 运行抛出异常:j…

7.数据结构与算法-循环链表

如果经常对首位元素进行操作,用尾元素更方便更快捷 两个循环链表合并

信息安全工程师(21)安全协议

前言 安全协议是建立在密码体制基础上的一种交互通信协议,它运用密码算法和协议逻辑来实现认证、密钥分配、数据机密性、完整性和抗否认性等安全目标。 一、定义与目的 安全协议旨在确保网络环境中信息交换的安全性,通过密码技术和协议逻辑来保护数据的机…

第八届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)

一.题目分析 (1).题目 (2).题目分析 1.按键功能分析----过程控制 a. 选择按键按下的个数和目标层数(每个按键都要在一秒之内按下,否则就结束) b. 当升降机到达目标平台,LED灯熄灭 c.…

负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。

负载均衡(Load Balancing)是一种计算机技术,用于在网络应用中分配工作负载,以优化资源使用、最大化吞吐量、减少响应时间以及避免过载。通过将任务均匀地分布在多个组件上,如服务器、网络链接、CPU、硬盘等&#xff0c…

【AG 创新工坊】探索存内计算的未来,共话 AGI 时代

目录 ⚛️1. 会议详情 ☪️2. 会议回顾 ♋2.1 多模态时代,存内计算架构的应用与发展 ♏2.2 分布式环境下深度学习任务的高效可靠执行研究 ♐2.3 IGZO在后道单片三维集成中的机遇与挑战 ♑2.4 witin-nn:神经网络算法模型在存内开发板上的应用开发 ♉2.5 茶歇交…

讯飞星火编排创建智能体学习(一)最简单的智能体构建

目录 开篇 智能体的概念 编排创建智能体 创建第一个智能体 ​编辑 大模型节点 测试与调试 开篇 前段时间在华为全联接大会上看到讯飞星火企业级智能体平台的演示,对于拖放的可视化设计非常喜欢,刚开始以为是企业用户才有的,回来之后查…

X86架构(九)——保护模式的进入

全局描述符表 全局描述符表(Global Descriptor Table,GDT)是保护模式下非常重要的一个数据结构。 在保护模式下,对内存的访问仍然使用段地址和偏移地址,在每个段能够访问之前,必须先行设置好 GDT 的地址,并加载全局描述符表寄存…

推荐4款2024年大家都在用的高质量翻译器。

翻译器在我们的生活中有着很重要的作用,不管是我们在学习还是工作,生活娱乐,出国旅游等场合都会派上用场,它是我们解决沟通的障碍,提高阅读效率的好帮手。我自己使用的翻译器有很多,可以给大家列举几款特别…

依赖倒置原则(学习笔记)

抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。 以…

了解输出电源优先级

主要又SUB,SBU以及USB三种模式。 调试10kW逆变器存在的输出电源优先级的问题,当优先级为SUB时,利用电压源模拟电池,当电池电压超过58.4V,即过压,在接入市电,市电继电器仍然闭合,仍然…

pyboard405意外故障,micropython OLED例程无法运行,折腾了大半天。

thonny报告&#xff1a; Traceback (most recent call last): File "<stdin>", line 3, in <module> RuntimeError: name too mode # main.py -- put your code here! from machine import I2C,Pin #从machine模块导入I2C、Pin子模块 from ss…

javascript:监听浏览器页签切换

监听页面的可见性变化&#xff0c;在很多场景下非常实用&#xff0c;比如跟踪用户行为、节省资源、优化性能等。 1 代码示例 document.addEventListener("visibilitychange", () > {if (document.visibilityState "visible") {alert("当前页面已…

上交所系统被股民买崩了?原因竟然是...

在A股市场迎来久违的牛市之际&#xff0c;上海证券交易所&#xff08;上交所&#xff09;却在关键时刻遭遇了技术挑战。9月27日&#xff0c;上交所的交易系统出现了罕见的宕机现象&#xff0c;持续时间长达两个小时&#xff0c;导致投资者在火热的交易期间无法正常进行交易操作…

通信工程学习:什么是OFDM正交频分复用

OFDM&#xff1a;正交频分复用 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种在通信领域中广泛应用的多载波调制技术。该技术通过将高速数据流分割成多个低速子流&#xff0c;并在不同频率上同时传输这些子流&#x…