函数的基本操作

Posted ddzc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的基本操作相关的知识,希望对你有一定的参考价值。

函数的用法

基本的用法

  • 基本参数分为位置参数和关键字参数,位置参数必须在关键字参数之前,关键字参数也被称为默认参数,如果没有传递该参数则需要会将默认值传递给函数

  • return可以返回一个或者多个值,当返回多个值的时候,结果是由多个值组成的一个元组

    # 用户输入信息,信息写入文件保存
    def file(name, age, level, gender='男'):
      with open('../re_st/article/student_msg.txt', mode='a+',       encoding='utf-8') as f:
          msg = name + ' ' + age + ' ' + gender + ' ' + level
          f.write(msg)
          print()
      return '写入成功'
    
    while True:
      context = input("请选择是否继续输入,如果停止请输入q或者Q,继续请按任意键:")
      if context.upper() == 'Q':
          break
      else:
          name = input('请输入姓名:')
          age = input('请输入年龄:')
          gender = input("请输入性别:")
          level = input('请输入学历:')
          if gender == '':
              print(file(name, age, level))
          else:
              print(file(name, age, gender,level)

动态传参

  • 使用动态传参的原因:当一个函数有很多个形参或者只有一个形参,但是我们希望可以一个参数多写几个实参或者多个参数只写部分形参的时候,就需要用到动态传参,形参设定成任意参数

  • 星号表示任意的,args,food作为形参,那么可以传递多个参数

  • 任意参数必须放在位置参数的后边, 同时必须放在默认值参数, 默认值参数必须放在所有参数的最后边, 默认值参数传递的时候最好还是key=value形式传实参。

  • 动态传递关键字参数:**kwargs

    # 任意参数的传递
    def eat(*food):
      return ('我姓吃',food)
    print(eat('沙拉','苹果','玉米'))
    
    # 任意关键字参数的传递
    def eat(**kwargs):
      return kwargs
    print(eat(good_food='家常菜', bad_food='外卖'))
    # 任意关键字参数传递必须用key=value形式

命名空间和作用域

命名空间
  • 命名空间:
    • 内置命名空间:python解释器内部运行的函数和变量,搭载基本的运行环境
    • 全局命名空间:开发者声明在py文件中的变量和第一层的函数
    • 局部命名空间:在函数内部声明的函数或者变量
  • 加载顺序:
    • 内置命名空间
    • 全局命名空间
    • 局部命名空间
  • 取值顺序:(就近原则)
    • 局部命名空间
    • 全局命名空间
    • 内置命名空间
作用域
  • 作用域:就是作用的范围,按照生效的范围分为全局作用域和局部作用域

  • 全局作用域:包括内置命名空间和全局命名空间,在整个文件的任何位置都可以使用(遵循从上到下都原则执行)

  • 局部作用域:只能在函数内部使用,本身就是局部命名空间

  • 获取全局和局部命名空间中的函数和变量

    num = 0
    def cal(a,b,c):
      d = 10
      num = a + b + c
      print(globals())
      # 获取到全局和内置命名空间中的所有的函数和变量
      print(locals())
      # 获取到局部命名空间中的所有的函数和变量
      return num
    
    print(cal(1,2,4))
    # 这里需要注意的是globals()和locals()如果放在全局命名空间,获取的内容是一样的,因为是在全局,只有放在局部命名空间才能区分开。
  • 全局变量在全局都起作用,局部变量只在函数体内起作用。如果在函数内部声明引用全局变量,并且给全局变量进行新的赋值,那么全局变量已经发生变化,不再是最开始定义的值了。

    a = 10
    def func():
      global a
      # 声明函数内使用全局变量,如果没有global,那么下边的a是局部的
      a = a + 10
      # 给全局变量重新赋值
      print(a)
    func()
    print(a)
    # 结果是:
    20 20
  • nonlocal和global的区别

    • nonlocal:找的是局部里不是自己函数内的变量,一般指的是外层函数定义的变量,内层函数通过nonlocal进行重新赋值使用
    • global:找的是全局中的变量,global也可以把把全局的变量拉入到函数内进行重新的赋值操作,改变全局的值。也可以在局部直接直接通过global来创建全局变量(升华为全局)

以上是关于函数的基本操作的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

如何有条件地将 C 代码片段编译到我的 Perl 模块?

前端面试题之手写promise

jQuery的DOM操作