python第三天回顾之函数

一、函数

  介绍:

    《不用函数的程序,无组织结构,代码冗余,可读性差,无法统一管理且维护成本高。》

     函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

     函数能提高应用的模块性,和代码的重复利用率。    

  函数有两种: 内置函数,自定义函数

  内置函数有:

      例如: 

        max(),lower(),upper(),len()等系统已经定义好的相关函数。

  1>自定义函数又分为: 无参函数,有参函数,空函数。  《在使用函数时,要先定义后使用,若未定义而使用,则相当于引用了一个没有的变量名》

    *函数代码块以def关键词开头,后接函数标识符名称和圆括号()。

    *任何传入参数和自变量放在圆括号中间。圆括号之间可以用于定义参数。

    *函数的第一行语句可以选择性的使用文档字符串---用于存放函数说明

    *函数内容以冒号起始,并且缩进。

    * return[表达式] 结果函数,选择性的返回一个值给调用方,不带表达式的return相当于返回None

1     自定义函数,例如:
2     def hello():
3           print("hello world!")
4 
5     hello()

  无参函数:    《若函数功能只是执行一些操作,则不需要返回值》

1     def 函数名():
      """文档注释"""
2       函数体

  2> 定义有参函数:  《函数的功能 依赖于外部传入的参数》    

1     def  函数名(参数1,参数2,......):
2         """文档注释"""
3             函数体
4       return 返回值

  3>空函数:  空函数一般在初部写函数时可以用。

1        def 函数名():
2             pass        

  《注:  定义函数时无参,则调用时无参数,定义时有参,调用时必须有参数,函数中可以调用函数的表达式形式,函数可以当作参数来调用。》

  4>函数的返回值:

    函数中没有return 返回为None  <==> return  <==> return None

    函数中有return 一个值函数调用返回的结果为字符串的形式, 多个值返回结果是元组的形式

1         #return #返回一个值
2         def ab():
3             x=1
4             return x
5         res=ab()
6         print(res)            
 1     #return 返回多个值
 2     def ab():
 3         x=1
 4         return 1,[2,3],(4,5),{}
 5     res=ab()
 6     print(res)
 7     a,b,c,d=ab()
 8     print(d)
 9 
10     t=(1,2,3)
11     a,_,_=t
12     print(a)
13 
14      t=(1,2,3,4,5,6,7,8,9)
15     a,*_,c=t
16     print(a)
17     print(c)  #return 值1,值2,值3,...  返回结果:(值1,值2,值3,......)

  5>参数:

    参数分为两种,实参和形参 《注:形参相当于变量名,实参相当于值》

      形参:定义阶段只检测函数体的语法。

      实参:将值传给形参,进行函数体操作.

      

1     def abc(x)  #定义阶段(即定义函数)
2         print(x)
3 
4     abc(1) # 调用阶段(即调用函数)

 

    函数的五种参数:

      位置,关键字,默认,可变长(*args,**kwargs),命名关键字

      位置参数:

          位置形参:必须被值传的参数,即实参中也有相应的值与之对应。

          位置实参:与形参一一对应。

1     def abc(x,y,z):
2         print(x,y,z)
3 
4     abc(1,5,9)#位置实参,与形参一一对应

       关键字参数:  

1         def ab(x,y,z):
2           print(x,y,z)
3 
4       ab(x=2,z=5,y=6) #《关键字参数实参必须在位置实参后面,不能重复对形参传值》    

       默认参数:

          在函数的形参中使用,默认参数必须在非默认参数之后,默认参数的值通常定义成不可变类型

1     def ab(x,y=10) #默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次。
2         print(x,y)
3 
4     ab(1)
5  或
6     a=10
7     def ab(x,y=a)
8       print(x,y)
9     ab(1)

      可变长参数:

          *args:  *会把溢出的按位置定义的实参都接收《以元组的形式赋值给args》

          一般针对于位置实参的。

 1         def foo(x,y,*args):
 2               print(x,y)
 3                print(args)
 4         foo(1,2,3,4,5)
 5 
 6          def add(*args):
 7              res=0
 8              for i in args:
 9                  res+=i
10              return res
11          print(add(1,2,3,4))
12          print(add(1,2))

          **kwargs:  **把溢出的按关键字定义的实参都接收《以字典的形式赋值给kwargs》

          一般针对于关键字实参来使用。

 1        def foo(x, y, **kwargs):  
 2            print(x, y)
 3            print(kwargs)
 4        foo(1,2,a=1,name='jack',age=18)
 5 
 6 
 7        def foo(name,age,**kwargs):
 8            print(name,age)
 9            if 'sex' in kwargs:
10                print(kwargs['sex'])
11            if 'height' in kwargs:
12                print(kwargs['height'])
13 
14        foo('jack',18,sex='male',height='185')
15        foo('jack',18,sex='male')

      命名关键字参数:

        def foo(name,age,*,sex,height):

            *后面定义的参数为命名关键字参数,这类参数必须被传值,且必须以关键字实参的形式去传值。

 1     # def foo(name,age,*,sex='male',height):
 2     #     print(name,age)
 3     #     print(sex)
 4     #     print(height)
 5 
 6     # foo('egon',17,height='185')
 7     #返回结果:
 8     #    egon 17
 9     #    male
10     #    185

函数中的示例:

1 # def foo(name,age=10,*args,sex='male',height,**kwargs):
2 #      print(name)
3
# print(age) 4 # print(args) 5 # print(sex) 6 # print(height) 7 # print(kwargs) 8 # 9 # foo('alex',1,2,3,4,5,sex='female',height='150',a=1,b=2,c=3)
#返回结果为:
# alex
#
1
# (2, 3, 4, 5)
# female
# 150
# {'a': 1, 'b': 2, 'c': 3}
1 #     def foo(*args):
2 #         print(args)
3 
4 #     foo(1,2,3,4) # 1,2,3,4 <=====>*(1,2,3,4)
5 #   将foo内的实参(1,2,3,4) 传给形参args
1     # def foo(x,y,z):
2     #     print(x,y,z)
3     #
4     # # foo(*[1,2,3]) #foo(1,2,3)
    #返回结果为:1 2 3
5 # foo(*[1,2]) #foo(1,2)以位置参数为基准,少一个实参所以会报少参数的错误。
1     # def foo(**kwargs):
2     #     print(kwargs)
3 
4     # foo(x=1,y=2)
5     # 返回结果:{'x': 1, 'y': 2}  
6     # #x=1,y=2  <====>**{'y': 2, 'x': 1}  
1     # def foo(x,y,z):
2     #     print(x,y,z)
3     # 
4     # foo(**{'z':3,'x':1,'y':2})《==》 #foo(x=1,z=3,y=2)
5     # # foo(**{'z':3,'x':1})   #foo(x=1,z=3)  以关键字函数为基准,但少一个实参y与形参对应,所以会报错
1      # def wrapper(*args,**kwargs):
2      #     print(args)
3      #     print(kwargs)
4      #
5      #
6      # wrapper(1,2,3,a=1,b=2)
7     # 返回值:
8      #   (1, 2, 3)
9      #  {'a': 1, 'b': 2}    
10   # *args: *会把位置参数传给args,以元组的形式存放
11   # **kwargs: **会把关键字参数传给kwargs,以字典的形式存放
 1     # def foo(x,y,z):
 2     #     print('from foo',x,y,z)
 3     # def wrapper(*args,**kwargs):
 4     #     print(args) #args=(1,2,3)
 5     #     print(kwargs) #kwargs={'a':1,'b':2}
 6     #     foo(*args,**kwargs) #foo(*(1,2,3),**{'a':1,'b':2})     #foo(1,2,3,b=2,a=1)
 7     # # wrapper(1,2,3,a=1,b=2)
 8             #返回结果为
 9             #    (1, 2, 3)  #---print(args)
10             #   {'a': 1, 'b': 2}# ---print(kwargs)
11             #调用的foo()在传参时报错,foo形参中没有做kwargs实参对应的形参接收
12     # wrapper(1,z=2,y=3)
13             #返回结果为:
14             #       (1,)
15             #        {'z': 2, 'y': 3}
16             #      from foo 1 3 2                                

 

  

 

    

      

 

posted @ 2017-05-20 08:19  冠彭  阅读(115)  评论(0)    收藏  举报