zoukankan      html  css  js  c++  java
  • 函数进阶

    • 函数对象(第一类对象,即可以当做被数据传递

    • 四种常见使用方式函数名可以被引用

    1. 函数名可以被传递

    • def func():
          print('from func')
      print(func)                 # 函数名和函数体代码就是存放一个内存地址中,所以打印时会直接输出内存地址<function func at 0x0000000000411E18>
      print(id(func))
      f = func                    # 将函数名传递给另一个变量名,从此时开始f也是一个函数名了
      
      func()
      print(f)
      f()                         # 其实指向的也是函数func指向函数体代码的内存地址

    2. 函数名可以被当做参数传递给其他函数

    3. 函数可以通过返回值返回

    • def index():
          print('index')
      
      
      def func():
          print('func')
          return index            # 返回为index的内存
      res = func()
      print(res)                  # 打印为index的内存地址
      res()                       # 调用index函数体代码

            4. 函数可以被当做容器类型的参数

    • def func():
          print('func')
      print(funnc())
      l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
      print(l)
    • 函数嵌套调用

    • 在函数的内部调用其他函数,将复杂的代码简单化

    • def my_max(x,y):
          if x > y:
              return x
          return y
      
      def my_max4(a,b,c,d):
          res1 = my_max(a,b)
          res2 = my_max(res1,c)
          res3 = my_max(res2,d)
          return res3
      print(my_max4(34,2,130,4))
    • 函数嵌套

    • def outer():
          x = 1
          print('outer')
          def inner():
              print('inner')
          # print(inner)
          return inner
      
      res = outer()           # 强行打印outer() 输出'outer',但是返回值返回的是index的内存地址
                              # print(res)
      res()                   # 借以调用index()来输出'inner'

      调用一个函数以实现另一个函数的代码功能

    • 命名空间(Namespace)

    • 定义:命名空间就是存放变量名和变量值绑定关系的地方,有变量名就有变量值,两者不可分割。

    • 内置命名空间:打开python编辑器后,python默认提前定义好的空间,比如一些内置方法(len,max,min等)

    • 全局命名空间:文件级别的代码,运行py文件时即刻创建,结束时立即销毁

    • 局部命名空间:定义函数后,函数体代码中的变量名就存储在其中。调用的时候创建,未被调用即销毁

           **************************************************** 重点理解*********************************************************

    • x=111
      def outer():
          def inner():
              print('from inner',x)
          return inner
      f=outer()
      def func():
          x=333
          f()                         # 虽然f()到现在才调用但是它不会从当前的位置查找x的地址和值,而是会从f()也就是index()的定义阶段开始查找
      func()
      #最后输出111,而不是333

      说明,局部命名空间中的变量名在其中寻不到值和地址时,函数查找名字的顺序并不会因为 函数调用的位置而改变,而是依旧按照定义时的位置以局部到全局到内置的顺序来查找名字,不会从调用函数的位置按照正确的顺序来查找名字

    • 作用域

    • 定义:作用范围(其中内置空间和全局空间属于全局作用域,局部空间属于局部作用域),变量名和变量值绑定在局部作用域时,只对定义在函数内部的调用有影响,对于全局定义域的代码操作毫无任何影响。而变量名和变量值绑定在全局作用域的时候,其有一定可能会对局部空间中的函数调用产生影响,影响范围更加广泛深远。

    • 利用global函数在局部修改全局定义域中的变量

    • # global 在局部修改全局的不可变数据类型
      # x = []  # 因为列表是可变类型
      x = 10  # 不可变类型
      username = 'messi'
      def func():
          
          global x,username  # 修改全局变量 而不是创建局部名称空间
          x = 24
          username = 'kobe'
      func()
      print(x)
      print(username)
    • 利用nonlocal在局部修改局部定义域中的变量

    • # nonlocal  局部修改局部
      def func():
          x = 1
          def index():
              nonlocal x
              x = 2
              print(x)
          index()
          print(x)            # 本来应该返回的是1,但是nonlobal修改了局部的变量所以就输出了2
      func()
  • 相关阅读:
    正则如何匹配div下的所有<li>标签?
    日历
    生成一定数量的不重复随机数
    PHP微信红包的算法实现探讨
    Flask 快速使用 —— (1)
    Django rest framework(8)---- 视图和渲染器
    Django 组件之 ----- content-type
    Django rest framework(7)----分页
    Django rest framework(6)----序列化(2)
    Django rest framework(5)----解析器
  • 原文地址:https://www.cnblogs.com/ITchemist/p/11167391.html
Copyright © 2011-2022 走看看