python基础之函数_[PYTHON笔记]
python之函数
什么是函数?函数是一段可常用的代码,为了日后可以经常性的去调用。python自身有很多内置函数,比如说input,print,我们也可以自己去定义函数
创建函数
python中,
def
关键字用来声明函数
下面一步步来认识创建函数
首先函数的格式是:
def 函数名(参数1,参数2.....参数n):
函数中的语句
def nothing():
pass
#我创建了一个叫nothing的函数,nothing()中我没有设置参数,语句是一个pass,pass并不是只能用于函数中,
#if中用pass也可以,相当于空。
#按照中文意思来说就是我过了,给系统表达你不用理我,但我是合法的意思,
#而实际操作意义是,我只是想用一个pass来暂时创建这个函数的基本骨架,让系统先不要报错,回过头来我再完善语句
def average_pn(a,b):
result = (a + b)/2
print(result)
average_pn(2,4)
#结果是3
#这里我定义了一个叫average_pn求正数平均数的函数,
#我还设置了两个参数,这两个参数是抽象意义来说的,
#那么我这个函数的算法是两个数相加除以2,最后打印出来。
#调用average_pn()函数后,写入具体数据实现函数的功能
上面的这个函数中,结果直接打印出来,但是在实际意义上来讲,我们希望他是返回一个值,然后我们给返回的值进行变量的赋值,继续完成我们程序下面的操作,所以说直接print
实际操纵意义不大,更应该是返回一个值,而对于返回值下面又会继续用代码来说明。
返回值return
用于将函数的结果返回出来
- 函数可以没有返回值,那么其实就相当于返回了 None
- 当return执行时,函数会不留情面的立刻结束
def average_pn(a,b):
if a == b:
return a
elif a<0 or b<0:
return
else:
result = (a+b)/2
return result
avg = int(average_pn(1,13))
print(avg) #结果是7
#ps :这里解释一下为什么我要int转换类型,因为在python3中/除出来就算是整数也是会个小数
#详情看看这个网址 https://blog.csdn.net/weixin_40485502/article/details/82832450
#这里我定义了一个只能求正数平均数的函数 average(a,b),并设置了两个参数。
#当判断a等于b的时候,就不需要进行计算,返回a即可;
#当发现a小于0或b小于0的时候,即不合法的输入的时候,直接返回None,
#其他则是有效结果进行相加求平均数。
有三种情况会返回None :没有return(就是没写return),return为空(就是只写return),第三种就是return None
全局变量和局部变量
全局变量:函数外面的变量,在任何地方都可以访问的变量
局部变量:函数里面的变量,只能放在函数内部使用
a = 12 #全局变量
def show():
b = 5 #局部变量
print(a)
print(b)
show()
#结果是:
# 12
# 5------调用了上面函数的时候,函数里面定义b,打印b,并且打印了全局变量a
print(a) #12 直接打印全局变量a
print(b) # 这里会报错,可以理解为在主函数中用不了你这个局部变量,会提示b未定义
# 可以这么通俗的理解,a就是公共卫生间,b是你家里的卫生间,
#如果有个你不认识的人去用你家里的卫生间,你肯定也会报警;但是你家里的人去公共卫生间那么不会报警。
同名变量的遮蔽
当全局变量和局部变量同名时,会优先使用局部变量--有人管这叫
就近原则
a = 12
def show():
a = 5
print(a)
show() #结果是5
print(a) #结果是12
#这里调用函数的时候,函数中print(a),这个a是优先使用局部变量的a
#这里有个很重要的点,不要理解为函数中a = 5是为全局变量赋值为5了,
#因为下面那一句print(a)结果还是12,只是函数中就近原则使用了局部变量,
#换句话来说就是在本地产生了一个新的a,上面全局变量我没动你(这也是python不用声明的一个小"bug"吧)
如果你真想对全局变量赋值,而不是产生一个新的a,可以用global关键字,下面看代码演示
a = 12
def show():
global a
#不希望遮蔽,而是修改全局变量,你要声明一下,告诉系统我想改变的是全局变量a,而并不是产生一个新的a
a = 5
print(a)
print(id(a)) ##这里打印此时a的id
show()
print(a)
print(id(a)) ##这里打印此时a的id
## 结果是两个都是5,两个都是一样的id,证明只是修改了全局变量,并不是产生了一个新的a,这两个a是一样的
#当然你也可以通过global关键字在函数里面创造全局变量
def show():
global a
a = 5
print(a)
#结果是5,这里直接上函数,在函数里面定义了一个全局变量a,告诉系统我创建的就是一个全局变量a,那么最后自然也能打印出来
总结:global关键字是对全局变量的一种保护。
其实写程序要尽可能少的去使用全局变量,不然会容易起冲突,会容易互相污染,而
global
存在的意义则是要保护这么个全局变量,防止有人不知道他所定义的这个变量是全局变量从而去修改了他。当你用global
关键字的时候就是提醒系统我知道我在操作全局变量这件事,你不用管我,我知道我自己在干什么再啰嗦一句,精辟一句,
global
的实际存在意义是为了在多人协作项目中防止"天下大乱"。
参数
参数用于向函数内部传递数据
默认参数
def show(a,b = 100):
print(a,b)
show(1,5) #1,5
show(1) #1,100
show() #报错
#这里我创建了一个叫show()的函数,设置了两个参数:a,b。
# a的值没有给出默认由操作者写入数据,b的值给出了默认等于100。什么意思呢?当使用这个函数的时候:
1.a的值你一定要给我,b的值你可以不给我
2.b的值你不给我,我就用我默认的值100执行 print
也就是说你去这个show餐厅点餐,要求点两个菜,有一个菜a你是必须要自己点的,菜b我可以帮你点,你不点我就帮点了这个,当然你也可以自己点,我会优先遵从你的点法。
def show(a=10,b)
print(a,b)
show(12)
#这里我像上面那样设置了一个函数两个参数,但不同的是,我设置的是a的默认值,此时我只想传一个参数,因为a默认了嘛,我以为他能传一个参数就能传给b,但是报错了。
#报错:non-default argument follows default argument
?为什么
# 这里注意一点,注意a的位置,a是在b的前面的,a设置了默认值,虽然设置了默认值,可是当我传一个参数的时候,系统就会摸棱两可,自我挣扎,你这是传给a,还是传给b呢,我知道你可能想传给b,可是a在b的前面,你这样传我很难做。然后就报错了
👆👆👆👆👆
上面这份程序说明如果你有一个参数是可选的(也就是默认的),那么他后面的参数也必须是可选的(必须是默认的),如果不是就会报错
关键字参数
python中提供了两种传参的方式:位置参数(positional arguments)和关键字参数(keyword arguments)
- 位置参数:最普遍的传参方式,与绝大部分语言的参数类似,以先后顺序为准则
- 关键字参数:较为少见的传参方式,与某些语言的命名参数或
hash
参数类似,用参数的名称直接访问
def show(a,b,c):
print(a,b,c)
#位置参数---最普通的参数
show(12,2,6) -----12,2,6
#关键字参数---用名字访问
show(a=12,b=5,c=8) -----12,5,8
show(b=12,a=5,c=8) -----5,12,8
show(c=12,b=5,a=8) -----8,5,12
#由上面这三行可看出,当你用关键字参数传值的时候,顺序已经不再重要了,因为你已经指定了谁是多少,顺序已经不是条件。
混合使用位置参数和关键字参数
划重点,你可以这么用但是!
关键字参数必须在所有位置参数的后面
def show(a,b,c):
print(a,b,c)
show(12,5,c = 8) ----12,5,8
show(12,c = 8,b = 5) ----12,5,8
## 先来看看上面这两行代码
1.要么你就按顺序来,然后最后指定c = 多少
2.要么也是同样性质,按顺序来,然后指定b是多少,c是多少
show(12,5,b=8)
show(12,b=8,5)
##两行代码也会报错
1.报错:TypeError: show() got multiple values for argument 'b'-->b重复赋值了
你这样写你代表前面按顺序来了分别指定a = 12,b=5,最后竟然又指定b=8,不行 (×)
2.至于第二行代码为什么会报错 我们来看看报错的语句
SyntaxError: positional argument follows keyword argument
字面上来说就是你的这个位置参数不能跟在关键字参数后面
所以你如果要混合使用位置参数和关键字参数,可以,但是关键字参数必须在所有位置参数的后面
!!!!注意这个所有
在函数中返回多个值
在python中,函数同时return多个结果,只需要用
,
(逗号)隔开就行,多个参数会以元组的形式返回ps:在其他语言当中,一般情况下,函数返回只能返回一个值
def show():
return 12,5
s = show()
print(s)
#结果为 (12,5) -----这是一个元组(tuple)
#你也可以用结构赋值一起使用
(a,b) = show()
print(a)
print(b)
#结果为 12
5
#你也可以 手动用tuple或者其他方式返回
def show():
return (12,5)
(a,b) = show()
print(a)
print(b)
#结果是 12
5
#列表 (list)形式
def show():
return [12,5]
[a,b] = show()
print(a)
print(b)
#结果是 12
5
小总结:其实python他返回的值也只能是一个,只不过他语言自身为我们包装成了tuple
形式,让我们可以返回多个值
大总结
def
关键字创建函数,pass
关键字为了搭建大的架构- 函数可以没有返回值,相当于返回None,当函数中return执行时,函数会立即结束;在任何地方都可以使用return,在if中等等等
- 尽量减少全局变量的使用,
global
关键字存在是为了保护全局变量 - 传参数的时候,用两种方式传参的时候,要注意关键字参数必须在所有位置参数的后面,注意这个所有
- 函数返回多个值的技巧其实就是返回了一个
tuple(元组)