函数对象

在面向对象编程中 一切皆对象

函数在python中是第一类对象

  • 函数可以这么用

    1. 可以被引用

      def func():
      print('hello world !')

      f=func
      f()
    2. 可以当做参数传入

      def func():
      print('hello world !') def func1(func):
      print('hello China !')
      func()

      f = func1(func)
    3. 可以当做函数的返回值

      a = 1
      def func():
      return a
      res = func()
      print(res)

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

      def register():
      print("注册") def login():
      print("登录")

      def check():
      print("查看") l = [register,login,check]
      l[0]()

函数的嵌套

  1. 函数的嵌套调用

    在函数内调用了其他函数

    def func():
    print('hello world !') def func1(func):
    print('hello China !')
    func()

    f = func1(func)
  2. 函数的嵌套定义

    在函数内又定义了其他函数,定义在函数内部的函数只能在函数内部用

    def func():
    print("hello world !")
    def func1():
    print("hello China")
     

名称空间(name space)

  • 定义

    专门存名字的空间,存放名字与值绑定关系 (名字和地址)的地方。

  • 分类

    1. 内置名称空间(print、len、max)

      • 内置名称:存放python解释器自带的名字

      • 生效与失效:在解释器启动时即生效,解释器关闭时失效

    2. 全局名称空间

      • 全局名称:文件级别的名字(顶头写的)即不是内置名称也不是局部名称就是全局名称

      • 生效与失效:在执行文件时生效,在所有文件结束或在执行期间被删除,则失效。

    3. 局部名称空间

      • 局部名称:在函数内的名称就是局部名称

      • 生效与失效:调用时产生,函数结束时结束。函数内的名字和参数都存放于局部空间

    名称空间的加载顺序:内置 >>> 全局 >>> 局部

    名称空间的查找顺序:局部 >>> 全局 >>> 内置

作用域

  • 定义:域》指的是区域,范围的意思,作用域即不同名称作用的范围

  • 全局作用域:包含内置名称空间和全局名称空间的名字

    • 特点:在任何位置都能访问得到

      该范围内的名字会伴随程序整个生命周期

  • 局部作用域:包含局部名称空间的名字

    • 特点:只能在函数内使用

    • 调用时生效,调用结束时失效

    globals(查看全局作用域中的内容) 表示的全局范围 就是所谓的全局作用域

    print(dir(globals()["__builtins__"]))

    locals(查看局部作用域中的内容)要注意的是你在全局中使用locals看到的就是全局的内容,与globals没有什么区别。

    print(locals()) # 在全局中查看作用域,相当于globals


    def func():
    a = 100
    print(locals()) # 在局部空间查看作用域

    func()

    global:明确声明,要使用全局中的名称

    nonlocal:明确声明,要使用上一层中的名称,如上一层没有则找上上层,但是注意 不能找到全局中

    注意:你在全局中使用locals 看到的就是全局的内容

闭包函数

  • 定义:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用,该函数称为闭包函数

  • 作用域关系在函数定义阶段就规定死了,与调用位置无关。

    def outer():
    a = 1
    def inner():
    print(a) return inner

Python函数高级的更多相关文章

  1. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  2. 五年级--python函数高级运用

    一.装饰器 二.迭代器 三.生成器 四.练习 一.装饰器 1.1 闭包函数用法 # 需求: # 执行一个函数前需要认证是否登录,如果登录则不需再登录. # 只认证一次,后续操作无需认证 # 要求认证使 ...

  3. Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)

    一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e.  substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...

  4. 12、Python函数高级(命名空间、作用域、装饰器)

    一.名称空间和作用域 1.命名空间(Namespace) 命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空 ...

  5. python 函数高级功能

    闭包 我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包. # 闭包 # 外部函数的参数被内部函数引用,内部函数对外 ...

  6. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  7. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  8. 进击的Python【第六章】:Python的高级应用(三)面向对象编程

    Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...

  9. 进击的Python【第五章】:Python的高级应用(二)常用模块

    Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...

随机推荐

  1. Java | 基础归纳 | Map.Entry<String, String>

    public class Test { private static Map<String,String> student; private static void init() { st ...

  2. [題解/狀壓dp]POJ_2411_Mondriaan's dream

    关于“我读过很多书,到后来大部分都被我忘记了,那阅读的意义是什么?”的疑问,我看过最巧妙的一个回答:当我还是个孩子的时候,我吃过很多的食物,大部分已经一去不复返而且被我忘记了,但可以肯定的是,它们中的 ...

  3. POJ-1020-Anniversary Cake

    链接:https://vjudge.net/problem/POJ-1020 题意: 给一个宽为s的正方形,再给n个变长为an的小正方形, 判断是否能将这n个小正方形完全填充到这个大正方形里面. 思路 ...

  4. Codeforces 1142A(性质、暴举)

    队友和大佬都什么几种情况啥的……我是把终点都插了,起点随便选一个,暴举答案莽A. ; ll n, k, a, b, aa, minn = INF, maxx = -; set<ll> bb ...

  5. Codeforces Round #497 (Div. 2) C. Reorder the Array

    Bryce1010模板 http://codeforces.com/contest/1008/problems #include <bits/stdc++.h> using namespa ...

  6. Spring+JCaptcha验证码使用示例

    1,导入jcaptcha.jar包,这里用的是1.0版本 2,编写captcha-context.xml配置文件(非必须,可在spring配置文件中直接添加): <?xml version=&q ...

  7. 记一下一道关于finally的题

     题目: public class Test{ public int add(int a,int b){ try { return a+b; } catch (Exception e) { Syste ...

  8. jQuery addClass() 源码解读

    addClass: function( value ) { var classes, elem, cur, clazz, j, i = 0, len = this.length, proceed = ...

  9. solr亿万级索引优化实践-自动生成UUID

    solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09        本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的 ...

  10. java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)

    最近开始学习java并发容器,以补充自己在并发方面的知识,从源码上进行.如有不正确之处,还请各位大神批评指正. 前言: 本人个人理解,看一个类的源码要先从构造器入手,然后再看方法.下面看Bounded ...