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

11个案例讲透 Python 函数参数

大家好,今天给大家分享一下明哥整理的一篇 Python 参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上 80% 的文章讲的都要明白,如果你是入门不久的 python 新手,相信本篇文章应该对你会有不小的帮助。

接下来是正文。

文章目录

    • 技术交流
    • 1. 参数分类
    • 2. 十一个案例
    • 3. 传参的坑

技术交流

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

本文来自技术群粉丝分享整理,资料资料、数据、技术交流,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自CSDN +备注来意
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

1. 参数分类

函数,在定义的时候,可以有参数的,也可以没有参数。

从函数定义的角度来看,参数可以分为两种:

  1. 必选参数:调用函数时必须要指定的参数,在定义时没有等号

  2. 可选参数:也叫默认参数,调用函数时可以指定也可以不指定,不指定就默认的参数值来。

例如下面的代码中,a 和 b 属于必选参数, c 和 d 属于可选参数

def func(a,b,c=0, d=1):  pass  

从函数调用的角度来看,参数可以分为两种:

  1. 关键字参数:调用时,使用 key=value 形式传参的,这样传递参数就可以不按定义顺序来。

  2. 位置参数:调用时,不使用关键字参数的 key-value 形式传参,这样传参要注意按照函数定义时参数的顺序来。

def func(a,b,c=0, d=1):  pass  # 关键字参数传参方法  
func(a=10, c=30, b=20, d=40)  # 位置参数传参方法  
func(10, 20, 30, 40)  

最后还有一种非常特殊的参数,叫做可变参数

意思是参数个数可变,可以是 0 个或者任意个,但是传参时不能指定参数名,通常使用 *args**kw 来表示:

  • *args:接收到的所有按照位置参数方式传递进来的参数,是一个元组类型

  • **kw :接收到的所有按照关键字参数方式传递进来的参数,是一个字典类型

def func(*args, **kw):  print(args)  print(kw)  func(10, 20, c=20, d=40)  

输出如下

(10, 20)  
{'c': 20, 'd': 40}  

2. 十一个案例

案例一:在下面这个函数中, a 是必选参数,是必须要指定的

>>> def demo_func(a):  
...     print(a)  
...   
>>> demo_func(10)   
10  
>>> demo_func()  # 不指定会报错  
Traceback (most recent call last):  File "<stdin>", line 1, in <module>  
TypeError: demo_func() missing 1 required positional argument: 'a'  

案例二:在下面这个函数中,b 是可选参数(默认参数),可以指定也可以不指定,不指定的话,默认为10

>>> def demo_func(b=10):  
...     print(b)  
...   
>>> demo_func(20)  
20  
>>> demo_func()  
10  

案例三:在下面这个函数中, name 和 age 都是必选参数,在调用指定参数时,如果不使用关键字参数方式传参,需要注意顺序

>>> def print_profile(name, age):  
...     return f"我的名字叫{name},今年{age}岁了"  
...  
>>> print_profile("iswbm", 27)  
'我的名字叫iswbm,今年27岁了'  

如果参数太多,你不想太花精力去注意顺序,可以使用关键字参数方式传参,在指定参数时附上参数名,比如这样:

>>> print_profile(age=27, name="iswbm")  
'我的名字叫iswbm,今年27岁了'  

案例四:在下面这个函数中,args 参数和上面的参数名不太一样,在它前面有一个 *,这就表明了它是一个可变参数,可以接收任意个数的不指定参数名的参数。

>>> def demo_func(*args):  
...     print(args)  
...   
>>>   
>>> demo_func(10, 20, 30)  
(10, 20, 30)  

案例五:在下面这个函数中,kw 参数和上面的 *args 还多了一个 * ,总共两个 ** ,这个意思是 kw 是一个可变关键字参数,可以接收任意个数的带参数名的参数。

>>> def demo_func(**kw):  
...     print(kw)  
...   
>>> demo_func(a=10, b=20, c=30)  
{'a': 10, 'b': 20, 'c': 30}  

案例六:在定义时,必选参数一定要在可选参数的前面,不然运行时会报错

>>> def demo_func(a=1, b):  
...     print(a, b)  
...   File "<stdin>", line 1  
SyntaxError: non-default argument follows default argument  
>>>  
>>> def demo_func(a, b=1):  
...     print(a, b)  
...   
>>>  

案例七:在定义时,可变位置参数一定要在可变关键字参数前面,不然运行时也会报错

>>> def demo_func(**kw, *args):  File "<stdin>", line 1  def demo_func(**kw, *args):  ^  
SyntaxError: invalid syntax  
>>>   
>>> def demo_func(*args, **kw):  
...     print(args, kw)  
...   
>>> 

案例八:可变位置参数可以放在必选参数前面,但是在调用时,必选参数必须要指定参数名来传入,否则会报错

>>> def demo_func(*args, b):  
...     print(args)  
...     print(b)  
...   
>>> demo_func(1, 2, 100)  
Traceback (most recent call last):  File "<stdin>", line 1, in <module>  
TypeError: demo_func() missing 1 required keyword-only argument: 'b'  
>>>   
>>> demo_func(1, 2, b=100)  
(1, 2)  
100  

案例九:可变关键字参数则不一样,可变关键字参数一定得放在最后,下面三个示例中,不管关键字参数后面接位置参数,还是默认参数,还是可变参数,都会报错。

>>> def demo_func(**kw, a):  File "<stdin>", line 1  def demo_func(**kw, a):  ^  
SyntaxError: invalid syntax  
>>>   
>>> def demo_func(**kw, a=1):  File "<stdin>", line 1  def demo_func(**kw, a=1):  ^  
SyntaxError: invalid syntax  
>>>   
>>> def demo_func(**kw, *args):  File "<stdin>", line 1  def demo_func(**kw, *args):  ^  
SyntaxError: invalid syntax  

案例十:将上面的知识点串起来,四种参数类型可以在一个函数中出现,但一定要注意顺序

def demo_func(arg1, arg2=10, *args, **kw):  print("arg1: ", arg1)  print("arg2: ", arg2)  print("args: ", args)  print("kw: ", kw)  

试着调用这个函数,输出如下:

>>> demo_func(1,12, 100, 200, d=1000, e=2000)  
arg1:  1  
arg2:  12  
args:  (100, 200)  
kw:  {'d': 1000, 'e': 2000}  

案例十一:使用单独的 *,当你在给后面的位置参数传递时,对你传参的方式有严格要求,你在传参时必须要以关键字参数的方式传参数,要写参数名,不然会报错。

>>> def demo_func(a, b, *, c):  
...     print(a)  
...     print(b)  
...     print(c)  
...   
>>>   
>>> demo_func(1, 2, 3)  
Traceback (most recent call last):  File "<stdin>", line 1, in <module>  
TypeError: demo_func() takes 2 positional arguments but 3 were given  
>>>   
>>> demo_func(1, 2, c=3)  
1  
2  
3  

3. 传参的坑

函数参数传递的是实际对象的内存地址。如果参数是引用类型的数据类型(列表、字典等),在函数内部修改后,就算没有把修改后的值返回回去,外面的值其实也已经发生了变化。

>>> def add_item(item, source_list):  
...     source_list.append(item)  
...  
>>> alist = [0,1]  
>>> add_item(2, alist)  
>>> alist  
[0, 1, 2]  

相关文章:

11个案例讲透 Python 函数参数

大家好&#xff0c;今天给大家分享一下明哥整理的一篇 Python 参数的内容&#xff0c;内容非常的干&#xff0c;全文通过案例的形式来理解知识点&#xff0c;自认为比网上 80% 的文章讲的都要明白&#xff0c;如果你是入门不久的 python 新手&#xff0c;相信本篇文章应该对你会…...

《分布式技术原理与算法解析》学习笔记Day21

分布式数据存储三要素 什么是分布式数据存储系统&#xff1f; 分布式存储系统的核心逻辑&#xff0c;就是将用户需要存储的数据根据某种规则存储到不同的机器上&#xff0c;当用户想要获取指定数据时&#xff0c;再按照规则到存储数据的机器中获取。 分布式存储系统的三要素…...

开源shell脚本系列-检查etcd集群可用性

图好看不&#xff1f;AI生成的&#xff0c;这几天也在测试AI绘图这个东东&#xff0c;挺牛叉的。咱们的社区工具平台在PC的web端已经完成了。大家没事可以去看看&#xff0c;设置个主页也行其实挺好的&#xff1a;https://www.98dev.com/index&#xff0c;主要用于一些关键性新…...

资源限制类题目七大技巧 解决所有大数据资源限制类问题

有一个无符号整数的文件&#xff0c;数据个数有40亿个&#xff0c;如何通过1G的内存返回出现次数最多的数 1. 对每个数调用哈希函数得到哈希值&#xff0c;将哈希值模上100&#xff0c;进行小文件分类&#xff08;相同的数一定在同一文件&#xff09; 2. 将每个小文件内出现次…...

adb命令导出手机已安装的android应用apk文件

adb命令导出手机已安装的android应用apk文件&#xff0c;保存到PC电脑 前提条件是手机已经和PC电脑可以通过adb建立连接。 &#xff08;1&#xff09;通过adb shell命令获取当前手机所有已经安装的应用包名&#xff1a; adb shell pm list package &#xff08;2&#xff09…...

华为CT6100双千M路由记录

该文章仅仅记录使用CT6100的流程&#xff0c;不提供任何参考和建议。 一、简介 设备&#xff1a;华为CT6100瘦客服端&#xff0c;J1800cpu&#xff0c;不包含外壳&#xff0c;有双千M网口&#xff0c;2G内存8G硬盘。系统&#xff1a;esir的高大全openwrt版本用途&#xff1a;对…...

【AcWing-Python-785】快速排序

题目&#xff1a;https://www.acwing.com/problem/content/description/787/对应视频讲解&#xff1a;https://www.acwing.com/video/227/题目描述注意本题数据已加强。快速排序过程中&#xff0c;如果每次取区间起点或者终点作为分界点&#xff0c;则会超时。分界点换成随机值…...

从 JDK 8 到 JDK 18,Java 垃圾回收的十次进化

经历了数千次改进&#xff0c;Java 的垃圾回收在吞吐量、延迟和内存大小方面有了巨大的进步。 2014 年3 月 JDK 8 发布&#xff0c;自那以来 JDK 又连续发布了许多版本&#xff0c;直到今日的 JDK 18 是 Java 的第十个版本。借此机会&#xff0c;我们来回顾一下 HotSpot JVM 的…...

虚拟机VMware Workstation Pro环境搭建

VMware Workstation Pro是一款虚拟化工具&#xff0c;允许用户在Windows PC上运行多个操作系统。这个平台提供一个安全和独立的环境&#xff0c;让用户在使用前&#xff0c;可以建立和测试应用程序、检查修补程序&#xff0c;以及尝试不同的操作系统。它附有虚拟机库 它允许用户…...

【华为OD机试模拟题】用 C++ 实现 - 敏感字段加密(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

关于Java方法重写的一些反思

最近在开发中遇到一个关于Java方法重写的一些问题&#xff0c;对于方法重写的用法以及可能导致的问题产生了一些思考&#xff0c;本文用于记录下这些想法。 问题场景 我们首先来看两段代码&#xff1a; Override protected void onActivityResult(int requestCode, int resu…...

【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.文件操作1.1 概述…...

图形编辑器:拖拽阻塞优化

大家好&#xff0c;我是前端西瓜哥。在图形编辑器中&#xff0c;想象这么一个场景&#xff0c;我们撤销了一些重要的操作&#xff0c;然后想选中一个图形&#xff0c;看看它的属性。你点了上去&#xff0c;然后你发现你再也无法重做了。 你以为你点了一下&#xff0c;但其实你…...

c++ 的 Eigen库写 AX=XB的矩阵求解代码

1.AXXB的矩阵求解代码(3*3) #include <iostream> #include <Eigen/Dense>int main() {// 定义矩阵A和BEigen::MatrixXd A(3, 3);A << 1, 2, 3,4, 5, 6,7, 8, 9;Eigen::MatrixXd B(3, 3);B << 10, 11, 12,13, 14, 15,16, 17, 18;// 求解AXXBEigen::Mat…...

正点原子linux驱动篇

linux驱动开发与裸机开发的区别 裸机直接操作寄存器&#xff0c;有些mcu提供了库&#xff0c;但还是很底层 1、linux驱动开发直接操作寄存器很麻烦不现实&#xff0c;主要是根据linux驱动框架进行开发&#xff08;就是有很多操作都是一样的&#xff0c;我们只需要对一个程序模…...

MATLAB绘制雷达图/蜘蛛图

雷达图/蜘蛛图 1 方法一 函数来源为MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图) 1.1 调用函数 1.2 案例 2 方法二 函数来源为MATLAB帮助-spider_plot 2.1 调用函数 语法&#xff08;Syntax&#xff09;&#xff1a; spider_plot(P)spider_plot(P, Name, Value, ...)h …...

算法入门,十字路口选择的案例,如果是南方,则向前行

从if判断start; 十字路口的案例 class HelloWorld { static void Main(string[] args) { /* Write C# code in this online editor and run it. */ Console.WriteLine("Hello World!"); string f…...

父传子与子传父步骤

父传子&#xff1a; 问题&#xff1a;父页面中引入子组件 把想要传给子页面的值用在子组件中用 &#xff1a;值“值” (用同一个值好区分)来绑定。 在子页面中用props接收 子组件不能改变父组件传过来的值。&#xff08;传多个页面的时候是&#xff0c;比如父传孙的时候我会…...

Java concurrency - Task Execution

1.在单个线程里处理所有的请求&#xff1a;接受请求-处理请求 优点&#xff1a;逻辑简单 缺点&#xff1a;吞吐量低&#xff0c;资源利用率低&#xff0c;响应时间长 2.每个任务分配一个单独的线程来处理&#xff1a; 接受请求-创建线程-在线程里处理请求 优点&#xff1a; …...

浅谈BOM

什么是BOM BOM对于每个前端都不陌生&#xff0c;但是很多人都停留在表面&#xff0c;而没有深层次的研究过它。JavaScript有一个非常重要的运行环境就是浏览器&#xff0c;而且浏览器本身又作为一个应用程序需要对其本身进行操作&#xff0c;所以通常浏览器会有对应的对象模型…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...