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形式,让我们可以返回多个值


大总结

  1. def关键字创建函数,pass关键字为了搭建大的架构
  2. 函数可以没有返回值,相当于返回None,当函数中return执行时,函数会立即结束;在任何地方都可以使用return,在if中等等等
  3. 尽量减少全局变量的使用,global关键字存在是为了保护全局变量
  4. 传参数的时候,用两种方式传参的时候,要注意关键字参数必须在所有位置参数的后面,注意这个所有
  5. 函数返回多个值的技巧其实就是返回了一个tuple(元组)
posted @ 2020-07-05 13:34  YX_New  阅读(332)  评论(0编辑  收藏  举报

载入天数...载入时分秒...