pyhton基础【15】函数进阶一

目录

一. 函数进阶

1. 默认参数: 

2. 关键字参数: 

3. 可变参数: 

4. 装饰器: 

5. 匿名函数lambda:

6. 高阶函数:

7. 递归函数: 

8. 类型注解: 

二.函数参数的高级使用

缺省参数

命名参数

不定长参数

三.返回值拆包


一. 函数进阶

Python函数的进阶使用包含多个重要的知识点,这些知识点可以帮助开发人员编写更为高效、灵活且强大的代码。以下是一些关键的进阶概念:

1. 默认参数: 
  • 函数可以定义默认参数,让函数调用时某些参数可选。这提高了函数的可用性和灵活性。
  • 默认参数值通过在函数定义时赋值给参数实现。
2. 关键字参数: 
  • 函数调用时可以通过键=值的形式指定参数,这样参数的顺序就不重要了。
  • 关键字参数增加了代码的可读性。
3. 可变参数: 
  • 使用星号*args允许函数接受任意数量的位置参数。
  • 使用双星号**kwargs允许函数接受任意数量的关键字参数。
  •  这使得函数能够处理不确定数量的输入参数。
4. 装饰器: 
  • 装饰器是一种特殊的函数,用于修改另一个函数的行为,而不需要改动其代码。
  • 通过在函数之前添加@decorator_name来应用装饰器。
  • 常用于日志记录、性能测试、事务处理等场景。
5. 匿名函数lambda:
  • 通过lambda关键字创建匿名函数,通常用于短小的函数定义。
  • lambda函数可以接受任意数量的参数,但仅能有一个表达式。
  •  一般与高阶函数(如filter、map、reduce)一同使用。
6. 高阶函数:
  • 高阶函数是将函数作为参数或返回值的函数。
  • 常见的高阶函数包括map(), filter(), reduce()等。
  • 这些函数通常用于数据处理和函数式编程。
7. 递归函数: 
  • 函数可以调用自身,这称为递归。
  • 递归通常用于解决可以分解为相同问题的小规模问题的场景,如遍历目录、解析嵌套数据等。
  • 需要谨慎使用递归以避免无限递归和栈溢出的问题。
8. 类型注解: 
  • 从Python 3.5开始,可以通过类型注解来指定函数的参数和返回值类型。
  • 类型注解不影响Python的动态类型特性,主要用于代码提示和静态类型检查。

这些进阶知识点帮助开发者更好地理解和利用Python中的函数,从而编写出更加简洁、高效和健壮的代码。了解并掌握这些概念对于成为高级Python程序员至关重要

二.函数参数的高级使用
缺省参数

引入

缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据。

示例:

def print_info(name, age=35):print(f'name: {name}')print(f'age: {age}')print_info('小明')
print_info('小明', 18)

缺省参数的作用

当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数

例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么xxx学校就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则会让人混淆。

示例:

def print_info(name, class_name, grade, department_name, school_name="清华大学"):print("老师好:我是来自 %s(大学) %s系 %s年级 %s班级 的学生,我叫%s" % (school_name,department_name,grade,class_name,name))print_info("小明", "爬虫", "二", "软件工程")
print_info("小明", "爬虫", "二", "软件工程", "北京大学")

注意点

  • 缺省参数只能在形参的最后(即最后侧)
  • 缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)
>>> def printinfo(name, age=35, sex):
...     print(name)
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
命名参数

引入

命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数

示例:

def test(a, b):print('-----')print(f'a={a}')print(f'b={b}')test(11, 22)
test(a=11, b=22)
test(a=22, b=11)  # 根据名称将值传入到指定的变量中

命名参数的作用

命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据

注意点

  • 命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做num,而形参中没有变量num
  • 如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数
def test(a, b, c=100, d=200):print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)# 下面的方式都失败
test(c=1, d=2)  # 缺少a、b的值
test(c=1, d=2, 11, 22)  # 11, 22应该在左侧
不定长参数

引入

不定长参数:定义函数的时候形参不确定到底有多少个,这样的参数就叫做不定长参数

不定长参数有两种方式表示:

  • *args :表示调用函数时多余的未命名参数都会以元组的方式存储到args中
  • **kwargs:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs中

注意:

  • *和**是必须要写的,否则就变成了普通的形参了
  • 当我们说不定长参数的时候,就是指*args和**kwargs

示例:

def test(a, b, *args, **kwargs):print(a, type(a))print(b, type(b))print(args, type(args))print(kwargs, type(kwargs))test(11, 22, 33, 44, 55, 66, name='小明', address='兰州')

不定长参数的作用

通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求

注意点

  • 加了星号*的变量args会存放所有未命名的变量参数,args为元组
  • 而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典
  • 一般情况下*args、**kwargs会在形参的最右侧
  • args与kwargs的名字可以变,例如叫*aa,**bb都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改

特殊情况

缺省参数在*args的后面

def sum_nums_3(a, *args, b=22, c=33, **kwargs):print(a)print(b)print(c)print(args)print(kwargs)sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)输出结果:100
1
2
(200, 300, 400, 500, 600, 700)
{'mm': 800, 'nn': 900}

说明:

  • *args后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
  • 如果有**kwargs的话,**kwargs必须是最后的
三.返回值拆包

返回值拆包概述

函数返回值拆包:如果一个函数通过return返回了一个元组、列表、集合,可以通过拆包的方式将返回值进行拆分到每个变量中,这就是返回值拆包。

示例:

def test():return 11, 22, 33a, b, c = test()
print(a, b, c)

返回值拆包的作用

通过函数返回值拆包,可以快速的将具体的数据用变量进行存储,这样对数据的处理会更加方便

示例:

def test():return 11, 22, 33# 通过返回值拆包,快速使用每个数据
a, b, c = test()
print(a + b + c)# 没有通过返回值拆包,这样用数据时稍微复杂
ret = test()
print(ret[0] + ret[1] + ret[2])

拆包的使用

def get_my_info():high = 178weight = 100age = 18return high, weight, age# result = get_my_info()
# print(result)# 通过返回值拆包,能够更加方便的对每个数据使用
my_high, my_weight, my_age = get_my_info()
print(my_high)
print(my_weight)
print(my_age)

使用拆包时的注意点

  • 拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常

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

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

相关文章

【软考高级系统架构论文】论企业应用系统的数据持久层架构设计

论文真题 数据持久层 (Data Persistence Layer) 通常位于企业应用系统的业务逻辑层和数据源层之间,为整个项目提供一个高层、统一、安全、并发的数据持久机制,完成对各种数据进行持久化的编程工作,并为系统业务逻辑层提供服务。它能够使程序员避免手工编写访问数据源的方法…

ubuntu使用 Conda 安装 pyseer详细教程

pyseer 是一个用于 微生物全基因组关联分析(GWAS) 的生物信息学工具。它可以帮助研究者识别微生物(如细菌)中与表型(如耐药性、毒力、致病性)相关的遗传变异。 一、安装mamba conda install -n base -c conda-forge mamba二、创建虚拟环境 conda create -n pyseer-env …

Redis04

redis 一、redis的作用和使用场景 redis是一个内存级的高速缓存数据库。&#xff08;对比磁盘IO&#xff09; 使用场景&#xff1a;1、并发访问量大的 2、数据量小 3、修改不频繁 项目中&#xff1a;1、验证码 2、登录成功用户信息 3、首页&#xff08;模块数据 轮播图&…

计算机网络学习笔记:TCP可靠传输实现、超时重传时间选择

文章目录 一、TCP可靠传输实现二、TCP超时重传时间选择 一、TCP可靠传输实现 TCP可靠传输的实现&#xff0c;主要基于发送方和接收方的滑动窗口&#xff0c;以及确认机制&#xff1a; 发送方在未收到确认&#xff08;ACK&#xff09;前&#xff0c;可以将序号落在发送窗口内的…

Perl 正则表达式

Perl 正则表达式 引言 Perl 正则表达式&#xff08;Regular Expressions&#xff09;是Perl编程语言中一个强大且灵活的工具&#xff0c;用于字符串处理和模式匹配。正则表达式在文本处理、数据验证、搜索和替换等任务中发挥着至关重要的作用。本文将深入探讨Perl正则表达式的…

Security: RSA: 1024 bit 长度已经变得不安全了

文章目录 参考推荐限制RHEL相关配置man crypto-policies包含的应用使用方法是配置文件include参考 https://csrc.nist.gov/pubs/sp/800/57/pt1/r2/final https://www.linuxquestions.org/questions/linux-security-4/1024-bit-dsa-vs-2048-bit-rsa-4175439131/ https://csrc.n…

第一课:大白话中的机器学习

各位看官好啊!今天咱们来聊一个听起来高大上但实际上特别接地气的玩意儿——机器学习。别被这名字吓到,它其实就是教电脑像人类一样学习知识的一套方法。想象一下你教你家狗子坐下、握手的过程,机器学习差不多就是这么回事,只不过"学生"换成了电脑。 一、啥是机…

实现 el-table 中键盘方向键导航功能vue2+vue3(类似 Excel)

实现 el-table 中键盘方向键导航功能vue2vue3&#xff08;类似 Excel&#xff09; 功能需求 在 Element UI 的 el-table 表格中实现以下功能&#xff1a; 使用键盘上下左右键在可编辑的 el-input/el-select 之间移动焦点焦点移动时自动定位到对应单元格支持光标位置自动调整…

MyBatis:从入门到进阶

&#x1f4cc; 摘要 在 Java 后端开发中&#xff0c;MyBatis 是一个非常流行且灵活的持久层框架。它不像 Hibernate 那样完全封装 SQL&#xff0c;而是提供了对 SQL 的精细控制能力&#xff0c;同时又具备 ORM&#xff08;对象关系映射&#xff09;的功能。 本文将带你从 MyB…

leetcode51.N皇后:回溯算法与冲突检测的核心逻辑

一、题目深度解析与N皇后问题本质 题目描述 n皇后问题研究的是如何将n个皇后放置在nn的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。给定一个整数n&#xff0c;返回所有不同的n皇后问题的解决方案。每一种解法包含一个明确的n皇后问题的棋子放置方案&#xff0c;该方…

算法-每日一题(DAY9)杨辉三角

1.题目链接&#xff1a; 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRo…

【MATLAB代码】制导方法介绍与例程——追踪法,适用于二维平面,目标是移动的|附完整源代码

追踪法(追踪导引法)是一种常见的导弹导引方式,其基本原理是保持导弹的速度矢量始终指向目标。在追踪法中,导弹的加速度可以表示为指向目标的加速度。 本文给出二维平面下,移动目标的追踪法导引的介绍、公式与matlab例程 订阅专栏后,可以直接查看完整源代码 文章目录 运行…

小白的进阶之路系列之十八----人工智能从初步到精通pytorch综合运用的讲解第十一部分

从零开始的NLP:使用序列到序列网络和注意力机制进行翻译 我们将编写自己的类和函数来预处理数据以完成我们的 NLP 建模任务。 在这个项目中,我们将训练一个神经网络将法语翻译成英语。 [KEY: > input, = target, < output]> il est en train de peindre un table…

SSL安全证书:数字时代的网络安全基石

SSL安全证书&#xff1a;数字时代的网络安全基石 在当今数字化浪潮中&#xff0c;网络通信安全已成为个人、企业和组织不可忽视的核心议题。SSL&#xff08;Secure Sockets Layer&#xff0c;安全套接层&#xff09;安全证书作为保障数据传输安全的关键技术&#xff0c;通过加…

LLM-201: OpenHands与LLM交互链路分析

一、核心交互链路架构 #mermaid-svg-ZBqCSQk1PPDkIXNx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-icon{fill:#552222;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-text{fill:#552222;strok…

【项目】仿muduo库one thread one loop式并发服务器SERVER模块(下)

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 |&#x1f5c3;️ mysql 项目文章&#xff1a; 仿muduo库one thread one loop式并发服务器…

数据库索引结构 B 树、B + 树与哈希索引在不同数据查询场景下的适用性分析

一、数据库索引结构B树 树概述 树是一种多路平衡查找树&#xff0c;广泛应用于数据库和文件系统中。B树的节点可以存储多个数据元素&#xff0c;并且保持树的平衡&#xff0c;以提高查询效率。 适用性分析 在数据量较大&#xff0c;范围查找较多的场景下&#xff0c;B树的查询效…

Linux进程间通信——信号

1.信号的介绍 信号( Signal )是 Unix, 类Unix以及其他POSIX兼容的操作系统中进程间通信的一种有限制的手段。 1&#xff09;信号是在软件层面上对中断机制的一种模拟&#xff0c;是一种异步通信方式。2&#xff09;信号可以直接进行用户空间进程和内核进程之间的交互&#xff…

Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)

ByteMD Markdown编辑器详细解释&修改编辑器默认样式&#xff08;高度300px) AST树详解 [ByteMD 插件系统详解(https://blog.csdn.net/m0_55049655/article/details/148811248?spm1001.2014.3001.5501) Sevelet编写的Bytemd如何适配到React中 ⚡️1️⃣ 背景概述 Byte…

《Redis》事务

文章目录 Redis中的原子性Redis的事物和MySQL事务的区别Redis实现事务什么场景下&#xff0c;会使用事务? Redis事务相关命令watch命令的实现原理 总结 Redis中的原子性 Redis的原子性不同于MySQL的原子性。 Redis的事物和MySQL事务的区别 但是注意体会Redis的事务和MySQL…