• Day19_名称空间和作用域_函数的嵌套_函数第一类对象的使用_闭包函数


    一. 上节课复习

    1. 为何要使用函数

      1. 解决代码重用问题
      2. 统一维护
      3. 程序的组织结构清晰,可读性强
    2. 定义函数

      1. !!!先定义后使用
      def funcname(arg1,arg2,....)            #funcname = 函数体  
          '''描述信息'''  
             函数体  
             return value  
      
      1. 定义无参函数
        定义有参函数
        定义空函数
    3. 调用函数

      1. 语句形式:foo()
      2. 表达式形式:foo(1,2)
      3. 函数调用作为另外一个函数的参数:print(foo(1,2))
    4. 函数返回值

      1. 不写return--->None
      2. return 一个值--->这个值
      3. return 多个值--->由这多个值组成的元组
    5. 函数的参数

      1. 形参
      2. 实参数
      3. 从实参的角度:
        • 按位置传值 foo(1,2)
        • 按关键字传值 foo(y=1,x=2)
        • 混合传值 foo(1,y=2)
      4. 从形参角度:
        • 位置参数 def foo(x,y,z)
        • 默认参数 def foo(x,y=1)
        • 什么时候用:
          • 在调用函数时,每次调用传入的值都在变化,使用位置参数,变化较小使用默认参数
        • 二者的位置排列:
          • 位置参数必须在默认参数的左边
        • 二者的特性:
          • 位置参数 必须传值,默认参数可传可不传
      5. *args:
      def foo (x,*args)  
      foo(1,2,3,4,5)  
      

      ** kwargs:

      def foo (x,**kwargs)  
      foo(1,y=2,z=3)  
      

    二. 名称空间和作用域

    1. 名称空间
      1. 内置名称空间
      2. 全局名称空间
      3. 局部名称空间
    2. 作用域
      1. 全局作用域
      2. 局部作用域
    3. 名称空间的查询
      1. globals:查询全局名称空间的名字
      2. locals:查询局部名称空间的名字

    三. 函数的嵌套及静态作用域

    1. 嵌套调用
    2. 嵌套定义 !!!函数嵌套时的执行顺序
    def f1():
        x = 1
        print('----->f1 ',x)
        def f2():
            x = 2
            print('---->f2 ',x)
            def f3():
                x = 3
                print('--->f3 ',x)
            f3()
        f2()
    f1()        >>>----->f1  1;---->f2  2;--->f3  3
    

    四.函数是第一类对象的概念

    1. 函数可以被赋值
      def foo():
          print('foo')
      
      print(foo)
      
      f = foo
      print(f)
      
    2. 把函数当成参数传递
      def foo():
          print('foo')
      
      def bar(func):        >>><function foo at 0x00000000003E3F28>;foo
          print(func)
          func()
      
      bar(foo)
      
    3. 把函数当成返回值
      def foo():
          print('foo')
      
      def bar(func):
          print(func)
          return func
      
      f = bar(foo)
      print(f)
      
    4. 把函数当成容器类型的元素去用
      def add():
          print('==========function add')
      
      def    delete():
          print('==========function delete')
      
      def search():
          print('==========function search')
      def change():
          print('==========function change')
      
      def tell_msg():
          msg = '''
          delete:删除
          add:添加
          search:查询
          change:更改
          '''
          print(msg)
      
      cmd_list = {
          'add':add,
          'delete':delete,
          'search':search,
          'change':change
      }
      
      while True:
          tell_msg()
          choice = input('please input your choice: ').strip()
          cmd_list[choice]()
      

    五.闭包

    1. 闭包函数概念:

      • 首先是内部定义的函数,该函数对外部作用域而不是全局作用域名字的引用
      x =1
      
      def f1():
          x = 1000
          def f2():
              print(x)
          return f2
      
      f = f1()
      f()
      print(f.__closure__[0])
      print(f.__closure__[0].cell_contents)
      
      >>><1000
      >>><cell at 0x0000000002177498: int object at 0x0000000001DC9EF0>
      >>>1000
      
      from urllib.request import urlopen
      def f1(url):
          def f2():
              print(urlopen(url).read())
          return f2
      
      baidu = f1('http://www.baidu.com')        #爬网页
      baidu()
      
  • 相关阅读:
    Java基础面试题总结
    mysql面试题总结
    记7.9面试题
    深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制
    jvm类加载子系统
    多线程与高并发基础三
    多线程与高并发基础二
    多线程与高并发基础一
    多线程与高并发笔记一
    Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.
  • 原文地址:https://www.cnblogs.com/sama/p/7868144.html
Copyright © 2020-2023  润新知