No.36 学习 | Python 函数:从基础到实战

最近我在学 Python 编程,今天可算是狠狠钻研了一把 Python 里的函数,感觉脑袋里的知识又充实了不少,赶紧来记一记。

在这里插入图片描述

一、Python函数基础概念

(一)pass语句:代码块的“占位符”

在编写代码时,有时我们需要在代码块中预留位置,但暂时不想执行任何操作,这时pass语句就派上用场啦。它就像是一个空语句,默默地占据着代码的位置,让代码结构保持完整。比如在条件语句、循环语句或者函数定义中,都可以使用pass语句来占位。

(二)函数定义与调用:代码复用的关键

函数是一段可复用的代码块,专门用来执行特定的任务。定义函数时,我们要使用def关键字,就像给这个“小助手”取了个名字,然后在后面加上参数列表(如果有的话)和代码块。调用函数也很简单,直接使用函数名并传入相应的参数就可以啦。函数可以接受参数,还能返回结果,返回结果时使用return语句。

二、参数传递:灵活赋予函数“能量”

(一)位置实参:按顺序传递的“接力棒”

位置实参是最常见的参数传递方式,它按照参数在函数定义中的位置顺序进行传递。就像接力比赛中的接力棒,每个实参都要准确地交到对应的形参“手中”,顺序不能错,数量也要对应。这种方式要求实参的位置必须与形参完全一致,是必须传递的参数。

(二)关键字实参:清晰明确的“指令”

关键字实参通过指定形参的名称来传递实参,这样做的好处是让函数调用更加清晰易懂。我们可以按照任意顺序传递关键字实参,而且它还能和位置参数混合使用呢!不过要记住,位置参数得放在前面。在只需要传递部分参数的情况下,关键字实参就非常方便啦。

(三)默认实参:贴心的“预设方案”

在定义函数时,我们可以给形参设置默认值,这就是默认实参。有默认值的形参要放在没有默认值的形参后面哦。调用函数时,如果不传递这个参数,它就会使用默认值;要是传递了实参,实参的值就会覆盖默认值。默认实参常用于设置一些可选参数,让函数的使用更加灵活。

(四)可变数量实参:包容万物的“收纳盒”

可变数量实参允许我们向函数传递任意数量的实参。其中,非关键字实参会被封装成一个元组,关键字实参会被封装成一个字典。可变数量实参可以和其他参数类型混合使用,不过位置参数还是要放在前面。

三、作用域:变量的“活动范围”

(一)作用域分类:各司其职的“小天地”

  1. 全局作用域:在函数外部定义的变量就处于全局作用域,就像住在“大房子”里的居民,程序的各个地方都能访问到它们。
  2. 局部作用域:函数或类方法内部定义的变量在局部作用域中,这是它们自己的“小房间”,只有在所属的代码块内才能被看到和使用。
  3. 嵌套作用域:当代码块层层嵌套时,就会产生嵌套作用域。内部代码块可以访问外部代码块的变量,就像在嵌套的房间里,里面的人可以看到外面房间的东西,但外面的人看不到里面的。
  4. 内置作用域:这是Python预先定义好的变量和函数名的“领地”,我们可以直接使用,非常方便。

(二)作用域访问规则:严格遵守的“规定”

局部作用域的变量可以访问局部、嵌套和全局作用域的变量;嵌套作用域的变量能访问嵌套和全局作用域的变量,但不能修改全局变量;全局作用域只能访问全局变量,没办法直接修改局部和嵌套作用域的变量。如果想要在函数内部修改全局变量,就得使用global关键字。

四、特殊函数:强大而独特的“编程利器”

(一)匿名函数(lambda函数):小巧灵活的“短兵器”

匿名函数,也就是lambda函数,它没有函数名,通常只包含一个表达式。这种函数就像一把小巧灵活的“短兵器”,适合用来创建一些简单的函数,在需要的地方直接使用,非常便捷。

(二)map函数:高效的“批量处理器”

map函数是Python的内置函数,它就像一个高效的“批量处理器”,可以对可迭代对象(比如列表、元组)中的每个元素应用同一个函数,然后返回一个结果列表。

(三)filter函数:精准的“筛选器”

filter函数就像一个精准的“筛选器”,它能从可迭代对象中筛选出满足特定条件的元素,最后返回一个迭代器,里面装着筛选出来的元素。

(四)reduce函数:强大的“累积计算器”

reduce函数有点像一个强大的“累积计算器”,它会将指定的函数应用于可迭代对象的前两个元素,然后用计算结果再和下一个元素继续应用这个函数,不断累积计算。不过,使用reduce函数需要从functools模块导入哦。

(五)递归函数:自我调用的“解题高手”

递归函数是一种特殊的函数,它通过调用自身来解决问题。就像一个聪明的“解题高手”,把大问题一步步分解成小问题。递归函数由终止条件和内部调用自身这两部分组成。使用递归函数时要特别注意,一定要有终止条件,避免出现无限调用的情况,而且每次调用都要朝着终止条件靠近。

五、实战练习:在实践中成长

(一)课堂练习:小试牛刀

  1. 递归实现阶乘计算:要求使用递归函数实现输入5输出5 * 4 * 3 * 2 * 1的值。这就需要我们巧妙地运用递归函数的特性,通过不断调用自身,逐步计算出阶乘的结果。
  2. 猴子吃桃问题:这个问题也可以用递归的方法来解决。我们要根据猴子每天吃桃的规律,从后往前推算出第一天桃子的数量。

(二)作业挑战:提升技能

  1. 斐波那契数列编程:用递归编程实现斐波那契数列,这是一个经典的递归应用场景。斐波那契数列的特点是从第三项开始,每一项都等于前两项之和,通过递归函数可以很好地实现这个逻辑。

在这里插入图片描述

  1. 计算5个人年龄问题:根据每个人年龄之间的关系,使用递归函数计算出第5个人的年龄。这需要我们理清年龄之间的递归关系,准确地编写递归函数。

在这里插入图片描述

  1. 汉诺塔扩展作业:汉诺塔问题是一个更具挑战性的递归应用。我们要通过递归算法,实现将一叠盘子从一个柱子借助另一个柱子移动到第三个柱子,并且要遵循特定的规则。

在这里插入图片描述

Python函数是Python编程中非常重要的一部分,掌握了函数的各种知识,我们就能编写出更加简洁、高效、灵活的代码。希望大家通过今天的学习,对Python函数有更深入的理解,在编程的道路上不断进步!


日记 & 总结

一开始接触函数基础概念的时候,我就被pass语句给绊了一下。这pass语句,你说它啥都不干吧,但又不能少了它。就好比盖房子,有些地方暂时还没打算装修,但又不能让它空着不管,pass语句就像是给这个地方放了个 “占位牌”,先占着位置,等以后想好了再填内容。在条件语句、循环语句或者函数定义里,它都能发挥这个作用,虽然不起眼,但还挺重要的。

函数的定义和调用也挺有意思。定义函数就像是打造一个多功能小工具,用def关键字给它取个名字,再根据需要给它装上不同的 “零件”—— 参数。这个小工具做好了,调用它的时候就像拿起工具开始干活,把需要的数据作为参数传进去,它就能帮我们完成特定的任务。要是这个任务完成后有结果,就用return语句把结果 “交出来”。

说到参数传递,这里面的门道可多了。位置实参就像是排队,大家得按照顺序来,一个萝卜一个坑,顺序和数量都不能错,不然这个 “小工具” 可能就没法正常工作。关键字实参呢,就灵活多了,它可以不按顺序来,只要喊对形参的 “名字”,把数据传过去就行,就像在一群人里直接喊名字找对应的人,这样函数调用起来就清晰多了。而且它还能和位置参数一起用,不过位置参数得站前面。

默认实参就更贴心啦,就像给 “小工具” 设置了一些常用的默认配置。定义函数的时候给形参设置好默认值,调用的时候要是不想改这个配置,就可以直接用默认的;要是有特殊需求,再传个新的值进去,把默认值替换掉就行。这在设置一些可选参数的时候特别方便,感觉就像是给我们开了个 “便捷通道”。

还有可变数量实参,这简直就是个 “大胃王”,能装下任意数量的实参。非关键字实参传进来后会被打包成一个元组,关键字实参则会被装进一个字典里。它还能和其他参数类型一起搭配使用,不过位置参数还是得打头阵。

函数的作用域也让我费了不少脑筋。全局作用域里的变量就像是住在 “大别墅” 里,整个程序都能找到它们,随时可以用。局部作用域的变量就像是在每个 “小房间”(函数或类方法内部)里的私人物品,只有在这个 “小房间” 里才能看到和使用。嵌套作用域有点像 “套娃”,里面的 “小套娃”(内部代码块)能看到外面 “大套娃”(外部代码块)的东西,但外面的看不到里面的。

内置作用域就像是 Python 提前准备好的 “百宝箱”,里面的变量和函数名我们直接就能用,可方便了。不过不同作用域之间的访问规则得记清楚,局部作用域能访问好多地方的变量,但嵌套作用域不能随便修改全局变量,全局作用域也动不了局部和嵌套作用域的变量。要是真想在函数里改全局变量,那就得请出global关键字来帮忙。

特殊函数这部分,我觉得匿名函数(lambda函数)特别酷,它没有名字,就像个神秘的 “小刺客”,通常就一个表达式,简单又灵活,适合在一些小场景里快速解决问题。

map函数是个高效的 “流水线工人”,能把同一个操作应用到可迭代对象的每个元素上,然后整齐地返回一个结果列表。filter函数则是个严格的 “质检员”,从可迭代对象里挑出符合条件的元素,组成一个新的迭代器。

reduce函数就像个厉害的 “数学家”,能把函数一步步应用到可迭代对象的元素上,不断累积计算,不过用它得先从functools模块把它 “请” 出来。递归函数最神奇,它能自己调用自己,就像一个人能不断地给自己布置新任务,直到完成最终目标。但用它的时候得小心,一定要有个终止条件,不然就像掉进了一个无尽的循环陷阱里,而且每次调用都得离这个终止条件更近一点。

今天还做了不少练习和作业。课堂上用递归函数计算阶乘,一开始我完全摸不着头脑,后来慢慢理解了递归的逻辑,顺着这个思路就把代码写出来了。还有猴子吃桃的问题,也是用递归解决的,从最后一天剩下的桃子数往前倒推,算出第一天的桃子数量,解开这个问题的时候可太有成就感了。作业里有斐波那契数列的编程、计算 5 个人年龄的问题,还有汉诺塔的扩展作业,这些可把我折腾坏了,但也让我对递归函数有了更深的理解。

今天学的这些内容虽然有点烧脑,但学会之后真的超有成就感。感觉自己在 Python 编程的路上又迈进了一大步,以后还要继续加油,多练习,把这些知识掌握得更牢固!

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

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

相关文章

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

Qt 5.14.2 学习记录 —— 십유 布局管理器

文章目录 1、QVBoxLayout2、QHBoxLayout3、QGridLayout4、QFormLayout5、QSpacerItem 布局管理器是为了让程序员不需要自己决定控件的绝对位置&#xff0c;而是通过布局管理器方便地放置 1、QVBoxLayout 垂直布局管理器 #include <QPushButton> #include <QVBoxLayo…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器&#xff08;插件安装、插件配置、markdown语法&#xff09;_vscode markdown-CSDN博客 右键 .md 文件&#xff0c;选择打开 方式 &#xff08;安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

H3C-无线WLAN配置案例(二层隧道转发)

目录 1.无线wlan产生背景:2.网络拓扑:3.网络简述:4.网络配置:4.1 网络基础配置4.2 无线wlan二层隧道转发配置4.3 无线wlan验证: 1.无线wlan产生背景: 无线WLAN&#xff08;无线局域网&#xff09;的产生背景主要源于以下几个方面的需求和技术发展&#xff1a;移动性和便捷性需…

HarmonyOS Next构建工具 lycium 原理介绍

HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供&#xff0c;如果要使用C接口&#xff0c;必须要使用NAPI在ArkTS与C间交互&#xff0c;这种场景在使用DevEco-Studio中集成的交叉编译工具&#xff0c;以及cmake构建工具就完全够用…

设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解职责链模式 最常见的职责链是直线型&#xff0c;即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者&#xff0c;职责链模式可以将请求的处理者组织成一条链&#xff0c;并让请求沿着…

js学习笔记(2)

一、函数 1.JavaScript 函数语法 函数就是包裹在花括号中的代码块&#xff0c;前面使用了关键词 function&#xff1a; function functionname() {// 执行代码 } 当调用该函数时&#xff0c;会执行函数内的代码。 可以在某事件发生时直接调用函数&#xff08;比如当用户点…

洛谷刷题1-3

比较巧妙&#xff0c;求最小公倍数&#xff0c;看多少个数一次循环&#xff0c;直接求解就好了&#xff0c;N的数量级比较大&#xff0c;一层循环也会超时&#xff0c;也用了点双指针的想法&#xff08;归并排序&#xff09; 这里很大的问题&#xff0c;主要是cin输入的时候遇到…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

每天五分钟深度学习pytorch:基于VGG神经网络完成CAFIR10的识别

本文重点 前面的所有模型我们都是使用VGG跑了mnist数据集,本次我们换一个数据集,我们使用CAFIR数据集,这个数据集我们前面介绍过,它和mnist不一样了,mnist是灰度图,这个是彩色图,所以它的通道数是3,这样我们再构建卷积神经网路的时候,第一个卷积层的输入通道数就应该…

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…

2024 自主创业事业小结和2025展望

一 2024创业事业小结&#xff1a; 1.1 2024 自主创业项目小结&#xff1a; 2024年我们小团队主要做了两大类的项目&#xff1a; 1&#xff0c;工业类 在工业领域的项目&#xff0c;我们做了3个落地的视觉集成项目。 1.1 旋转角度的测量&#xff1a; 由于是外包项目&#…

Redis使用基础

1 redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…

激光雷达和相机早期融合

通过外参和内参的标定将激光雷达的点云投影到图像上。 • 传感器标定 首先需要对激光雷达和相机&#xff08;用于获取 2D 图像&#xff09;进行外参和内参标定。这是为了确定激光雷达坐标系和相机坐标系之间的转换关系&#xff0c;包括旋转和平移。通常采用棋盘格等标定工具&…

HMV Challenges 022 Writeup

题目地址&#xff1a;https://hackmyvm.eu/challenges/challenge.php?c022 首先猜测是否为图片隐写&#xff0c;无果 盲猜图片上的小鸟是某种带符号的隐写 去这个网站找找看&#xff1a;https://www.dcode.fr/chiffres-symboles 找到了 参照原图片鸟儿的姿态选择并排放 所…