【python系统学习12】函数
函数
函数是一堆组织好的、可重复利用的、用来实现某一功能的代码。
python中的input()、print()、type()、bool()、len()等都是函数。且是python的内置函数。
我们也可以封装自己的函数。
目录
作用
将常用的一段代码组织好封装到一个函数中重复利用
通过传入不同的参数、经过相同的计算,得到不同的结果。
可以将一个程序拆分成多个不同的函数,某些函数可以重复利用。在代码复用上看,极大的减少了代码的冗余量。
函数定义
我们来尝试定义自己独一无二的函数:
伪代码
形参是函数参数的变量。
函数参数可以有多个、不限量
def 函数名(形参1,形参2...):
函数体(要执行的内容)
return 返回值
示例代码
# 函数定义
def summation(a,b):
return a + b
注意事项
一、定义:
def的意思是定义(define),用来声明定义一个函数。
二、函数名:
summation
是函数名,是自定义的变量。名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合 不可与内置函数重名(内置函数不需要定义即可直接使用)
三、参数:
函数名后是英文的括号,括号内部定义参数变量。 括号里可以有多个参数,也可以不带参数。 参数的命名规则与函数名相同 括号后边是英文冒号
四、函数体:
冒号下边是缩进后的代码块,即是函数的函数体。 函数体是函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格 函数体内部的代码是调用函数时才会被执行的代码。不调用不会执行
五、返回值:
函数体内部的return是用来返回值的。可以指定函数执行完毕后最终会返回什么值或表达式 return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略 函数在执行过程中遇到第一个return语句就会停止执行,return后边的第二个return永远不会被执行。
函数调用
我们定义了函数后,想要使用这个函数就是调用函数。
比如我们常用的print()
函数,我们传入参数后就能帮我们打印出参数部分的内容,这就是函数调用了。
伪代码
函数名+括号+可能的参数。
函数名(函数参数1,...更多参数)
示例代码
# 函数定义
def summation(a,b):
return a + b
# 函数调用
summation(1,2)
函数调用后将得到函数内部的返回值。
函数参数
参数可以有多个,也可以没有。视参数功能的情况而定。
参数传递
在函数调用时在括号中传入的不同的值,这个值就是参数。
函数在接受到参数后,对其进行处理,并经过一定计算后返回不同的值。
如下,比如len()
函数会根据括号里放的参数的不同,输出(返回)不同的值。
var1 = '这是第一个示例变量'
print(len(var1)) # 9,得到字符串的长度为9
var2 = ['小石头','xing.org1^','郭菊锋']
print(len(var2)) # 3,得到数组的长度为3
上例中,len后边括号里的var1、var2就是参数传递。
参数接收
函数调用时将参数传递过去、则函数定义时,也要准备好接收的变量,那就是形参
。
def summation(a,b): # a,b就是对应接收的变量,是函数的形参。
return a + b # 接收数据后,在函数内部被运用。
summation(1,2) # 1,2就是传递参数
无参函数
有的函数其功能不需要参数,就没有参数预定和传递了。
def haha():
print('只打印一句话,不用参数。')
haha()
参数类型
位置参数
当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。
如下案例:
def you(name,age,sex):
print('your name is:', name)
print('your age is:', age)
print('your sex is:', sex)
you('小石头','19','female')
# 打印结果如下:
# your name is: 小石头
# your age is: 19
# your sex is: female
我们传递的三个参数必须和形参需要的内容一一对应,这就是位置参数
。
一旦不对应就搞笑了
you('female','小石头','19')
# 打印结果如下:
# your name is: female
# your age is: 小石头
# your sex is: 19
默认参数
有时候我们有的参数多数情况下就用一个固定的值,有他的默认值。只有特殊情况下调用时才会需要不同的值,这时我们就可以定义默认参数。而不用每次都传递相同的参数了:
def newYou(name,age,sex='female'): # sex='female'就是默认参,参数的默认值是'female'。
print("your's name:", name)
print("your's age:", age)
print("your's sex:", sex)
# 当不传递第三个参数时,取默认值'female'
newYou('小石头','10')
# 打印结果:
# your's name: 小石头
# your's age: 10
# your's sex: female
# 当传递了第三个参数时,取传递的参数male。
newYou('大石头','29', 'male')
# 打印结果
# your's name: 大石头
# your's age: 29
# your's sex: male
sex='female'就是默认参,参数的默认值是'female'。
当不传参数时,第三个参数默认取值为'female'。当传递了第三个参数时,取传递的参数。
⚠️需要注意的是:默认参数必须放在位置参数之后。
不定长度参数
顾名思义,就是传递给参数的数量是可选的、不确定的。
不定长参数可以接收任意数量的值。
它的格式比较特殊,是一个星号*
加上参数名,它的返回值也比较特殊,
def noLen(*variables):
return variables
noLenResult = noLen('参数1','参数2','参数3')
#括号里的这几个值都会传递给参数variables
print(noLenResult) # ('参数1', '参数2', '参数3')
print(type(noLenResult)) # <class 'tuple'>
<class 'tuple'>
这种数据类型叫作元组(tuple)。见该篇章
在不定长参数后边还可以放默认参
def noLenDefault(*variables, defaultVar = 123):
print(variables)
print(defaultVar)
return variables
noLenDefault('a',15,6)
# ('a', 15, 6)
# 123
函数返回值
定义返回值
函数一定要有返回值,返回值写在return
后边
有返回值的案例:
def summation(a,b):
return a + b # return返回值、返回的是a+b的和。
result = summation(1,2)
print(result) # 3。就是1+2的结果
没有返回值
如果没有明确写return 返回值
,那么Python也会在末尾隐性地加上return None,那么函数默认就会返回None
值
没有返回值的案例:
def summation(a,b):
a + b
# 没有return返回值
result = summation(1,2)
print(result) # None
print(type(result)) # <class 'NoneType'>
调用函数之后,得到的结果是None。且结果的数据类型是'NoneType'
返回多个值
用return语句来返回多个值。
要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开:
def returnmore(a,b,c):
return a,b,c
returnResult = returnmore(1,3,4)
print(returnResult)
# 返回结果
# (1, 3, 4)
可见返回结果也是元祖
类型的
多个return
函数在执行过程中遇到第一个return语句就会停止执行,return后边的第二个return永远不会被执行。
def oneReturn():
return 1
print('这句不会执行')
return 2
oneResult = oneReturn()
print(oneResult) # 1
可见,return返回值 不是2,而是1。这是因为第一个return后边的内容不会再执行了。包括print和return 2
作用域
程序中的变量并不是在哪个位置都可以被使用的,使用权限决定于这个变量是在哪里赋值的。
局部变量与全局变量
一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】 在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】 使用不在该函数作用域也不在全局作用域内的变量时,就会报错“变量名未定义”
quanjuVar = '我是全局变量'
def jubuFn1():
jubuVar1 = '我是局部变量1'
print(quanjuVar,jubuVar1) # 我是全局变量 我是局部变量1
def jubuFn2():
jubuVar2 = '我是局部变量2'
print(quanjuVar,jubuVar2) # 我是全局变量 我是局部变量2
print(jubuVar1) # 这段代码放开就会报错:NameError: name 'jubuVar1' is not defined
jubuFn1()
jubuFn2()
将局部变量全局化
怎么解决“局部变量”和”全局变量“之间的矛盾,实现函数间变量的相互传递呢?
把局部变量都放在函数外,变成全局变量。 使用 global
语句将局部变量声明为全局变量函数嵌套
# 局部变量全局化
quanjuVar2 = '我是全局变量2'
jubuVar3 = '局部变量全局化,第一种方法'
def jubuFn3():
# 在顶部将其全局化
global jubuVar4
jubuVar1 = '我是局部变量1'
# 在下边赋值全局化后的局部变量
jubuVar4 = '我是局部变量4,我被global全局化了'
print(quanjuVar,jubuVar1,jubuVar3) # 我是全局变量 我是局部变量1 局部变量全局化,第一种方法
def jubuFn4():
jubuVar2 = '我是局部变量222'
print(quanjuVar,jubuVar2) # 我是全局变量 我是局部变量222
print(jubuVar3) # 局部变量全局化,第一种方法
print(jubuVar4) # 这段代码这次就能正常执行了,因为jubuVar4这个变量被全局化了。打印:我是局部变量4,我被global全局化了
jubuFn3()
jubuFn4()
global语句一般写在函数体的第一行,它会告诉Python,“我希望jubuVar4是个全局变量,所以请不要用这个名字创建一个局部变量”。
所以jubuFn4()函数内部现在可以直接使用声明后的全局变量jubuVar4。
函数嵌套
函数嵌套也可以实现函数间变量的相互传递
# 函数嵌套
quanjuVar3 = '我是全局变量3'
def jubuFn5():
jubuVar5 = '我是局部变量5'
print(quanjuVar,jubuVar5) # 我是全局变量 我是局部变量5
def jubuFn6():
jubuVar6 = '我是局部变量666'
print(quanjuVar3,jubuVar6) # 我是全局变量3 我是局部变量666
print(jubuVar5) # 我是局部变量5 (因为嵌套,内部的函数可以用全局的变量、也可以用父级函数内部的变量)
jubuFn6()
jubuFn5()
以上是函数定义的嵌套。
下边还有函数调用的嵌套
# 函数调用的嵌套
def one(a):
return a
def two(a,b):
return one(a) + b
andResult = two(1,2)
print(andResult) # 3
在函数two中,调用了one函数之后的结果,与b参数相加后再return出去
练习题
仿写len()函数
实现具有相同功能的函数
思路:
设置一个初始为0的计数器; 遍历字符串,每遍历一次,计数器加一; 返回计数器的值。
本文使用 mdnice 排版
【python系统学习12】函数的更多相关文章
- 【Python系统学习】基础篇
这次真的是最后一次了!第三次滚Python的基础.走了太多弯路.认真一点!菜鸟! 教程 转义字符 \ 可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\ ...
- 【python系统学习05】input函数——实现人机交互
input函数 目录 input用途 语法 示例 参数 返回值 返回值数据类型转换 容错处理 动手吧 input用途 实现人机交互: 1.你提出问题打印在屏幕上, 2.运行程序的人再输入回答. 3.按 ...
- Python 系统学习梳理_【All】
Python学习 1. Python学习---Python安装与基础1205 2. Python学习---PyCharm的使用学习 3. Python学习---Python数据类型1206 4. Py ...
- python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...
- 【Python系统学习02】数据类型与类型转换
一.数据类型 字符串 整数 浮点数 [补充中...] 1.字符串 str 字符串:英文string,简写str. name = '小石头:' print(name,'2019', '12', '24' ...
- 【python系统学习10】布尔值
python的数据类型有好多个,前边写过字符串.整数和浮点数这三种. 本节来整理另一种简单数据类型--布尔值 布尔值(bool) 布尔值和其数据值 计算机可以用数据进行判断,若判断为真则执行特定条件中 ...
- 【python系统学习13】类(class)与对象(object)
目录: 类(class)和实例 类 实例 小测试 对象(object) 属性和方法 类的创建 伪代码 示例代码 属性(attribute) 方法(method) 类的实例化 实例对象调用类属性和方法 ...
- 【python系统学习17】python中的文件读写
python中的文件读写 文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本.音频片段.Excel文档.邮件以及任何保存在电脑上的东西. 可使用python批量的操作本地文件, ...
- python基础学习2 函数变量与赋值
学习的第一步,就是通常的输出函数:print() 1.基础主要学习了变量的赋值,变量名可以疑字母.数字.下划线(_)进行命名,但是不能以数字开头 变量的赋值:变量名 = 变量值 2.模块的导入,和调用 ...
随机推荐
- 超详细的HDFS读写流程详解(最容易理解的方式)
HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).Datanode(数据节点)和Seco ...
- 基于GIS空间分析的多边形提取技术
现有基于矢量图形的骨架线提取方法主要包括数据预处理.基于约束 Delauny 三角剖分的骨架线结点生成和骨架线的连接 3 个过程,上述过程都可利用现有 GIS 系统的数据处理.空间分析和建模功能实现. ...
- Prometheus 监控平台的搭建
1. 环境准备 两台ubuntu 16.04 服务器内网IP 作用 安装软件 172.16.4.11 监控的服务端 Prometheus( ...
- Redis集群搭建及选举原理
redis集群简述 哨兵模式中如果主从中master宕机了,是通过哨兵来选举出新的master,在这个选举切换主从的过程,整个redis服务是不可用的.而且哨兵模式中只有一个主节点对外提供服务,因此没 ...
- Yaml文件,超详细讲解
YAML文件简单介绍 YAML 是一种可读性非常高,与程序语言数据结构非常接近.同时具备丰富的表达能力和可扩展性,并且易于使用的数据标记语言. YAML全称其实是"YAML Ain't a ...
- vue-router需要注意的点
1.在编程式导航中,如果提供了path,params会被忽略:需要提供name,或手写完整的带有参数的path;以下写法可取: const userId = '123'; 1.this.$route ...
- (转)协议森林13 9527 (DNS协议)
协议森林13 9527 (DNS协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在周星驰的电影<唐伯虎点秋香> ...
- 记一次在新服务器上搭建lnmp的过程
背景: 前不久阿里云在做活动,200+一台服务器三年,于是果断入手了一台. 今天有空就在服务器上把lnmp环境给装了,之前为了了解安装过程,在别的机器上尝试过单独安装nginx.mysql.php,虽 ...
- EPX-Studio脚本调用
procedure TF408017792.Button1Click(Sender: TObject); var NEPX: IExcelPanelXDisp; begin NEPX := this. ...
- Java多线程并发08——锁在Java中的应用
前两篇文章中,为各位带来了,锁的类型及锁在Java中的实现.接下来本文将为各位带来锁在Java中的应用相关知识.关注我的公众号「Java面典」了解更多 Java 相关知识点. 锁在Java中主要应用还 ...