Day15笔记-函数返回值函数的封装匿名函数

一、函数基础【重点掌握】

1.关键字参数和不定长参数
# 1.关键字参数
# 注意:默认参数主要体现在函数的定义中【声明】,关键字参数主要体现在函数的调用中
def func1(a,b,c):print('11111',a,b,c)
# 必须参数的缺点:必须按照顺序传参,否则可能会匹配不上
func1(10,20,30)
# 关键字的优点:可以不按照形参的顺序传参。根据关键字就可以识别,关键字一定要和形参保持一致
func1(b=20,c=30,a=10)
func1(10,20,c=30)
​
# 默认参数和关键字参数常用于系统函数
print(45,67,7)  # 默认参数sep
print(34,7,23,sep='=')
list1 = [23,5,5]
list1.sort(reverse=True)
​
print("*" * 30)
​
# 2.不定长参数/可变参数
# a.*x:x会被当作元组处理
def f1(*n):print(n,type(n))  # <class 'tuple'>
# 在调用函数的时候,不定长参数可以处理任意数量的参数
f1()   # ()
f1(10)
f1('abc')   # ('abc',)
f1(34,56,8,9,34,6,7,'faf','fag',True)  # (34, 56, 8, 9, 34, 6, 7, 'faf', 'fag', True)
​
# 练习:求任意多个数字的和
def get_total(*n):total = sum(n)print(total)
get_total(34,6,87)
get_total(2,6,8,90)
​
# b.**x:x会被当作字典处理
def f2(**n):print(n,type(n))   # <class 'dict'>for k,v in n.items():print(k,v)
​
f2()   # {}
# 在调用函数的过程中,给**x进行传参,要按照key=value的形式传参,而且key必须是以变量的形式存在,最终该变量会被识别为字符串
f2(x=10,y=20,z=30)  # {'x': 10, 'y': 20, 'z': 30}
​
# c.
# 注意:在同一个函数中,*只能出现一次,**也只能出现一次
# 错误写法
# def f3(*n1,*n2):
#     print(n1,n2)
# def f3(**n1,**n2):
#     print(n1,n2)
# *和**可以同时出现
def f3(*n1,**n2):print(n1,n2)
f3()
f3(435,6,67)
f3(a=45,b=123)
f3(34,6,7,8,name='张三',age=18)
​
# 如果*和**同时出现,经常会使用*args,**kwargs
def f3(*args,**kwargs):pass
2.值传递和引用传递

【面试题】简述值传递和引用传递的区别值传递:传参的时候,传递的是不可变的数据类型,如:int/float/str/tuple/bool,当形参发生修改【修改的是变量的指向】,对实参没有影响引用传递:传参的时候,传递的是可变的数据类型,如:list/dict/set等,当形参中的元素发生修改【修改列表,字典等可变数据类型中的元素】,则实参会随着修改

# 1.值传递
def f1(n):  # 形参n = 'abc'   # 重新赋值
​
# 实参
a1 = (234,5,7)
f1(a1)
print(a1)
​
# 2.引用传递
def f2(n):  # 形参n[0] = 100  # 修改其中的元素
​
# 实参
a2 = [234,5,7]
f2(a2)    # n = a2,引用赋值
print(a2)   # [100, 5, 7]
# 实参是可变的数据类型,在函数内部对该数据内部的元素进行修改,想要对实参没有影响的话,则需要拷贝
3.返回值
def xxx(形参):函数体【某个特殊的功能】return 返回值

返回值:表示函数的运算结果,在哪里调用函数,返回值就返回到哪里

# 所谓函数的返回值,本质上是return的使用,return只能使用在函数中
​
# 1.一个函数没有设置返回值,默认返回None
def f1():print('11111')
r1 = f1()
print(r1)   # None
​
# 2.return可以单独作为一条语句,表示结束函数,所以在return的后面且和return对齐的情况下,不书写任何语句
# a
def f2():print('2222')return# print('over')    # 永远没有机会执行# print('over')# print('over')
f2()
​
# b.书写在return的后面但是和return没有对齐的语句,有执行的可能性,但是,一旦return被执行了,则后面的语句全都没有执行的机会,哪怕书写在循环中
def f2(n):print('222222')if n:print('yes')else:print('no')returnprint('over')       # 可能会执行
f2(0)
​
# 3.break/return/exit()三者的区别    *****
# a.break:结束当前循环
def f3():print('start~~~~~')for n in range(5):for m in range(3):if n == 2:breakprint(n,m)print('end~~~~~~~')
f3()
print('over~~~~')
​
print('*' * 50)
​
# b.retutn:结束当前函数
def f3():print('start~~~~~')for n in range(5):for m in range(3):if n == 2:returnprint(n,m)print('end~~~~~~~')
f3()
print('over~~~~')
​
print('*' * 50)
​
# 扩展c.exit(): 结束程序
def f3():print('start~~~~~')for n in range(5):for m in range(3):if n == 2:exit()print(n,m)print('end~~~~~~~')
f3()
print('over~~~~')
4.函数的封装
def xxx(形参):函数体【某个特殊的功能】return 返回值

封装函数:1.是否需要设置形参:查看需求中是否有未知项参与运算【数量】2.是否需要设置返回值:查看需求运算完毕之后是否有结果

# 1.需求:打印10遍九九乘法表
# 2.需求:打印指定行数的九九乘法表
# 3.需求:判断一个数是否是偶数
# 4.封装一个函数 验证一个年是否是闰年
# 5.封装一个函数 获取指定月的天数
# 6.封装一个函数,获取多个数中的最大值和平均值
​
# 1.需求:打印10遍九九乘法表
def print_mul():for row in range(1,10):for col in range(1,row + 1):print(f'{col}*{row}={row * col}',end=' ')print()
for _ in range(10):print_mul()
​
# 2.需求:打印指定行数的九九乘法表
def print_mul(n):for row in range(1,n + 1):for col in range(1,row + 1):print(f'{col}*{row}={row * col}',end=' ')print()
print_mul(6)
print_mul(3)
​
# 3.需求:判断一个数是否是偶数
# 注意:当封装函数的时候,但凡涉及到判断的,最终的结果返回布尔值,同时,在封装函数的过程中,尽量不要使用print
def is_even(num):# if num % 2 == 0:#     return True# else:#     return False
​# 推荐if num % 2 == 0:return Truereturn False
​# 不推荐# return num % 2 == 0
​
print(is_even(10))
print(is_even(17))
​
# 4.封装一个函数 验证一个年是否是闰年
def is_leapyear(year):if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):return Truereturn False
print(is_leapyear(2024))
​
# 5.封装一个函数 获取指定月的天数
def days(year,month):if month in [1,3,5,7,8,10,12]:return 31elif month in [4,6,9,11]:return 30else:if is_leapyear(year):   # 判断year是否是闰年,返回布尔值,布尔值可以作为if的条件return 29return 28
print(days(2024,2))
print(days(2024,1))
​
# 6.封装一个函数,获取多个数中的最大值和平均值
# 注意:return xx:只返回一个数据
# return xx,xx,xx:返回多个数据,最终会被处理为元组
def get_num(*num):max_num = max(num)avg_num = sum(num) / len(num)return max_num,avg_num
r = get_num(34,6,7,89,9,1,4,5,7)
print(r)

二、函数进阶

1.匿名函数【重点掌握】

概念:不再使用def这种标准形式定义函数,而是使用lambda表达式来创建函数,该函数没有函数名,被称为匿名函数

语法:lambda 形参列表:返回值

说明:

​ a.lambda只是一个表达式,用一行代码实现一个简单的逻辑,可以达到对函数的简化【优点】

​ b.lambda主体是一个表达式,而不是一个代码块,只能封装有限的逻辑【缺点】

​ c.lambda拥有自己的命名空间,不能访问自有列表之外或者全局命名空间里的参数

# 1.
# 标准函数的定义
def f1(n):print('函数被调用了~~~')return n + 1
print(f1)   # <function f1 at 0x00000228F1D7F040>
r1 = f1(6)  # 函数的调用
print(r1)   # 函数的返回值
​
# 匿名函数/lambda表达式,语法:lambda  形参列表:返回值
f2 = lambda n: n + 1
print(f2)   # <function <lambda> at 0x000002860924C3A0>
r2 = f2(8)  # 调用函数
print(r2)   # 函数的返回值
​
# 2.注意:在匿名函数中,返回值涉及到判断,可以借助于三目运算符实现
def is_even(num):if num % 2 == 0:return Truereturn False
r21 = is_even(10)
print(r21)
​
is_even2 = lambda  num: True if num % 2 == 0 else False
r22 = is_even2(13)
print(r22)
​
# 3.在匿名函数中,同样可以使用默认参数,关键字参数和不定长参数
f31 = lambda x,y=0:x ** 2 + y ** 2
print(f31(2))
print(f31(2,3))
print(f31(x=4,y=5))
​
f32 = lambda *x:sum(x)
print(f32(34,65,7,8))
​
f33 = lambda **x:x['a']
print(f33(a=23,b=45,c=67))
​
# 4.匿名函数定义完之后可以直接调用
print((lambda *x:sum(x))(456,7,8,9))
​
# 使用场景:匿名函数常用于作为其他函数的参数使用,max()/sort()/高阶函数
​
# 思考题【面试题】
def func():lst = []for x in range(5):lst.append(lambda n:x * n)return lst
r = func()
# 下面代码输出的结果,并说明原因
print(r[0](2))
print(r[1](2))
print(r[2](2))
print(r[3](2))
print(r[4](2))

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

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

相关文章

InternVL2-JSON 格式和JSONL 格式区别

LLaVA 1.5 使用的是 JSON 格式&#xff0c;而您提到的另一种格式使用的是 JSONL。这两种格式的主要区别在于它们的结构和数据表示方式。 JSON 格式 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff…

【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析以及计算机网络的分类

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析电路交换性能分析报文交换性能分析…

C/C++:优选算法

一、双指针 1.1移动零 链接&#xff1a;283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操…

Spring Boot 杂谈

Springboot入门到精通&#xff08;超详细文档&#xff09;_springboot文档-CSDN博客

Object.entries()

Object.entries() 返回一个给定对象自身可枚举属性的 [key, value] 对的形式的数组。这个方法使得获取对象的键值对变得非常方便&#xff0c;尤其是在需要迭代这些键值对的时候。 语法 Object.entries(obj)参数 obj: 需要被转换的对象。 返回值 一个由给定对象自身的可枚举…

[001-03-007].第07节:Redis中的事务

我的后端学习大纲 我的Redis学习大纲 1、Redis事务是什么&#xff1a; 1.可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c; 按顺序地串行化执行而不会被其他命令插入&#xff0c;不许加塞2.一个队列中&#xff0c;一次性、…

硕士该去算法岗还是开发岗?

最近很多学弟问我这个问题&#xff0c;他是某985硕士&#xff0c;想去算法&#xff0c;但是又没有很好的论文和实习。走开发又不甘心自己堂堂985硕士去做开发&#xff0c;那岂不是就是和本科大专一样了。 这里我说一下我对算法岗和开发岗的理解。 算法岗 首先说算法岗&#x…

PLSQL-将一份excel数据导入到一张物理表(Oracle)

–>> 很简单~ 平时用惯了DBeaver&#xff0c;突然要用PLSQL Developer&#xff0c;确实很生疏。 –>> 我的场景&#xff0c;将一份.csv文件数据手动导入到Oracle下的一张物理表中去。 研究了半天&#xff0c;看网上说的可以用&#xff1a;Tools → ODBC Importer &…

WPF 手撸插件 八 依赖注入

本文内容大量参考了&#xff1a;https://www.cnblogs.com/Chary/p/11351457.html 而且这篇文章总结的非常好。 1、注意想使用Autofac&#xff0c;Autofac是一个轻量级、‌高性能的依赖注入&#xff08;‌DI&#xff09;‌框架&#xff0c;‌主要用于.NET应用程序的组件解耦和…

被低估的SQL

SQL是现代数据库管理系统中不可或缺的一部分。尽管它的使用已十分普遍&#xff0c;但在数据处理领域&#xff0c;SQL的某些功能和潜力仍然被许多人低估。接下来&#xff0c;小编将与您一起&#xff0c;探讨SQL的一些被忽视的特性&#xff0c;揭示它在数据管理中的真正实力。 1.…

红海云 × 滨湖国控集团 | 数智引领集团型国企人力资源数字化变革

合肥滨湖国有资本运营控股集团有限公司&#xff08;以下简称“滨湖国控集团”&#xff09;为合肥市包河区区属一级国企。滨湖国控集团作为安徽省市辖行政区中首个获得AA主体信用评级的区属国企&#xff0c;紧扣“三区”定位&#xff0c;聚焦“三位”追求 &#xff0c;积极构筑金…

Python OpenCV精讲系列 - 高级图像处理技术(五)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

使用 Elastic 和 LM Studio 的 Herding Llama 3.1

作者&#xff1a;来自 Elastic Charles Davison, Julian Khalifa 最新的 LM Studio 0.3 更新使 Elastic 的安全 AI Assistant 能够更轻松、更快速地与 LM Studio 托管模型一起运行。在这篇博客中&#xff0c;Elastic 和 LM Studio 团队将向你展示如何在几分钟内开始使用。如果你…

监控易监测对象及指标之:全面监控MySQL数据库

随着企业信息化建设的不断深入&#xff0c;数据库作为核心数据资产的管理中心&#xff0c;其性能和稳定性直接关系到业务的连续性和企业的运营效率。MySQL作为广泛使用的开源关系型数据库管理系统&#xff0c;其稳定性和性能对于保障业务连续性至关重要。 为了确保MySQL数据库的…

【UE5 C++课程系列笔记】02——创建C++类的三种方式

目录 一、从UE编辑器中创建 引用头文件报错的两种解决方式 &#xff08;1&#xff09;方式1 &#xff08;2&#xff09;方式2 二、在文件夹中直接创建 三、在Visual Studio中创建 一、从UE编辑器中创建 在UE编辑器中选择“Tools-》New C Class” 这里新建的类的父类选择…

解锁阿尔茨海默病(AD)靶点密码,开启靶向治疗新篇章

前 言&#xff1a; 阿尔茨海默病&#xff08;AD&#xff09;是一种严重的神经退行性疾病&#xff0c;多发于高龄人群&#xff0c;主要表现为记忆、思维、分析判断、视空间辨认、情绪等障碍。从实验室到临床应用的过程充满挑战。阿尔茨海默症新型疗法的开发主要聚焦于靶向Aβ、…

【随手笔记】

目录 开源许可声明线程数量限制如何获取手机位数令牌桶算法maven介绍pm指令QUICNAT穿越打洞原理Netty详解websocketWebRTC 开源许可声明 几种开源协议的区别&#xff08;Apache、MIT、BSD、MPL、GPL、LGPL&#xff09; 线程数量限制 一个进程最多可以创建多少个线程 ulimit命…

Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现

目录 1. 首页 layout 架子 [element-plus 菜单] 1.1 基本架子拆解 2. 登录访问拦截 2.1 需求 2.2 vue3 和 vue2 中的 Vue-Router 区别 3. 用户基本信息获取&渲染 4. 退出功能 [element-plus 确认框] 5. 文章分类页面 - [element-plus 表格] 5.1 基本架子 - PageCo…

专业版PyCharm使用plt.show()显示图像时,如何不显示在右侧工具栏中,而是直接弹出来

解决方案 File -> Settings -> Python Plots -> 取消勾选 Show plots in tool window 示例 默认勾选 Show plots in tool window 的显示效果&#xff1a; 取消勾选 Show plots in tool window 的显示效果&#xff1a;

伙房食堂电气安全新挑战:油烟潮湿环境下,如何筑起电气火灾“防火墙”?

近几年&#xff0c;随着我国经济的飞速发展&#xff0c;食堂餐饮也经历了一场变革&#xff0c;越来越多的电器走进了伙房食堂中&#xff0c;实现了电气化&#xff0c;为人们提供了高效便利的饮食服务&#xff0c;但同时也增加了火灾负荷。目前我国非常严重的电气火灾危害&#…