函数(二)

函数

函数的定义与调用

 此处所讲的函数的定义与调用的规则主要针对的是用户自定义函数

'''
      1. 函数的调用一定要在定义之后
           函数在定义完成之前调用,该函数名是没有作用的(会报错),所以函数的调用应该在定义之后

      2. 函数在定义阶段,不会执行函数体代码,但是会检测基础语法

      3. 函数体代码只有调用函数的时候才会执行,函数的调用是通过函数名+小括号实现的,其中括号内如果在定义阶段有参数的话需要传递参数

      4. 函数名相当于变量名指向函数体代码所在的内存空间
'''
      # 例:
          func_name()  # 报错
          def func_name():  # 定义函数变量名
              print('CHINA NO.1')  # 函数体代码
          func_name()  # 成功调用

函数的分类

内置函数

 Python解释器提前已经定义好的函数,是可以直接调用的。比如我们经常使用的函数关键字:print、open、len等。这些内置函数的内部代码是可以通过ctrl+鼠标左键或者鼠标长时间指向该关键字进行查看

自定义函数

 自定义函数就是指程序员自己编写定义的函数。自定义函数又可以分为有参数函数、无参函数、和空函数三种。

'''
      1. 有参函数:在函数定义时小括号里有参数,调用阶段也必须写参数
          例:
              def func_name(arg):  # 定义函数变量名
                  print(arg)  # 函数体代码
              func_name('hahaha')  # 成功调用,输出结果为  hahaha


      2. 无参函数:在函数定义时小括号里没有参数,调用阶段无需在括号里写参数
          例:
              def func_name():  # 定义函数变量名
                  print('CHINA NO.1')  # 函数体代码
              func_name()  # 成功调用

      3. 空函数:在函数定义时函数体代码为pass或者...进行语法结构补全。其实该函数暂时无任何功能。空函数的作用目前有:罗列程序功能框架,使程序结构框架更清晰。

函数的返回值

 函数的返回值即函数的定义阶段,尾部return返回的那个数据。其实就是函数调用后返回的结果。

      # 例:
            str1 = 'CHINA NO.1'
            res = len(str1)  # 获取len的返回值赋给res
            print(res)

获取函数返回值

变量名 = 函数调用

关于函数返回值

  • 函数定义阶段没有return的时候,返回值是None
      def func_name():  # 定义函数变量名
          print('CHINA NO.1')  # 函数体代码
      res = func_name()  # 函数调用后返回值赋给res
      print(res)

  • 函数定义阶段有return,但是其后没有任何值得时候,返回值是None
      def func_name():  # 定义函数变量名
          print('CHINA NO.1')  # 函数体代码
          return
      res = func_name()  # 函数调用后返回值赋给res
      print(res)

  • 函数定义阶段有return,且其后跟了数据,跟什么返回什么
      def func_name():  # 定义函数变量名
          print('CHINA NO.1')  # 函数体代码
          return  'CHINA NO.1'
      res = func_name()  # 函数调用后返回值赋给res
      print(res)

  • return后面可以跟多个返回值,并且所有的返回值会以元组的形式返回出去
      def func_name():  # 定义函数变量名
          print('CHINA NO.1')  # 函数体代码
          return  'CHINA NO.1', 'PUTIN 牛逼'
      res = func_name()  # 函数调用后返回值赋给res
      print(res)

注:定义函数时,注意return不仅有返回值的作用,另一个作用是遇见return直接结束函数体代码的执行

函数的参数

函数的参数分类(参数出现时间)

  • 形式参数
     形式参数是在定义函数时写在函数名后面括号里的参数,简称形参
  • 实际参数
     实际参数是在调用函数时写在函数名后面括号里的参数,简称实参

两种参数的关系:形参类似于变量名,实参类似于实际数据,在函数调用时,实参会临时赋值给形参,函数执行结束会自动解除绑定

              def func_name(arg):  # 定义函数变量名
                  print(arg)  # 函数体代码
              func_name('hahaha')  # 函数调用时,字符串'hahaha'会临时赋值给arg,结束后会与参数arg断开绑定

位置参数

 位置参数是在变量名括号内从左至右依次填写的参数,又分为位置形参和位置实参,分别是函数定义和函数调用阶段的参数。

位置参数的特征

  • 位置形参与位置实参在赋值关系时是从左至右依次对应的

  • 位置形参与位置实参的个数一定相同,多一个或者少一个都不行

关键字参数

 关键字参数出现在实参中,作用就是指定给某个形参赋值

      def func_name(name, age):
          print(f'my name is {name}, my age is{age}')
      func_name(age = 23, name = 'oliver')  # 无需考虑参数位置,指定给赋值
      # func_name(23, name = 'oliver')  # 错误
      # func_name(age = 23, 'oliver')  # 错误
      # func_name('oliver', age = 23)  # 相当于位置参数

注:通过后三种实参的情况,我们可以认为,当形参指定不完全时,参数的对应位置不能忽略,否则两个实参会重复绑定给一个形参

默认参数

 默认参数出现在实参中,作用是给某个参数设定一个默认值,当没有数据传给该参数时,默认参数值就会是该参数的值,有数据传给该参数的话,会使用传入的值,注意默认参数一定要在位置的参数后面

      def func_name(name, age, job = 'student'):  # 定义参数是将job参数的默认值设定为student
          print('#' * 16)
          print(f'my name is {name}\nmy age is {age}\nmy job is {job}')
          print('#' * 16)
      func_name('oliver', 23, 'no job')  # 有第三参数时直接使用传给的第三参数值
      func_name('kevin', 23, 'major')
      func_name('tony', 23)  # 无第三参数时是直接使用默认参数值作为第三参数

可变长参数

 可变长参数产生的背景:为了保证在定义函数时,传入参数多余的话,仍然不影响该函数的功能。

'*'号

 在定义函数时,可以用''加变量名将多余的位置参数收集到一个元组里去,然后将该元组赋值给''后面的变量名。

      def func_name(name, age, *args):
          print(f'名字:{name}\n年龄:{age}\n多余参数:{args}')
      func_name('oliver', 23, 66, 88, 99)

注:此处的实参个数是需要等于或者大于位置形参的,否则会报错。应用该方法是首先要满足位置形参的个数需求

'**'号

 ''在定义函数时,可以用''加变量名将多余的关键字参数收集到一个字典里去,然后将该字典赋值给'*'后面的变量名。

      def func_name(name, age, **kwargs):
          print(f'名字:{name}\n年龄:{age}\n多余参数:{kwargs}')
      func_name(name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)

可变长形参('*','**')

 可变长形参是指如果在不确定函数有多少实际参数时,可以采用'*'和'**'都用的方法,保证无论传给该函数的参数有多少,函数都可以正常执行

      def func_name(*args, **kwargs):
          print(f'位置参数:{args}\n关键字参数:{kwargs}')
      func_name('oliver', 23, 66, 88, 99, name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)

可变长参数在实参中的作用

      # '*'和'**'在实际参数中的作用效果作用对象不同,其实作用效果差不多
      # '*'在实参中的作用主要是将列表和元组的元素暴露出来,以位置参数的形式依次传入函数
      # '**'在实参中的作用是将字典的内容打散成字典,以字典的形式传入函数
      def func_name(*args, **kwargs):
          print(f'位置参数:{args}\n关键字参数:{kwargs}')
      func_name('oliver', 23, 66, 88, 99, name = 'oliver',age = 23, hobby = 'music', salary = 88, born_age = 99)

2022/03/16结束

posted @ 2022-03-16 20:04  Oliver-Chance  阅读(108)  评论(0)    收藏  举报