python基础教程九 抽象二(函数参数)

1. 值从哪里来

定义函数时,你可能心存疑虑,参数的值是怎么来的呢?
在def语句中,位于函数名后面的变量通常称为形式参数,在调用函数时提供的值称为实参,但在本书不做严格区分。

2. 我能修改参数吗

函数通过参数获得了一些列值,你能对其修改吗?如果这样做,结果将如何?参数不过变量而已,行为与你的预期完全相同。在函数内部给参数赋值对外部没有任何影响。

>>> def try_to_change(n):
...  n='sss'
...
>>> name='dsda'
>>> try_to_change(name)
>>> name
'dsda'

在try_to_chage内,将新值赋给了参数n,但如你所见,这对变量name没有影响。说到底这是一个完全不同的变量。

字符串(以及数和元组)是不可变的,这意味这你不能修改它们(即只能替换为新值)。因此这些类型作为参数项没什么可说的。但如果参数为可变的数据结构(如列表呢)

>>> def chage(n):
...     n[0]='cao'
...
>>> names=['haha','end']
>>> chage(names)
>>> names
['cao', 'end']

在上面的示例中,也在函数内修改了参数,但这个示例与前一个示例存在一个重要不同,前一个示例只是给局部变量赋了新值,而在这个示例中修改了变量关联到的列表。这并不奇怪,这次不用函数,再做一次

>>> names=['abc','bscd']
>>> n=names
>>> n[0]='111'
>>> names
['111', 'bscd']

这样的情况你早就见过。将一个列表赋值给俩个变量,这俩个变量将同时指向这个列表就这么简单。要避免这样的结果,必须创建列表的副本。对序列执行切片操作时,返回的切片是副本。因此,如果你创建覆盖整个列表的切片,得到的将是列表的副本

>>> n=names[:]
>>> n
['111', 'bscd']
>>> names is n
False
>>> n==names
True

现在如果修改n,将不会影响names。

>>> n[0]=222
>>> n
[222, 'bscd']
>>> names
['111', 'bscd']

下面来尝试结合使用这种技巧和函数change。

>>> def change(name):
...     name[0]='111'
...
>>> names
['111', 'bscd']
>>> names[0]='2222'
>>> names
['2222', 'bscd']
>>> change(names[:])
>>> names
['2222', 'bscd']

当然copy方法也是可以的

1. 为何要修改参数

在提高程序的抽象程度方面,使用函数来修改数据结构是一种不错的方式。假设你要编写一个程序,让它存储姓名,并让用户能根据名字,中间名或姓找人。为此,你可能使用一个类似下面的数据结构:

>>> storage['first']={}
>>> storage['middle']={}
>>> storage['last']={}
>>>

数据结构storage是一个字典,包含3个键:first,middle和last。在每个键下面存储了一个字典。这些子字典的键为姓名,值为随便瞎写

>>> me='随便瞎写'
>>> storage['first']['magnus']=me
>>> storage['middle']['lie']=me
>>> storage['last']['lie']=me
>>> storage
{'first': {'magnus': '随便瞎写'}, 'middle': {'lie': '随便瞎写'}, 'last': {'lie': '随便瞎写'}}
>>> storage['first']['magnus']
'随便瞎写'

如果我们这里使用函数代替重复的代码,整体将会整洁很多

>>> def init(data):
...     data['first']={}
...     data['middle']={}
...     data['last']={}>>> def lookup(data,label,name):
...     return data.get(label,{}).get(name,{})>>> lookup(s,'first','magnus')
'随便瞎写'
>>> lookup(s,'first','magn')
{}

2. 如果参数是不变的

在有些语言,经常需要给参数赋值并让这种参数修改影响函数外部的变量。在python中,没法直接这样做,只能修改参数对象本身。但如果参数是不可变的呢。
不好意思,没办法。在这种情况下,应从函数返回所有需要的值(如果需要返回多个值,就以元组的方式返回它们)。例如,可以像下面这样编写将变量的值加一的函数。

>>> def inc(x): return x+1
...
>>> foo =10
>>> foo=inc(foo)
>>> foo
11

如果一定要修改参数,可玩点花样,比如将值放在列表当中,如下所示:

>>> def ind(x): x[0]+=1
...
>>> foo=[10]
>>> ind(x)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> ind(foo)
>>> foo
[11]

但更清晰的解决方案是返回修改后的值。

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

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

相关文章

同样是IT行业,测试和开发薪资真就差这么大吗?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Java进阶之旅第六天

Java进阶之旅第六天 Stream流 Stream的思想 Stream流中引入函数式编程的思想,以类似流水线的方式处理数据,使得代码更加高效整洁Stream中提供并行处理的能力,可以将数据分成多个子任务,并行处理 各类型的调用方法 类型方法说明单列集合default Stream streamCollection中默…

请写出js中的两种定时器,区别是什么?怎么清除定时器?

在JavaScript中有两种常用的定时器&#xff1a;setTimeout 和 setInterval。 setTimeout&#xff1a;此函数用于在指定的毫秒数后执行一次函数或计算出的表达式。例如&#xff0c;如果你想在5秒后打印一条消息&#xff0c;你可以这样做&#xff1a; var myTimer setTimeout(f…

下载csdn文章,并保存md笔记中的图片链接至本地

推荐1个下载别人csdn文章笔记的java项目&#xff1a;csdn-blog2markword-downloader 拿到别人的md笔记后&#xff0c;但是笔记中的图片又是以链接的格式给的&#xff0c;这个链接说不定后面就失效了&#xff0c;笔记也就看不到图片了。手动右键也可以保存图片&#xff0c;但是…

前端学习笔记 7:小兔鲜

前端学习笔记 7&#xff1a;小兔鲜 准备工作 创建项目 创建项目&#xff1a; npm init vuelatest相关选项如下&#xff1a; 在src目录下添加以下目录&#xff1a; 别名路径联想 默认情况下在 VSCode 中输入import xxx from ...时不会启用路径联想功能&#xff0c;要启用需…

使用宝塔面板安装wiki.js详细教程

因为在安装过程中遇到了一些问题&#xff0c;花费了很长时间在解决问题上。根据这篇教程可以少踩很多坑。点赞加关注吧。 准备运行环境 Nodejs 在宝塔面板的软件商店中找到nodejs版本管理器并安装。 点击设置&#xff0c;选择一个稳定版安装。 PostgreSQL 官方推荐的数据库是…

用户洞察:精准解读用户的真实需求!

洞察用户需求的过程和谈恋爱一样。你不能简简单单地问客户&#xff0c;你想要什么&#xff1f;你有什么痛点&#xff1f;这样的问法是无法得到任何有价值的信息。这就好比谈恋爱的场景&#xff0c;如果你问对方想吃什么&#xff0c;大概率会得到“随便”“都行”这类的答案&…

Python实现一个简单的烟花秀效果(附带源码)

在 Python 中实现一个简单的烟花秀效果&#xff0c;可以使用 turtle 模块进行绘图。以下是一个简单的例子&#xff1a; import turtle import random import math# 设置画布 turtle.speed(0) turtle.hideturtle() turtle.bgcolor("black")def create_firework(x, y)…

力扣62. 不同路径

动态规划 思路&#xff1a; 定义 dp[r][c] 为到达坐标 (r, c) 的路径数&#xff1a; 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达&#xff1b;状态转移方程&#xff1a; dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…

2526. 随机数生成器(BSGS,推导)

题目路径&#xff1a; https://www.acwing.com/problem/content/2528/ 思路&#xff1a;

HNU-数据挖掘-实验1-实验平台及环境安装

数据挖掘课程实验实验1 实验平台及环境安装 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验1 实验平台及环境安装实验背景实验目标实验步骤1.安装虚拟机和Linux平台&#xff0c;熟悉Ubuntu环境。2.在Linux平台上搭建Python平台&#xff0c;并安装…

esp32-idf eclipse 分区表(partition table / NVS)的读写demo

前言&#xff1a; 分区表&#xff08;Partition Table&#xff09;和 NVS&#xff08;Non-Volatile Storage&#xff09;是 ESP-IDF 中用于存储数据的两种不同机制。 分区表&#xff08;Partition Table&#xff09;&#xff1a; 分区表定义了将 Flash 存储器划分为不同逻辑分…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

2024 年大促入手哪些云服务器实用划算?

2024年各大云厂商的“价格战”又已拉开帷幕&#xff0c;作为用户的我们最为关心的是这些云服务商的年终大促中&#xff0c;实用划算的云服务器配置有哪些&#xff1f;小编看了一下&#xff0c;今年的年终大促活动中&#xff0c;国内云平台几位大佬&#xff0c;阿里云&#xff0…

C++入门学习(十一)字符型

C中的字符型可以表示ASCII码中的所有字符&#xff0c;包括字母、数字、标点符号等。 ASCII码是一种用于编码字符的编码系统&#xff0c;它使用不同的数值来表示不同的字符。ASCII码使用7位或8位二进制数来表示每个字符&#xff0c;因此可以表示128或256个不同的字符。 在ASCI…

构建开源的多模态 RAG 系统

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Building an Open Source Multi-Modal RAG System 原文地址:https://medium.com/nadsoft/buil…

性能利器Caffeine缓存全面指南

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Caffeine缓存&#xff0c;小黑在网上购物&#xff0c;每次查看商品都要等几秒钟&#xff0c;那体验肯定不咋地。但如果用了缓存&#xff0c;常见的商品信息就像放在口袋里一样&#xff0c;随时取用&…

Ubuntu22.04安装各种常用软件-目录

0、基本环境搭建 Ubuntu 22.04 基础环境搭建 1、安全类 Ubuntu 22.04 安装Fail2Ban 2、监控类 Ubuntu 22.04 安装prometheus 3、工具类 Ubuntu 22.04 Cron使用 Ubuntu 22.04 安装docker 4、数据库 Ubuntu 22.04 安装MySql 5、集群类 Ubuntu 22.04 安装docker

Linux查找日志常用命令

tail tail命令常使用选项-f -f, --follow[{name|descriptor}]output appended data as the file grows;an absent option argument means descriptor例如&#xff1a; tail -1000f sys.log按回车键增加空白行&#xff0c;按Ctrl C 结束 vi / vim vi 文件名 如&#xff1a;…

杭电网课笔记

技巧 1.判断得数为整数还是小数&#xff0c;可以%1&#xff0c;得数为0是整数 或者用instanceof Integer number 9; // 自动装箱 System.out.println(number instanceof Integer); // 输出&#xff1a;true 2.a * b 最大公约数 * 最小公倍数 LCM 最小公倍数 GCD 最大公…