Python函数

138 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

函数定义

之前讨论过,循环可以进行有规律的重复调用代码,那么加入遇到没有规律的使用场景呢,比如:

记录操作行为功能,什么时候记录呢,可能是报错的时候,可能是操作执行完成的时候,还有可能是。。。。。,

这种情况当然可以复制代码解决了,但是,仔细琢磨,这个在修改的时候课时比循环那种情况更加麻烦,毕竟使用的地方多了,并且没有规律的话,根本无从找起,所以就有了一种想法:

能不能把这个功能的所有代码看做一个整体,然后进行命名,然后通过名称使用,这样一来会好很多,这个就是函数编程的一大意义。

当然,还涉及到面向过程编程的问题,我们不在本篇文章当中讨论。

Python函数

根据上面所说的,就是将一个完整功能所有的代码打包起来,然后进行命名,所以,Python函数的定义格式如下:

def 函数名称():
    函数功能代码

1)def是关键字,固定写法。

2)函数名称和变量名称有同样的命名规则。

3)后面的括号下面说,目前可以认为是一种固定格式。

4)然后冒号,接着下面缩进编写函数的功能。

这里要知道,函数有一个很隐蔽但很重要的的概念,函数定义了之后不会执行,只有调用的时候才会执行,一定要区分函数还是函数调用:

1)直接写函数名称,是指函数本身。

2)函数名称() 使用函数的功能。

比如:电饭锅指的是一个家电,电饭锅() 是使用电饭锅的功能,嘿嘿嘿。

def dfg():
    print("我可以做米饭")
​
print(dfg) # 电饭锅函数本身
dfg() #电饭锅做饭的功能,也就是执行函数里面的语句

Python函数参数

函数的出现极大的方便了代码的维护,形成了代码块儿,但是还是灵活程度不够,比如:

定义值作T恤的函数,T恤的版式和用料是固定的,但是颜色和尺寸可能会变化,那么这样定义多个函数就不方便了,能不能给函数定义几个内部可以使用的变量,然后通过变量来提高函数的灵活程度呢,当然是可以的,这个就是函数的参数:

def t_shirt(color,size): #这里的括号当中就相当与定义了两个变量,color和size,在下面的代码块当中就可以使用
    print("制作一件%s颜色的%s的T恤"%(color,size))
    
t_shirt("红","XL") #一件红色xl号的T恤
t_shirt("绿","XXL") #一件绿色xxl号的T恤

这里说明两个定义:

形参:在定义函数时候定义的参数叫做形参,比如上面的:color,size

实参:在调用函数的时候传递的具体的值叫做实参,比如上面的:红,XL

Python函数参数的分类

Python为了开发方便,对参数进行了分类,大概分为四类:

位置参数

常规意义上,调用函数的时候,调用函数的参数要和定义函数的参数对应,不论是数量还是位置,那么这种情况就是位置参数

def fun(a,b):
    print(a,b)
​
fun(1,2)

1)形参是两个,那么实参必须是两个

2)传参1,2对应a,b,所以a是1,b是2

关键字参数

在有些情况下,假如程序员不是函数的开发者,对函数参数比较多的可能记不清函数的顺序,那么就可以通过形参=实参的形式忽略形参定义的顺序传参:

def fun(a,b):
    print(a,b)
​
fun(b = 1,a = 2)

这个时候,尽管定义是a,b但是传递使用b=1,a=2,那么就不用考虑先定义的a,后定义的b,所以 b是1,a是2,这个很好理解

默认参数

有些情况下,函数的有些参数变化是不大的,比如上面T恤的案例当中,衣服的大小颜色变化可能频繁一些,但是布料的种类一般是不变的,所以,可以在定义形参的时候定义一个默认值,然后在调用的时候,传递就使用传递的值,不传递就使用默认值。

def t_shirt(color,size,cloth="的确良"): 
    print("制作一件%s颜色的%s的%sT恤"%(color,size,cloth))
    
t_shirt("红","XL") #一件红色xl号的确良的T恤
t_shirt("绿","XXL","碳纤维") #一件绿色xxl号碳纤维的T恤

1)这个例子当中,没有传递第三个参数,就默认使用默认值 ‘的确良’,如果传递了‘碳纤维’就使用碳纤维

2)默认值参数不可以定义在常规参数的前面,因为会参数歧义(你可以试试呦,嘿嘿嘿)

参数组

在有些情况下,函数的参数个数太多或者不定的时候,比如:

定义一个记录个人特质的函数,有的人的特征是:肤白,貌美,大长腿

但是有的人的特征是:老实(嘿嘿嘿)

那么,到底需要多少个参数去接收特征呢?

所以有了参数组,就是通过给形参添加*或者**改变参数的数据类型,变成元组或者字典

def person(*args):
    print(args)
    
person("肤白""貌美""大长腿")
person("老实")
#结果是
("肤白""貌美""大长腿")
("老实")
​
def person(**args):
    print(args)
    
person(arg1 = "肤白",arg2 = "貌美",arg3 = "大长腿")
person(arg1 = "老实")
#结果是
{"arg1": "肤白""arg2": "貌美""arg3": "大长腿"}
{"arg1": "老实"}

1)*和**定义的形参可以不传参,结果是空元组和空字典

Python函数的返回值

讨论完函数的定义,函数的调用,函数的参数,那么来聊聊函数的结果,有的函数需要有结果,有的函数需要没有结果,比如:

做饭函数,需要有饭这个结果

展示函数,只需要有展示功能,并不需要把展示的内容给到函数调用,(这里要理解展示本身就是一个功能,类似于:你给我看看,嘿嘿嘿)

没有返回值的函数叫做计算型函数

def hello():
    print("hello world") #打印只是一个查看的功能,并不会真的把hello world返回给函数调用

有返回值的函数叫做返回型函数

def hello():
    return "hello world" #这个函数功能就是返回 hello world,所以函数调用会得到hello world

1)python函数当中使用return来返回结果

2)一个函数只可以有一个return,return结束函数结束

3)return的结果不会自动显示出来,他只是个结果,可以运算,如果展示需要再次调用展示的方法print

这些就是Python函数的基础常识,关于其他的,比如:匿名函数,函数解包,惰性函数,装饰器这些概念不在基础部分聊,欢迎大家有问题留言讨论。