2020.6.9 变量表示函数 自定义函数 空函数 自定义函数的错误检查 返回值 函数参数(普通参数 默认参数 可变参数 关键字参数 参数组合)

1、变量表示函数

将一个函数名赋给一个变量,之后可以用该变量表示原函数

A=abs
A(-100)
100

 

2、自定义函数

格式:

def 函数名(参1,参2):

  函数体

缩进代替C中的大括号{ },在def下的缩进表明是同一个函数

def Sort1(A,B):
    if(A>B):
        print(A,'>',B)
    else:
        print(A,'<',B)

Sort1(5,10)
5 < 10

 

3、空函数

用途:还不清楚这个函数要怎么用,但为了保证程序正确,所以提前定义好的函数

格式:函数体写pass

def 函数名(参数……):

  pass

 

4、自定义函数的错误检查

自定义函数可以通过在函数体中调用数据类型检查函数isinstance来进行参数类型检查错误抛出

如果要检查多个参数,可以用一个for循环,分别对这多个参数进行类型检查

def Sort1(A,B):
    for i in (A,B):
        if not isinstance(i,(int,float)):
            raise TypeError('Bad Operated Type!')
            exit()
    if(A>B):
        print(A,'>',B)
    else:
        print(A,'<',B)

 

5、返回值

①多个返回值

return 返回值1,返回值2……

用一个变量承接时,会将所有返回值存入一个元组保存,用多个变量承接,则每个变量都对应一个返回值

def Test2(A):
    return A,-A
A=Test2(5)
B,C=Test2(5)
print(A)
print(B,C)

(5, -5) #A
5 -5    #B,C

②没有返回值

没有return而程序运行完毕后,返回空值None

 

6、参数

普通参数:Fun(X) #单变量

默认参数:Fun(X,n=2) #变量赋值

可变参数:Fun(X,n=2,*cal) #变量前加*

关键字参数:Fun(X,n=2,*cal,**kw) #只能是**kw

参数组合:四种参数都有,但是顺序必须按照上述从前到后的顺序依次排列。

 

①普通参数

直接写在括号中的一个变量,没有特别标识

def Fun(X):

  pass

 

②默认参数

定义时给一个普通参数赋值,当调用函数而该参数缺省时起作用

def Fun(X,n=2):

  pass

a、在调用函数Fun时,如果人为注明了两个参数的值,如

  Fun(2,4)

则第二个参数n会采用传入的值4,而非定义时注明的默认值2

b、如果调用时只写了普通参数X的值,如

  Fun(2)

则第二个参数n取定义时的默认值2

 

普通参数与默认参数间有几点需要注意:

1、普通参数必须在默认参数前

2、默认参数尽量是不可变对象,如果用List对象,可能在调用后改变List的值

3、调用函数时可以人为指明默认参数的值,即类似Fun(2,n=4)这种,但要注意,实参名必须与形参名相同,即不能是d=4,e=4……

 

③可变参数

传入的参数数量是可变的

格式:在参数前加星号*,这样程序在处理地时候,将该参数当做一个元组Tuple传入

在使用时,通常在函数内部,通过for循环迭代访问该可变参数中的每个值。

所以可以把可变参数理解为,传入了一个元组Tuple

例如:一个累加器的程序

def Sum2(*Num):
    sum=0
    for i in Num:
        sum+=i
    return sum
print(Sum2())
print(Sum2(1,3,5,7))

0
16

 

如果有一个List或者Tuple类型的数据想要传入该函数进行运算,可以在实参前加星号*,示例如下

L=[1,3,5,7]
T=(1,3,5,7)
print(Sum2(*L))
print(Sum2(*T))

16
16

或者 在定义函数时,形参前就不加*,此时实参也不用加*

def Sum2(Num):
……
print(Sum2(L))
print(Sum2(T))

16
16

但为了和普通参数区分,可变参数还是加*比较好

 

④关键字参数:

作用:保证前边收到想要参数的同时,不会因为输入者输入了多余的参数而受影响

工作方式:允许传入0或多个含参数名的参数,它们在函数内部自动组装为Dict(Key:Value)类型,Key参数名Value参数值

1 def Person(name,age,**KW):
2     print('name:',name,'age:',age,KW)
3 Person('Leo','23',City='Wuhan',Size='43')
4 
5 #print
6 name: Leo age: 23 {'City': 'Wuhan', 'Size': '43'}

 

注意:1、关键字参数的传入方式一定是Key=Value这种,例如上段实参中的City=xxx,Size=xxx,不能单写一个Value。

2、传入的实参中的Key不加引号,但保存时,Key会自动加引号变为字符串str类型(如上段第3行实参中的City没加引号,第六行输出时自动加上了引号变为了'City')

 

也可以提前构建好一个Dict对象,将之作为参数传入,但应注意传入时要加双星号**

Dict={'City':'Wuhan','Gender':'Male','Height':175,'Weight':70}
Person('Leo',23,**Dict)

#print
name: Leo age: 23 {'City': 'Wuhan', 'Gender': 'Male', 'Height': 175, 'Weight': 70}

 

⑤参数组合

Fun(X,n=2,*args,**KW)

参数顺序必须按照之前我们介绍时候的先后顺序:普通参数,默认参数,可变参数,关键字参数

其中实参中区别最大的是关键字参数,它按照Key=Value的格式传入,所以看到实参中存在Key=Value的情况,一定是关键字参数

 1 def Fun(a,b=2,*args,**KW):
 2     print('a=',a,' b=',b,' args=',args,' KW=',KW)
 3     return
 4 Fun(0)
 5 Fun(0,1)
 6 Fun(0,1,'a')
 7 Fun(0,1,'a','b')
 8 Fun(0,1,*('a','b'))
 9 Fun(0,1,'a','b',A=1)
10 Fun(0,b=1,args=(1,2))
11 
12 #print
13 a= 0  b= 2  args= ()  KW= {}
14 a= 0  b= 1  args= ()  KW= {}
15 a= 0  b= 1  args= ('a',)  KW= {}
16 a= 0  b= 1  args= ('a', 'b')  KW= {}
17 a= 0  b= 1  args= ('a', 'b')  KW= {}
18 a= 0  b= 1  args= ('a', 'b')  KW= {'A': 1}
19 a= 0  b= 1  args= ()  KW= {'args': (1, 2)}

注意第10行,虽然写了args=XXX,但是只有默认参数参数名=参数才会被正确地传递给默认参数,其余的含有名=数(Key=Value)类型都会被归为关键字参数中。

补充:简易理解:

可变参数——*args——Tuple:当List或者Tuple对象传入时,前加单星号*

关键字参数——**kw——Dict:当Dict对象传入时,前加双星号**

 可变参数用*args,关键字参数用**kw是python的习惯,尽量保持这个习惯

posted @ 2020-06-09 16:33  ShineLe  阅读(49)  评论(0)    收藏  举报