zoukankan      html  css  js  c++  java
  • 函数对象

    一、函数对象

    函数是第一类对象:值的内存地址可以像变量一样去使用
    def foo():#foo=函数的内存地址,可以当做一种变量值去使用
    1、函数可以被引用

    def foo():
      print('hello')
    f=foo
    print(f)
    f()
    

    2、可以当作参数传递

    def foo():
      print('hello')
    f=foo
    print(f)
    f()
    

    3.可以当做函数的返回值

    def foo():
      print('hello')
    def func(x):
      return(x)
    f=func(foo)
    print(f)
    

    4.可以当做容器类的元素

    
    def foo():
      print('hello')
    dic={'1':foo}
    print(dic)
    dic['1'](https://www.cnblogs.com/zhuyuanying123--/p/10952117.html)
    
    def register():
      print('注册')
    def login():
      print('登录')
    def pay():
      print('支付')
    def transfer():
      print('转账')
    dic_choice={'1':register,'2':login,'3':pay,'4':transfer}
    while True:
      print('''
      0 退出
      1 注册
      2 登录
      3 支付
      4 转账
      ''')
      choice=input('请输入你的操作:').strip()
      if choice == '0':break
      if choice not in dic_choice:
        print('输入有误,请重新输入')
        continue
      dic_choice[choice](
    

    二.函数嵌套

    函数的嵌套调用:在一个函数内部调用其他函数
    
    def max2(x,y):
      if x > y:
      return x
    else:
      return y
    
    def max4(a,b,c,d):
      res1=max2(a,b)
      res2=max2(res1,c)
      res3=max2(res2,d)
      return res3
    
    函数的嵌套定义:在函数内又定义了其他函数
    
    from math import pi
    
    def circle(radius,mode=0):
      def perimiter(radius):
        return 2 * pi * radius
    
      def area(radius):
        return pi * (radius ** 2)
    
      if mode == 0:
        return perimiter(radius)
      elif mode == 1:
        return area(radius)
    
    circle(10,0)
    

    三.名称空间和作用域

    存放名字与值内存地址绑定关系的空间 

    def outter():
        x=1111
        def inner():
        print(x)
        return inner
    
      f=outter()
    
      def foo():
        x=2222
        f()
    
      foo()
    输出的是1111
    
    1. len()是python的内置方法,python启动的时候,就会定义len()函数,并且把len()丢入内存空间,这个
    内存空间叫做内置名称空间
    生命周期: python启动的时候就活了,python关闭了就死了
    
    2. 全局名称空间: 除了内置和局部,就是全局
    生命周期:程序/文件运行的时候才会活,运行完毕就死了
     
     3. 局部名称空间: 函数内部的都叫局部,也就是说函数内部定义的名字都放入了局部名称空间中了
    生命周期: 函数运行的时候会活,运行完就死了
    
     python解释器打开的时候,执行顺序: 内置名称空间---> 全局名称空间 ---> 局部名称空间
     查找顺序: 从当前名称空间开始查找,然后逐步往上,如果当前为局部,则顺序为局部-->全局-->内置
    
    • 作用域(作用范围)
      域 指的是区域 范围的的意思
        全局的名称空间和内置的名称空间 在使用上没什么区别
        局部的 和 全局的内置的 就有区别了 局部定义的只能在局部使用

      给三个空间划分范围:
      全局的和内置可以划分为同一个范围
      global 全局作用域

      局部的单独划分为一个范围
      local 局部作用域

      globals()
      locals()

      查看全局作用域中的内容
      print(dir(globals()['builtins']))
      查看局部作用域中的内容 注意:在全局中使用locals 看到的就是全局的内容与globals没有区别

      print(globals())
      print(locals())
    
      age=18
      def func():
        age=19
        print(age) #19
      func()
      print(age) #18
    
      age=18
      def func():
        global age #明确声明要使用全局中的age
        age=19
        print(age) #19
      func()
      print(age) #19
    
      a=1
      def func():
        a=10
        def inner():
          a=100
          print(a) #100
        inner()
        print('这是func中a',a) #这是func中a 10
      func()
      print(a) #1
    
      a=1
      def func():
        a=10
        def inner():
          nonlocal a #明确声明要使用上一层中的a,如果上一层没有则找上上层,但是注意不能找到全局中
          a=100
          print(a) #100
        inner()
        print('这是func中的a',a) #这是func中的a 100
      func()
      print(a) #1
    
  • 相关阅读:
    MySQL存储引擎--MyISAM与InnoDB区别
    HTTP Keep-Alive模式
    php通过curl下载远程图片实例
    使用PHP QR Code生成二维码
    PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()
    SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.
    html头文件设置常用之<meta>设置缓存
    redis使用watch完成秒杀抢购功能
    Linux信号(signal) 机制分析
    php信号处理
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/10955258.html
Copyright © 2011-2022 走看看