1.数学意义上的函数:y=2*x+1

python中的函数:一般的定义方式如下

def test(x):         #定义一个变量,注意,也可以不用定义自变量
    #写一段注释,说这个函数是什么特定功能#
    x+=1       #代码块的处理逻辑
    return x           #返回一个函数值即y

函数的具体调用:
def test(x):
#x:传入整形
#函数功能:运算
y=2*x+1
return y
y=test(19) #调用函数
print(y)

2.为什么要有函数?

举例:你的老板让你实现一个功能:当cpu/memory\disk等指标超过一定阈值时报警

你写了一个代码:

 

while   True:
    if cpu>=90:
        报警
    if memory>=90:
        报警
    if ...:
        #无穷无尽很麻烦!!

 

  函数的优良特征:

    1.减少了代码重用

    2.保持一致性,易维护

    3.可扩展性,后期增加功能的时候很方便

 

3.函数和过程,即函数值的返回

函数:就是以上定义的形式

过程:就是没有返回值的函数

def test01():
msg="hello yxz"
print(msg) #定义了一个过程,没有返回值
def test02():
msg="fuck u"
print(msg)
return msg #定义了一个函数,有返回值
t1=test01() #将返回的值赋予了t1,t2
t2=test02()
print(t1)
print(t2)
#程序的执行结果为:

  hello yxz         ##执行了函数test01的打印功能
  fuck u     ##执行了函数test02的打印功能
  None        #test01 没有写return,所以返回了一个None
  fuck u        #test02 将msg的值进行了return

总结:

  返回值数=0:返回none

  返回值数=1:返回object

  返回值>1:返回一个元组

4.函数参数

1.形参和实参

def cal(x,y):            #这里的xy就是形参,在调用的时候才会占据内存空间
    res=x**y
    return res
t=cal(2,3)                #这里的2,3就是实参,是实实在在赋予给函数的值
print(t)                 #输出结果:8
#实参可以是常量,变量,函数,表达式....
a=2
b=5
t1=cal(a,b)           #这里的形参就是变量而不是常量
print(t1)

def cal(x,y):            #这里的xy就是形参,在调用的时候才会占据内存空间
res=x**y
return res
t=cal(2,3) #这里的2,3就是实参,是实实在在赋予给函数的值
print(t) #输出结果:8
print(x) #这里会报错,因为形参只有在函数调用的时候才会赋予内存,单独的打印一个x是没意义的


位置参数和关键字参数
def test(x,y,z):
print(x)
print(y)
print(z)
test(1,2,3) #运行的时候相当于把实参123传给了形参123,然后继续运行函数里的内容
#1,2,3在这里就是位置参数,因为对应的是上面的xyz三个位置,且必须一一对应
test(y=1,x=4,z=9)
#y=1,x=4,z=9就是关键字参数,特点是,位置无需固定,自己想咋整就咋整

!!注意给形参赋予实参时,可以混着来,即又用位置参数,又用关键字参数
!!但是一定注意,位置参数一定要在关键字参数的左边
def test(x,y,z):
    print(x)
print(y)
print(z)
test(1,14,z=16) #这么写才可以

默认参数
def handle(x,type="c"):
print(x)
print(type)
handle("yxz") #输出结果为 yxz c,因为第二个参数没有定义,所以使用的就是默认参数
      #如果就是想给type赋值的话,就这么写
handle("yxz","fuck") #输出结果为 yxz fuck ,因为给type赋予了自己想要的而不是默认的值

参数组:非固定长度的参数
def test(x,*args):             #一个*,系统会把第一个输出的实参赋予给x,剩下的以列表的形式赋予args
    print(x)
    print(args)
test(1,2,3,4,5,6)
#输出结果为:1       (2, 3, 4, 5, 6)
test(1)                #后面的值不传也可以,相当于第二个值为空值
#输出结果为1 ()

自己小总结,按照

def test(x,*args)的形式进行传值,如果传入一个,就给第一个传,第二个为空。如果传入两个或者两个以上,那么第一个传给x,后面的东西全部按照元组的形式放在了一起
def test(x,*args):             #一个*,系统会把第一个输出的实参赋予给x,剩下的以列表的形式赋予args
print(x)
print(args)
test(1,*[7,8,9,9])
#输出结果为1 (7,8,9,9) 赋予的时候,第二个实参加了一个*,就是把列表中的所有元素传进去
test(1,[7,8,9,9])
#输出结果为1 ([7, 8, 9, 9],) 赋予的时候,第二个实参是一个列表,所以就将这个列表当作一个元素传给了元组


一个*后面写args,将实参传给形参的时候只能写位置参数的方式去传;如果我们想写变量名参数的话,就必须用到字典,**kargs,
详情看下面的例子

def test(x,**kwargs):             #一个**,系统会把第一个输出的实参赋予给x,剩下的以字典的形式赋予kargs
print(x)
print(kwargs)
test(1,a=1,b=2) ##输出结果为1 {'a': 1, 'b': 2}