经过对python的学习,相信我们已经掌握简单的python的知识,接下来让我们更进一步来学习python中的函数。
什么是函数:
首先我们先了解什么是函数。其实编程中的函数和我们数学中的函数不是一个东西。通俗讲,编程中函数的定义是:我们通常在进行一些功能处理的过程中,需要一行或者多行代码来完成某个业务功能和流程处理的代码集合,叫做函数。如:
# 计算一个由用户输入半径的圆的面积
#顶一个变量 PI,表示圆周率
PI = 3.14;
# 使用 input 函数接受一个用户输入的半径值,但是 input 接受的值是字符串
# 所以需要我们使用 int()函数来完成转换
# int() 函数会将传递的参数尝试着转换为整形数字
r = int(input("请输入圆的半径:"));
area = PI * r * r;
print("半径为%d 的圆的面积是"%r+str(area));
print("半径为"+str(r)+"的圆的面积是"+str(area));
上面这段程序相信大家都能看懂,就是求取用户输入一个指定半径的圆的面积。
假如我们在平常打代码中遇到相同重复的代码时,我们应该怎么去做?此时,应该尽量的避免代码的重复,哪怕是一行相同的代码。因为python 和其他编程语言一样,可以将这段程序封装成函数,通过一个定义的函数封装好这些代码,在某些需要的时候,通过函数的名称直接调用即可。
函数的定义:
函数的定义非常简单,python
中通过
def
关键字来定义函数
def 函数名称(参数列表):
函数中封装的代码块
[return 返回值]
按照上面的例子,我们定义一个求取圆的面积的函数:
# 使用 def 函数名称(参数列表): 来定义一个函数
# 我们定义了一个获取已知半径圆的面积的函数
# 将来我们要用的时候,只要传递过来半径就行了
# 这个函数会辅助我们完成计算面积的功能
def getCircleArea(r):
PI = 3.141592653;
return PI * (r**2); ## 使用 return 关键字返回调用者想要的结果
如上所示,一个计算圆的面积的函数就被定义好了,函数的名称为
getCircleArea
。切记,
定义的函数不会自动执行函数中的代码的,需要使用者调用才能执行。
函数的调用:
定义好的函数,我们需要通过函数的名称来调用函数,函数中的代码才会执行。调用函
数通过
函数名称
(
参数列表
)
来调用函数,后面的圆括号中,可以根据定义函数的参数列表给
函数传递对应的参数
# 通过使用函数名称(参数列表) 来调用一个已经定于的函数
# 如果有返回值,则使用变量接受返回值,如果没有,则直接调用就行了
res = getCircleArea(5);
print("半径为 5 的圆的面积是:%f"%res);
print("半径为 5 的圆的面积是:"+str(res));
这样,我们就可以在需要的时候,直接通过定义好的函数名称
getCircleArea(radius)
来进
行函数功能的重复执行就可以了。
函数的变量:
在函数中,我们可以看到也进行了变量的使用,那函数中的变量和函数外的变量到底有
什么区别呢?我们可以一起来了解:
全局变量:
声明在函数外面的变量,可以在文档的任意地方使用这个变量,我们称为全局变量
关于全局变量,使用方式如下:
# 定义在函数外面的变量,叫做全局变量,全局变量可以在任何地方使用
name = "旺财";
# 直接使用全局变量
print(name);
def printInfos():
# 在函数中使用全局变量
print(name);
printInfos();
局部变量:
局部变量就是声明在函数内部的变量,只能在函数内部使用,函数执行结束这个变量就 会被回收,我们称之为局部变量。局部变量只是在函数中可以使用,出了函数这个变量就不认识了(垃圾回收机制回收了内存)。
def test():
name = "旺财";
print(name);
test();
# 报错,错误信息室 name 没有定义,==> NameError: name 'name' is not defined
# 因为此时我们定义 name 变量在函数中,name 是一个局部变量,作用域是函数内部
# 只在 test 函数中生效,函数外面是没有这个变量的
print(name);
通常情况下,函数内部声明赋值的变量和函数的参数都会当成局部变量进行处理。
全局变量和局部变量:
几乎所有的编程语言中都有全局变量和局部变量的区分,同时我们在开发过程中,也需
要尽量避免频繁使用全局变量 。原因是:
一:全局变量一经使用就常驻内存,如果全局变量中数据过于庞大就会导致
内存溢出
(内存不够用了)而程序崩溃的情况。
二:全局变量在使用的过程中容易造成变量的
全局污染
,因为在项目开发过程中 通常是多个人协同开发多个 Python
文件,当相互引用的时候,就有可能会因为全局变量重 名而造成变量的值覆盖的情况出现。
函数的参数:
上面我们在函数的定义和调用时,我们发现,在函数中,不管是定义函数还是调用 函数,都存在着一个()
,我们上面说这里面是参数列表,如刚刚我们写的圆的半径,但是没有详细的讲过,下面我们就函数的参数来看看。
函数的形式参数和实际参数:
函数的参数主要会涉及到两个概念:形式参数(简称为
形参
)、实际参数(简称为
实参
)。
➢ 形式参数:
其实就是定义函数时,函数括号中的变量,形式参数的意义是当前函数如果要被调 用执行,就必须让函数接收括号中定好的参数才能正常执行,就是形式上需要这些数据
才能执行函数,所以称为形式参数。
➢ 实际参数:
实际参数是我们在通过函数名称调用函数时,在括号中传递的真实数据;实际传递给函数用于执行的数据,称为实际参数。
函数的参数定义规则:
函数通过 def
进行定义,用于执行一个功能,一个函数,可能需要参数,也可能不需要参数。
类似我们现实生活,执行一个功能就是做一件事情,做这件事情需要的资源就是参数,去做一件事情,有些需要资源,有些是不需要资源的。所以我们在对函数进行定义时需要遵守这几个规则:
规则
1:如果我们的程序中出现了一部分功能代码重复执行,就需要封装一个函数来减少 代码的重
复量
规则 2:根据代码执行是否需要其他额外的数据,需要额外的几个数据就定义几个参数, 不需要
额外的数据就不定义参数
规则
3
:实际参数可以传递任意对象【类型】
(python
中一切皆对象
)
函数参数默认值:
某些时候,我们可以给函数的参数定义默认值,这样函数在调用过程中,如果某些参数没有传递,就直接使用默认值来执行函数代码,函数默认参数确定比较简单,直接在形式参数上赋值就可以。
def getCircle(r = 5, PI = 3.141592653):
a = PI * r**2;
return a;
# 没有传递参数,则默认返回半径为 5 的圆的面积
print("圆的面积是:"+str(getCircle()));
# 传递了参数,则计算传递半径的面积
print("圆的面积是:"+str(getCircle(10)));
注意:
一旦要使用默认值,则所有的形参都必须有默认值。
函数的可变参数:
在某些情况下, 函数的参数个数不是确定的,这样在常规定义函数时就木有办法进行形式参数的定义了。
python 提供了一种可变参数,可以完美的解决这个问题。
可变参数,是在形式参数前面加一个*
符号作为标识。
# 定义一个函数,遍历输出传递的数据
# 在参数前面加* ,表示这个数据的长度不定,任意长度
def printInfos(*infos):
for i in infos:
# print 函数,可以传递第二个参数,如果想不换行显示,
# 则可以添加第二个参数为 end=""
#print(i,end="");
print(i)
# 调用的时候传递几个,则显示几个
printInfos("张三","李四","王五");
printInfos("张三","李四","王五","唐六")
注意:
在某些特殊情况下,函数的可变参数放在了固定参数的前面;此时函数的调用就需要通过变量名称指定数据了。
特殊的用法:关键字参数:
将传递给函数的参数,解析成
dict
字典
的形式,也就是
key:value
键值对的形式,这就是关键字参数的意义,更加方便可变参数的操作。
关键字参数,使用两个
**
符号来声明关键字参数:
如:
def printInfos(**infos):
print(infos);
printInfos(id=123,name="小明",age=16,sex="男"
#运行结果:{'id': 123, 'name': '小明', 'age': 16, 'sex': '男'}
注意:
关键字参数,还可以指定只能传递什么样的名称为参数名称,就是命名关键字参数。命名关键字参数通过*符号作为分隔符号,符号后面的参数就是命名关键字参数。
# 参数列表中存在星号(*)参数,则表示星号之后的参数都是命名参数
def printInfos(id,name,*,age,sex):
print(id,name,age,sex);
# 报错,因为在定义函数的时候,存在*号参数,表示从*号后面的参数,
# 都是命名参数
printInfos(12,"大明",18,"男");
#正确
printInfos(12,"大明",age=18,sex="男");
另外一种情况,就是在可变参数的后面,添加的参数都是命名关键字参数,这里的命名。
def printInfos(id,name,*args,sex,age):
print(id,name);
print(args);
print(id,name,args,sex,age);
# 报错,因为 sex 和 age 都没法传递,会被当成 args 中的值
#printInfos(12,"李华","值 1","值 2","值 3",19,"男");
# 正确,就是在参数中存在了可变参数后,之后的必须使用命名参数
printInfos(12,"李华","值 1","值 2","值 3",age=19,sex="男");
扩展:函数中的参数,根据传递的参数的顺序、参数类型的不同,会有各种不同的组合 方式,如传递[字符串、字符串
]
、
[
字符串、字符串
...]
、
[
字符串、数值
..]
、
[
数值、函数
...]
等 等各种各样的情况,但是我们有了可变参数*args
和命名关键字参数
**kw
之流的出现,让函 数参数的接收变得比较简单。
我们可以通过
(*args, **kw)
的形式来接收任何形式的参数。
函数的返回值:
返回值的意义:
函数是执行一段代码完成一定的功能处理过程,函数中代码块执行的结果,如果我们后 面的代码中需要用到,就需要函数返回我们执行的结果,就是需要返回值;如果我们的函数 就是执行的代码,执行的结果我们后面的代码不适用,就不需要定义返回值。 如某 A 让某
B
做一件事,就是调用了某
B
的函数,如果这件事是取快递,某
B
做完取 快递这件事情,最后要将执行的结果[
快递
]
返回给某
A
,就是函数需要返回值;如果这件事 是下班锁门,某 B
做完这件事情就可以了,事情的结果不需要给某
A
进行汇报,就是函数 不需要返回值。
操作函数的返回值:
函数的返回值我们通过
return
关键字来返回。
返回值的语法结构如下:
def 函数名称(参数列表):
//函数代码
return 返回值;
注意:
➢
返回值可以是任意对象
(python
中一切皆对象
)
。
➢
返回值,需要在调用函数的时候进行接收,否则返回值没有意义的。
def getCircleArea(r):
PI = 3.141592653;
s = PI * (r**2);
return s; # return 关键字返回调用者需要的值
# 如果调用函数存在返回值,我们需要使用变量来接受,如下面
# 使用 res 变量接受了函数 getCircleArea 的值
res = getCircleArea(5);
注意:
python 中的函数,不论是否写了 return 关键字,都会有返回值的存在,return 是
开发人员确定的返回值,如果没有 return 关键字 python 函数会返回一个 None 对象。
# Python 的函数都是存在返回值的,如果我们使用 return 指定返回值,
# 则返回我们指定的值
# 如果我们没有使用 return 来指定返回的值,则默认返回一个 None 对象,
# 表示返回的为空
def printMsg(msg):
print(msg);
res = printMsg("Hello Python~~");
print(res)
函数可以返回多个数据:
python 的函数比较特殊,在函数执行完成后,通过
return
关键字可以同时返回多个数
据
,调用函数的时候
根据返回值的顺序来接收对应的返回值
。
# 定义一个函数,返回传递参数 10 倍数和 20 倍数
def test(val):
a = val * 10;
b = val * 20;
return a,b;
# 注意,接受的值的顺序和返回值的顺序一致
res1,res2 = test(10);
print(res1,res2);
以上就是关于python函数的简单介绍,希望能对大家有帮助,如有不足,希望大家能给予宝贵意见,如有侵权,请联系!