[Python] 函数详讲

news2024/11/15 15:37:46

                   

                                     可莉将这篇博客收录在了:《Python》

                                     可莉推荐的一位优质博主:Keven ’ bloghttp://t.csdnimg.cn/6iwnv

 跟着可莉一起学习,一篇文章来带你理解Python中的函数的奥秘~

一、语法格式

定义函数

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

调用函数

函数名(实参列表) # 不考虑返回值
返回值 = 函数名(实参列表) # 考虑返回值

函数的调用并不会执行函数体,但是如果要调用函数的话就必须先定义函数

二、函数参数

在函数定义的时候, 可以在 ( ) 中指定 "形式参数" (简称 形参), 然后在调用的时候, 由调用者把 "实际参数" 传递进去.。

关于参数的问题:

  • 一个函数可以有一个形参, 也可以有多个形参, 也可以没有形参.
  • 一个函数的形参有几个, 那么传递实参的时候也得传几个. 保证个数要匹配.
  • 和C++,JAVA不同,Python传参不会局限于参数类型,可以支持多种不同类型的参数

下方代码将演示如何传参给调用的函数:

def add(a, b):
    print(a+b)

add(1, 2)

该代码定义了一个add函数,然后在下方调用时传入1和2,然后执行函数打印出了a+b的值。

三、函数的返回值

在有参数的函数执行完后,可以对该函数处理的代码块进行处理来返回一个值。这个值可以比作参数在进入函数这个工厂加工后得到的产品,返回来被利用。

函数在使用return返回值后就跳出函数,继续执行调用函数后的代码。

  • 一个函数可以有多个return语句
  • 执行到 return 语句, 函数就会立即执行结束, 回到调用位置
  • 如果只想关注其中的部分返回值, 可以使用 _ 来忽略不想要的返回值.

①一个函数可以有多个return语句 / return 会立即执行结束

# 判定是否是奇数
def isOdd(num):
    if num % 2 == 0:
    return False
else:
    return True
    result = isOdd(10)

print(result)

如该代码,总共用来两次return语句当程序遇到return语句的时候就会退出函数,所以这种条件语句中当条件被满足的时候就会执行return语句返回需要的值,然后退出函数。

②用_ 来忽略不想要的返回值.

def getPoint():
    x = 10
    y = 20
    return x, y
_, b = getPoint()

在该代码在定义的下方被调用,但是调用的时候在原本应该写变量的位置上放置了一个 “_” ,那么“_” 有什么用呢?

如果我们有一个函数有两个返回值的话,就可以用多元赋值,但是其中有一个值你不需要,那么你就可以在那个不需要值的地方用 “_” 来补充。这样,就只有自己需要的值被自己所设置的变量获取了。

四、变量作用域

def getPoint():
    x = 10
    y = 20
    return x, y

x, y = getPoint()

这个代码中函数中的x,y和下面的x,y是否是一个呢?

  • 在函数内部的变量, 也称为 "局部变量"
  • 不在任何函数内部的变量, 也称为 "全局变量"

当然不是。很明显,上面x,y是在在函数getPoint中的局部变量。而下面的x和y是定义的全局变量。

该例子也说明,在不同的作用域中允许用相同的变量名。

那么要如何在函数内部修改全局变量呢?

在C/C++中有指针,我们可以通过指针来进行对传入的值的修改并维持修改的值。在Python中我们用global 关键字声明,如下:

x = 20
print(x)
def test():
    global x
    x = 10
    print(f'函数内部 x = {x}')
test()
print(f'函数外部 x = {x}')

运行结果如下:

                

如结果所示,在刚开使的时候我们定义x为20,然后函数被声明,并且在x在函数中用用global关键字声明全局变量x,从而使得在函数里改变x的值时,全局变量的x也收到改变。

五、链式调用

把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式调用。

举例如下:

def isOdd(num):
    if num % 2 == 0:
    return False
else:
    return True

result = isOdd(10)
print(result)

这是个判断传入的参数是否为奇数的函数,如果是返回波尔值Ture,不是返回False。

其中:

result = isOdd(10)
print(result)

可以直接写成:

print(isOdd(10))

这就是链式调用的一个简单例子。
 

六、嵌套调用

函数内部还可以调用其他的函数, 这个动作称为 "嵌套调用"。

def a():
    print("函数 a")

def b():
    print("函数 b")
    a()

b()  # 调用函数 b

这段代码定义了两个两个函数,在b函数中嵌套调用了a函数,所以在下面调用b函数的时候会打印出一下内容:    

在函数内调用函数这种嵌套调用,相当于在函数栈帧上再开辟一片空间,在调用完函数里面的调用函数后这篇开辟的空间就会被摧毁。如果说在函数调用的函数中再次去调用另外一个函数的话那么会一直开辟空间,在一个递推的过程中创建,在一个个函数被调用完毕后会一个一个往前销毁空间,这个也就是函数栈帧的创建和销毁。

七、函数递归

递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己.

def factor(n):
    if n == 1:
        return 1
    return n * factor(n - 1)

result = factor(5)
print(result)

上述代码中, 就属于典型的递归操作. 在 factor 函数内部, 又调用了 factor 自身,然后就会持续的调用,直到到达设定好的条件时再向后回归。

递归必须满足以下规则:

  • 存在递归结束条件. 比如 if n == 1 就是结束条件. 当 n 为 1 的时候, 递归就结束了.
  • 每次递归的时候, 要保证函数的实参是逐渐逼近结束条件的

如果不设置递归结束的条件的话,那么递归就会一直执行下去,导致无限循环。

八、默认值参数

Python 中的函数, 可以给形参指定默认值。

带有默认值的参数, 可以在调用的时候不传参。
代码举例:

def add(x, y, debug=False):
    if debug:
        print(f'调试信息: x={x}, y={y}')
    return x + y

print(add(10, 20))
print(add(10, 20, True))

该代码是一个计算两个数之和的代码,此处 debug=False 即为参数默认值. 当我们不指定第三个参数的时候, 默认 debug 的取值即为 False。。

在写默认值参数时也有一定规则:

带有默认值的参数需要放到没有默认值的参数的后面

九、关键字参数

在调用函数的时候, 需要给函数指定实参。一般默认情况下是按照形参的顺序, 来依次传递实参的。
但是我们也可以通过 关键字参数, 来调整这里的传参顺序, 显式指定当前实参传递给哪个形参。

def test(x, y):
    print(f'x = {x}')
    print(f'y = {y}')

test(x=10, y=20)
test(y=100, x=200)

运行结果:

                       

可莉的话

本篇博客内容到此结束啦。函数是一个非常中要的知识,在Python程序的书写中无非就是一个个逻辑来进行拼凑实现的,其中当然少不了函数的影子~~

之后呢可莉将继续为大家带来Python的干货讲解,如果喜欢,请订阅我的《Python》专栏哦。感谢!!

以上就是可莉所了解的关于函数的知识啦,写了这么长,不知道大家有没有认真学习呢~

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

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

相关文章

猫头虎分析:如何利用ChatGPT及生成式AIGC提高工作效率 ‍

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

小区创业项目推荐:小投资大回报的店铺类型

作为一位拥有5年鲜奶吧创业经验的自媒体博主,我深知在小区内寻找一个既小投资又能带来大回报的创业项目是多么重要。今天,我要为大家推荐的,正是这样一个项目——鲜奶吧。 一、鲜奶吧:小区内的健康食品新宠 随着健康饮食观念的深…

【SpringBoot】JWT令牌

📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 什么是JWT JWT简称JSON Web Token,也就是通过JSON形式作为Web应用的令牌,用于各方面之间安全的将信息作为JSON对象传输…

mac终端怎么恢复初始设置?图文教程不想看看吗?

某网友说“不小心把终端弄成了这样?请问该怎么办呢?mac终端怎么恢复初始设置?” 其实,这个问题不难,在终端中选择【还原初始值】即可。 Mac终端初始化具体怎么操作?话不多说,图文教程分享给大…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士,您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作,拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中,我们将介绍当今…

前端学习之路(6) npm详解

npm 是什么? npm(node package manager):node.js 的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) ,npm 是随同 node.js 一起安装的包管理工具,能解决 node.j…

Redis 基本认识

文章目录 Redis八个特性Redis应用场景Redis应用缺陷Redis使用流程 Redis八个特性 速度快 原因: ① 单线程,避免了多线程竞争(如加锁/解锁)的时间开销 ② redis的数据存放在内存中 ③ 使用C语言编写,C语言更方便操做硬件 ④ Redis 源码优秀 利用键值对存…

新手指南:Postman 旧版本(历史版本)下载

随着技术的不断发展,有时候我们发现自己需要退回到使用 Postman 某个以往的版本。这篇文章旨在指导你如何安全地移除当前版本的 Postman、查找并获取旧版本。 从你的系统中移除 Postman 为了确保旧版本的 Postman 可以无障碍地安装,首先得从你的系统中…

嵌入式中经典面试题分析

1.关键字static的作用是什么?为什么static变量只初始化一次? 1)修饰局部变量:使得变量变成静态变量,存储在静态区,存储在静态区的数据周期和程序相同, 在main函数开始前初始化,在退…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料,市场型号GeoInsight,委托Ocean Physics Technology公司销售,地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

Unity类银河恶魔城学习记录4-1,4-2 Attack Logic,Collider‘s collision excepetion源代码 P54 p55

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; u…

C/C++ - 容器vector

目录 容器特性 构造函数 默认构造函数 填充构造函数 范围构造函数 拷贝构造函数 内存布局 大小函数 size() 函数 capacity() 函数 empty() 函数 resize() 函数 增加函数 push_back(const T& value) emplace_back(Args&&... args) push_back和empla…

linux(redhat)重置root密码

首先将root密码改成几乎不可能记住的密码 [rootexample ~]# echo fheowafuflaeijifehowf|passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.重启系统,进入救援模式 出现此页面,按e键 lin…

一个简单的2024龙年倒计时页面html源码

预览如下 复制粘贴下面的代码&#xff0c;另存为html文件即可打开&#xff0c;文字链接都可以更改&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>2024新年倒计时</title> <style>::-webki…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间实现的 Linux的特点&#xff1a;开源、免费、拥有最为庞大的源码贡献者 …

Mac安装Homebrew+MySQL+Redis+Nginx+Tomcat等

Mac安装HomebrewMySQLRedisNginxTomcat等 文章目录 Mac安装HomebrewMySQLRedisNginxTomcat等一、Mac安装Mysql 8①&#xff1a;下载②&#xff1a;安装③&#xff1a;配置环境变量④&#xff1a;外部连接测试 二、Mac安装Redis和可视化工具①&#xff1a;安装Redis01&#xff1…

STL常用容器—set容器

STL常用容器—set容器 1. set容器相关概念2. 初始化容器3. set容器插入和删除4. set容器大小和交换5. set容器的查找和统计6. set、multiset、unordered_set三者的区别7. pair对组的创建8. set容器的排序 参考博文&#xff1a;STL常用容器——set容器的使用 1. set容器相关概念…

SpringSecurity+OAuth2权限管理实战

Spring Security快速入门 官方文档&#xff1a; Spring Security :: Spring Security 功能&#xff1a; 身份认证&#xff08;authentication&#xff09; 授权&#xff08;authorization&#xff09; 防御常见攻击&#xff08;protection against common attacks&#xff…

Filter 实现过滤符合条件的请求并落库

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、配置过滤器类 二、定义数据表、实体类、Mapper 2.1 DDL 2.2 实体类 2.3 Mapper 三、创建一个过滤器 四、实现 Nacos 配置…

C语言第二十一弹---指针(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 转移表 1、转移表 总结 1、转移表 函数指针数组的用途&#xff1a;转移表 举例&#xff1a;计算器的⼀般实现&#xff1a; 假设我们需要做一个能够进行加减…