16、函数

作者: 唯老 | 来源:发表于2019-03-06 11:50 被阅读82次

    一、简介

    image

    在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程序实体:

    1. 在运行时创建
    2. 能赋值给变量或数据结构中的元素
    3. 能作为参数传给函数
    4. 能作为函数的返回结果

    在 Python 中,所有函数都是一等对象,是面向对象程序设计最基本的单元

    二、什么叫函数

    1、定义

    函数就是把完成特定功能的一段代码封装起来。给该功能起一个名字(函数名)

    在一个完整的项目,某些特定的功能如果被返回使用,那么我们就可以把这些代码封装成函数,当我们要去使用的时候直接调用函数即可

    2、优点

    1. 函数能提高应用的模块性,
    2. 方便管理和维护,便于复用

    Python提供了许多内建函数,比如print() input()。但也可以自己创建函数,这被叫做用户自定义函数。

    三、函数的使用

    3.1、定义函数

    1、语法格式

    def 函数名( 形参列表… ):
        #函数体
        return [expression]
    

    2、语法结构图

    image

    3、说明

    1. def 是定义函数的关键字。
    2. 函数名是这个函数的符号(引用),调用这个函数的时候我们需要函数名。
    3. 函数名后的圆括号是必须的。
    4. 形参列表表示我们可以定义多个形参,必须放在()中间,接受函数调用时传递过来的参数。形参不是必须的,根据需要决定是否需要定义形参
    5. 圆括号后面必须有一个分号:
    6. 函数体缩进四格,封装功能代码块,
    7. return [表达式] 结束函数,不是必须的,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
    8. 当一个文件定义多个函数的时候,函数与代码之间空两行

    4、举个栗子

    1. 定义无参数无返回值的函数
      def show():
          "函数_文档字符串"
          print("自定义函数")
          print("我是函数内的代码2")
      
    2. 定义有参函数,无返回值的,形参在函数内部可以作为普通变量使用
      def add(a, b):
          #空四格
          print(a + b)
      
    3. 定义无参数有返回值的函数
      def get_name():
          name = '隔壁老王'
          return name
      
    4. 定义有参数有返回值的函数
      def add(n1, n2):
          num = n1 + n2
          return num
      

    5、函数命名规则

    1. 可以由字母,下划线,和数字组成
    2. 数字不能开头
    3. 不能与关键字重名
    4. 函数名一般以动词开头
    5. 多个单词小写使用下划线拼接:get_name,set_name,is_delete

    6、函数返回值

    1. 无返回值
      • 不写retrun
      • 仅retrun 不带返回值
      • 使用retrun 返回 None类型(返回对象)
    2. 返回一个对象
    3. 返回多个对象,其实就是返回一个元组,本质是还是一个对象

    3.2、函数调用与引用

    1、说明

    定义函数的目的是为了让函数做一些事情。但是函数如果仅仅定义不会自己去执行。

    时刻记住一句话,函数只有被调用才能被执行!

    所以想要函数执行,必须显示的去调用函数。

    在使用函数的时候,一定要保证声明在前,调用在后!

    2、语法格式

    函数名(实参)

    3、举个栗子

    1. 调用无参函数
      def show():
          print("自定义函数")
          print("我是函数内的代码2")
      show()
      
    2. 调用有参的函数
      def add(a, b):
          print(a + b)
      add(1, 2)
      
    3. 调用有参的函数并返回数据
      def add(n1, n2):
          num = n1 + n2
          return num
      number = add(1,2)
      print(number)
      
    4. 在函数调用时也可以使用*语法,来分解参数的集合
      def func(a,b,c,d):  
          print a,b,c,d  
      func(*(1,2,3,4))  
      func(1,*(2,3),**{'d':4})  
      func(1,c=3,*(2,),**{'d':4}) 
      

    4、注意事项

    1. 函数的引用
      所谓的函数的引用其实就是将一个函数对象赋值给变量,一个函数个可以赋值给多个不同变量
    2. 栗子1
      def func():
          print('函数引用')
      func1 = func
      func2 = func
      func3 = func
      # 实际就是想相当于func()
      func1()
      func2()
      func3()
      

    四、 参数详解

    1、说明

    除了支持正常的参数外,Python函数还支持数量可变的参数。这些参数有主要有三种类别

    完整的语法

    def fun(position_arg, keyword_args,defalut_args, *tuple_args, **dict_kw_args):
        pass
    

    简要说明:

    1. position_arg

      位置参数(必须参数)。必须参数必须以对应的关系一个一个传递进入函数,函数调用时传递的实参必须和函数定义时的形参一一对应,不能多也不能少,顺序也得一致

    2. keyword_args

      关键字参数。指的是调用的时候可以使用参数名的方式传入,特点是传入的时候可以不需要按着顺序出传入

    3. defalut_args

      默认值参数 ,非必传参数 声明了默认值的参数

    4. *tuple_args

      可变长度参数,特点,只能接收未命名的参数,把这些参数先封装到一个列表或元组中

    5. **dict_kw_args

      可变长度参数,特点是将参数放入字典中

    2、 默认参数值

    2.1、说明

    这允许用户为函数的参数定义一些默认值。这种情况下,可以以更少的参数来调用该函数,而函数调用时未提供的参数,Python会使用默认提供的值作为这些参数值

    2.2、举个栗子

    1. 栗子1
      def show_args(arg, agr1,def_arg=1, def_arg2=2):
          return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
      

    2.3、调用方式(三种)

    1. 只提供非缺省位置参数值
      def show_args(arg, def_arg=1, def_arg2=2):
            return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
       show_args("普通参数")
        #指定参数名称 
       show_args(arg="普通参数")
      
    2. 提供的值覆盖一些默认的参数值,包括非缺省位置参数
      def show_args(arg, def_arg=1, def_arg2=2):
            return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
      show_args("普通参数", "默认参数1")
      
    3. 为所有参数提供值,可以用这些值覆盖默认参数值
      def show_args(arg, def_arg=1, def_arg2=2):
            return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
      show_args(arg="普通参数", "默认参数1", "默认参数2")
      

    2.4、注意事项

    1. 必选参数在前,默认参数在后
    2. 有默认值的参数在调用的时候是非必要的

    3、关键字参数(kwarg)

    3.1、说明

    关键字参数是实参里面的概念,以“kwarg=value”的形式使用关键字参数也可以调用函数。其中kwarg指函数定义中使用的参数名称,在调用函数的时候声明某个参数是属于某个关键字的。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
    举个栗子

    1. 栗子1
      def f(name,age):
         print(name,age)
      f(name="小明",18)
      

    4、默认值参数

    4.1、说明

    默认参数是在函数声明的时候,可以给某个参数指定默认值,这样的参数叫做默认值参数。如果在调用函数的时候,默认参数没有接收到对应的实参,那么就会将默认值赋值给这个参数

    4.2、举个栗子

    1. 栗子1
      def f(name,age,sex="男"):
          print(name,age,sex)
      f(name="小明",18)
      

    5、不定长参数(*args)

    5.1、说明

    通常情况下, 定义函数的时候, 我们只能定义有限的形参个数, 实参个数通常情况下也要和形参来定义.

    如果我们想传递任意多个参数给函数, 只能把这些参数先封装到一个列表或元组中, 然后再传进去. 比较麻烦.

    python 提供了可变参数, 可以接受任意多个参数, 然后函数内部会自动的把这些参数封装在一个元组中, 供函数内部使用,注意*args只能接受位置参数

    5.2、举个栗子

    1. 栗子1
      def fun(*args):
          print(args)
      fun("小明",18,"male")
      
    2. 栗子2
      def fun(*args):
          return args
      fun("小明",18,"male")
      

    5.3、注意事项

    1. 函数的形参中最多只能定义一个可变参数, 定义多个可变参数会出现语法错误.
    2. 可变参数一般作为形参中的最后一个参数.
    3. 如果可变参数不是最后一参数, 则给可变参数后的参数赋值的时候只能使用关键字参数赋值

    6、不定长参数( **kwargs)

    6.1、说明

    但是上面的args只能接收未命名的参数,那假如有类似于关键字参数的不定长参数该怎么办呢?python里面使用(变量名)来接收不定长的命名变量参数。同样,python里面也约定俗成使用kwargs接收不定长命名参数。**kwargs接收了不定长参数之后,将这些参数放到一个字典里面,可以通过key获取到相应的参数值

    6.2、举个栗子

    1. 栗子1
       def f(**kwargs):
           print(kwargs)
       f(name="小明",age=18,sex="male")
      

    五、综合

    1、说明

    假如一个函数使用了上面所有种类的参数,那该怎么办?为了不产生歧义,python里面规定了假如有多种参数混合的情况下,遵循如下的顺序使用规则

    def fun(必须参数,默认参数,*args,**kwargs):
        pass
    

    2、举个栗子

    1. 栗子1
      def f(*args,**kwargs):
           print(args)
           for i in kwargs:
               print("%s:%s"%(i,kwargs[i]))
       f(*[100,200,300],**{"a":'abc',"b":31231})
      

    3、注意事项

    函数在执行过程中只要遇到return语句,就会停止执行并返回结果,也可以理解为 return 语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为None,return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出

    相关文章

      网友评论

        本文标题:16、函数

        本文链接:https://www.haomeiwen.com/subject/hdrtpqtx.html