python的函数的笔记_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(元组)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值