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

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 编程的路上又迈进了一大步,以后还要继续加油,多练习,把这些知识掌握得更牢固!

相关文章:

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

最近我在学 Python 编程,今天可算是狠狠钻研了一把 Python 里的函数,感觉脑袋里的知识又充实了不少,赶紧来记一记。 一、Python函数基础概念 (一)pass语句:代码块的“占位符” 在编写代码时,有…...

Unity常用特性(Attribute)用法

一.UnityEngine命名空间 1.[Header(string)] inspector面板上给显示的字段上加一个描述 通常情况下,用于在 Inspector 窗口中创建字段的逻辑分组 public class AttributeTest : MonoBehaviour {[Header("public_field_num")]public int num; }2.[Tool…...

VUE对接deepseekAPI调用

1.先去开放平台注册账号申请api key。开放平台:https://platform.deepseek.com/api_keys 2.你的项目需要有发送请求的axios或者自己写。 npm install axios # 或 yarn add axios 3.创建 API 调用函数 在 Vue 项目中,通常会将 API 调用的逻辑封装到一个…...

【Postman 接口测试】接口测试基础知识

在软件开发与测试领域,接口测试是保障软件质量的关键环节之一,而 Postman 作为一款功能强大且广泛使用的接口测试工具,能帮助我们高效地进行接口测试工作。下面,我们将详细介绍接口测试的基础知识,包括接口的认识、接口…...

谷粒商城——商品服务-三级分类

1.商品服务-三级分类 1.1三级分类介绍 1.2查询三级分类查询-递归树型结构数据获取 1.2.1导入数据pms_catelog.sql到数据表pms_category 1.2.2一次性查出所有分类及子分类 1.2.2.1修改CategoryController.java /*** 查出所有分类以及子分类,以树形结构组装起来*/R…...

视觉语言模型 (VLMs):跨模态智能的探索

文章目录 一. VLMs 的重要性与挑战:连接视觉与语言的桥梁 🌉二. VLMs 的核心训练范式:四种主流策略 🗺️1. 对比训练 (Contrastive Training):拉近正例,推远负例 ⚖️2. 掩码方法 (Masking):重构…...

HarmonyOS NEXT:华为分享-碰一碰开发分享

随着科技的不断进步,智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业,一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出,特别是其中的“碰一碰”功能,为用户带来了前所未有…...

宝塔Linux+docker部署nginx出现403 Forbidden

本文主要讲述了宝塔docker部署nginx出现403 Forbidden的原因,以及成功部署前端的方法步骤。 目录 1、问题描述2、问题检测2.1 检测监听端口是否异常2.2 检测Docker容器是否异常2.2.1 打开宝塔Linux的软件商店,找到Docker管理器,查看前端容器是…...

软件测试丨Redis 的数据同步策略以及数据一致性保证

Redis 以其键值存储的方式,为开发者提供了数据快速存取的能力。它不仅支持丰富的数据结构,如字符串、哈希、列表、集合等,而且提供了高效的数据同步与一致性保障机制。正因为如此,Redis 被广泛应用于缓存、消息队列、实时数据分析…...

C语言-运算符

1. 按位与运算符(&) 按位与运算符对两个整数的每一位执行“与”操作。只有当两个相应位都为 1 时,结果才为 1 ;否则为 0。 // 示例 int a 5; // 二进制: 0101 int b 3; // 二进制: 0011 int result a & b; …...

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份,我已写下一篇《近一年多个人总结》,当时还没开始写博客。四月份写博后,就顺手将那篇总…...

表格标签基本使用

表格主要用于显示、展示数据&#xff0c;因为它可以让数据显示的非常的规整&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的教据表现得很有条理。 1.<table></table>是用于定义表格…...

【学术会议论文投稿】深度解码:机器学习与深度学习的界限与交融

目录 一、定义与起源&#xff1a;历史长河中的两条轨迹 二、原理差异&#xff1a;从浅层到深层的跨越 三、代码解析&#xff1a;实战中的机器学习与深度学习 机器学习示例&#xff1a;线性回归 深度学习示例&#xff1a;卷积神经网络(CNN) 四、应用差异&#xff1a;各自领…...

使用printmap()函数来打印地图

使用PrintMap()函数可以将地图布局发送到打印机.默认情况下,任务会发送到地图文档保存的默认打印机,但也可以通过自定义一个特定的打印机来执行打印任务 操作方法 1.打开目标地图 2.打开python窗口 3.导入arcpy.mapping模块 import arcpy.mapping as mapping 4.引用活动地…...

MyBatis Plus 的 InnerInterceptor:更轻量级的 SQL 拦截器

在 Spring Boot 项目中使用 MyBatis Plus 时&#xff0c;你可能会遇到 InnerInterceptor 这个概念。 InnerInterceptor 是 MyBatis Plus 提供的一种轻量级 SQL 拦截器&#xff0c;它与传统的 MyBatis 拦截器&#xff08;Interceptor&#xff09;有所不同&#xff0c;具有更简单…...

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…...

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…...

本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程

文章目录 前言1.关于SigNoz2.本地部署SigNoz3.SigNoz简单使用4. 安装内网穿透5.配置SigNoz公网地址6. 配置固定公网地址 前言 本文介绍如何在Ubuntu系统上使用 Docker 快速部署一款强大的应用性能监控工具SigNoz&#xff0c;并结合cpolar内网穿透工具轻松实现异地远程使用。 …...

防火墙的会话并发数、端口数量及其关系‌

‌防火墙的会话并发数、端口数量及其关系‌&#xff1a; ‌会话并发数‌&#xff1a;会话并发数&#xff0c;也称为并发连接数&#xff0c;是指防火墙能够同时处理的点对点连接的最大数目。这个参数直接影响到防火墙在高流量环境下的表现&#xff0c;特别是对于需要处理大量并发…...

随机变量的变量替换——归一化流和直方图规定化的数学基础

变量替换是一种在统计学和数学中广泛应用的技术&#xff0c;它通过定义新的变量来简化问题&#xff0c;使得原本复杂的随机变量变得更加容易分析。 变量替换的公式&#xff0c;用于将一个随机变量 X X X 的概率密度函数 f X f_X fX​ 转换为其经过函数 g g g 变换后的随机变…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...