python学习笔记:07函数 python函数的基本用法
函数定义:我们把需要反复执行的程序封装起来, 制作成一个可以反复调用的工具,这个工具在编程中就叫函数
python中已存在的函数比如print(),叫做内置函数。用户通过常用的代码块以固定的格式去封装成一个独立的模块,代码创建的函数,被叫做用户自定义函数。
自定义函数
- 自定义函数的创建格式
函数创建规则如下:
①函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
②任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
③函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
④函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
自定义函数的优点:
1、当一段代码需要在不同位置上面重复使用时,将代码封装在函数里面,可以减少代码量;
2、将代码封装起来之后可以在随时随地运行的同时不影响其他代码的使用。
- 函数参数的设置
- 函数参数的概念:写在函数括号里面的东西,就是参数
- 函数参数的分类:形参和实参
- 函数参数的功能:
传递(赋值):将实参的数据传递给形参的名字(也就是把数据赋值给变量名,类似于变量的赋值),传递之后,函数内部的代码块就可以通过这个变量名取使用传过来的数据
①python 传不可变对象实例
在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的对象(对象 id 不同)
同一个对象
实例输出结果为:
②传可变对象实例
可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了(即在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参和实参指向的还是相同的对象(对象 id 相同))
同一个对象
实例输出结果为:
- 形参可使用的正式参数类型:
①必需参数:在函数中可以设置多个参数,但需要是有几个形参,就要给出几个实参,并且是一一对应,不然会出现语法错误。
实例输出结果为(报错):
实例输出结果为:
②默认参数:在函数中可以设置默认参数(就是直接在形参后面写值)
实例输出结果为:
③不定长参数:能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名(即用*(一个星号)表示这个形参接收多个实参,并组成一个元组)。
实例输出结果为:
若在函数调用时不定长参数没有指定实参,它就是一个空元组。可以不向函数传递未命名的变量。
实例输出结果为:
用**(两个星号)表示这个形参接收多个实参,并组成一个字典
实例输出结果为:
参数中 *(星号)可以单独出现,如果单独出现*(星号),则*(星号)后的参数必须用关键字传入
注1(关键字参数(默认参数形式传递形式即可看作关键字参数)):
①关键字参数不是一个出现在函数定义时的概念,而是一个出现在函数调用时的概念。
②关键字参数是指使用键值对的形式key=values来确定输入的参数值。
③关键字参数允许你以任何顺序传递参数,不再需要与形参的位置完全一致,只要将参数名写正确即可。
④混合传参时关键字参数必须位于位置参数之后。
⑤使用关键字参数,可以让参数传递更加明确,让调用方清楚的知道每个参数的传值情况。
注2(位置参数(必需参数形式传递形式即可看作位置参数)):
①位置参数不是一个出现在函数定义时的概念,而是一个出现在函数调用时的概念。
②实参和形参数量必须一致,参数多或者少都会报错TypeError。
③实参和形参位置必须一致,否则会产生不同的结果。
- 函数返回值的设置
return [表达式]:语句用于退出函数(自定义函数中只要运行到了return关键字,就会立即停止函数的运行),选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。
(1)带参数值的 return 语句
实例输出结果为:
(2)不带参数值的 return 语句
实例输出结果为:
- 函数作用域
函数不会改变传入的不可变对象的值,函数内部定义的变量在函数外部不可以使用,是局部变量
- 函数作用域-全局作用域
如果想要在函数内部改变外面不可变对象变量的值, 则需要在函数内部使用 global 关键字,global 是全局变量声明, 声明之后可以在全局使用, 这里的全局指的是当前py文件中。
注意: 函数内外名字要一致,否则就是一个新变量
不进行全局变量声明前更改变量值
实例输出结果为(报错):
进行全局变量声明后更改变量值
实例输出结果为:
- 函数作用域-局部作用域
如果是嵌套函数,则不能使用global,需要使用nonlocal关键字
这种情况下遇到比较少,了解即可
实例输出结果为:
- 函数作用域-闭包
把刚才的函数稍微改一下, 改f4的返回值为函数 func5 ,调用f4之后的变量值,可以再次调用把内部函数(func5)和外部变量(var1)都称为闭包(即在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用)
实例输出结果为:
作用:可以在外部修改函数内部的变量值,是函数内部与外界沟通的桥梁
闭包作用举例
比如游戏中的血量,是不能任何地方都可以随便修改的,否则随便一个外挂就无敌了因此需要把血量保护起来,不能随便修改,要修改只能通过调用指定的函数才行,这样就在一定程度上保护了血量
实例输出结果为(在交互模式运行):
匿名函数
匿名函数就是没有函数名的函数,主要用来定义那种不是特别复杂的函数, 常用于函数的参数中。
- 设置参数 x 加上 1:
实例输出结果为
- 匿名函数设置两个参数
实例输出结果为
- 将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数。
等同于下面代码:
实例输出结果为
注1:lambda 函数是匿名的,它们没有函数名称,只能通过赋值给变量或作为参数传递给其他函数来使用。
注2:lambda 函数通常只包含一行代码,这使得它们适用于编写简单的函数。
强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式,与 * 后只能使用关键字参数类似,两个符号都仅仅只是说明,并不需要多传入参数。
实例输出结果为
练习题
1、编写一个闭包函数,要实现的功能是计数功能。
要求:在原有基础上每调用一次加1。如可设置一个变量用来计数,变量初始值为0,第一次调用函数变为1,第二次调用函数加1变为2……以此类推。
2、给出一个列表:s = [(1, 2, 3), (2, 1, 4), (3, 3, 6), (4, 0, 9)],现在要求对这个列表进行排序,排序规则是按照每个元组的第二个元素的大小去排序(可以是默认从小到大排序)。提示(要求):使用匿名函数来设置排序规则。
相关文章
- 电脑键盘指法+常用快捷键文字及图片详解
- 机械键盘灯亮按键无反应(机械键盘灯亮按键无反应什么原因)
- Keychron Q14 Max键盘开售:小键盘左置、Alice配列,1298元起
- Keychron K15 Max矮轴机械键盘开售:75%Alice配列,567元起
- 单手35键设计,Keychron旗下Lemokey推出X0机械键盘
- 线上故障排查全套路盘点,运维大哥请自查
- 学习Pandas中操作Excel,看这一篇文章就够了
- 对不起,我把APP也给爬了(对不起我把你弄脏)
- Navigating global shifts and forging a path for emerging economies
- 多目标追踪小抄:快速了解MOT的基本概念