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

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.lryc.cn/news/574287.html

相关文章:

  • Robyn高性能Web框架系列04:事件、中间件与错误处理
  • 前端跨域解决方案(7):Node中间件
  • 2025年CCF先进音频技术竞赛
  • Node鼠标键盘屏幕控制
  • 【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程
  • Perl语言基础
  • Windows环境Browser-Use平台部署与AI自动化远程访问实现过程
  • Java面试题027:一文深入了解数据库Redis(3)
  • Arrays.asList和 List<String> list = new ArrayList<>();有什么区别
  • C++11的内容
  • 智能生成分析报告系统在危化安全生产监测预警评估中的应用
  • NoSQL 之 Redis 配置与优化
  • 【科技公司的管理】
  • 深度解析 Caffeine:高性能 Java 缓存库
  • ​​MQTT​​通讯:​​物联网
  • 爬虫003----requests库
  • UP COIN:从 Meme 共识走向公链与 RWA 的多元生态引擎
  • VLN论文复现——VLFM(ICRA最佳论文)
  • 如何快速判断Excel文档是否被修改过?Excel多版本比对解决方案
  • 睿是信息携手Arctera,深化服务中国市场,共筑数据管理新未来
  • css元素超过两行隐藏并显示省略号全网独一份
  • 2025年CSS最新高频面试题及核心解析
  • ADIOS2 介绍与使用指南
  • 后台发热、掉电严重?iOS 应用性能问题实战分析全过程
  • 【数据结构初阶】--顺序表(一)
  • 【go的测试】单测之gomock包与gomonkey包
  • 板凳-------Mysql cookbook学习 (十--9)
  • K8S: etcdserver: too many requests
  • Halcon ——— OCR字符提取与多类型识别技术详解
  • Java 程序设计试题​