【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一、命名空间与作用域
命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值
1.命名空间的定义
- name='egon' #定义变量
- def func(): #定义函数
- pass
- class Foo: #定义类
- pass
2.命名空间的分类
- 1.内置名称空间: 随着python解释器的启动而产生,包括异常类型、内建函数和特殊方法,可以代码中任意地方调用
- print(sum)
- print(max)
- print(min)
- print(max([1,2,3]))
- import builtins
- for i in dir(builtins): #打印所有的内置函数
- print(i)
输出
- <built-in function sum>
- <built-in function max>
- <built-in function min>
- 3
- ArithmeticError
- AssertionError
- AttributeError
- BaseException
- BlockingIOError
- BrokenPipeError
- BufferError
- BytesWarning
- ChildProcessError
- ConnectionAbortedError
- ConnectionError
- ConnectionRefusedError
- ConnectionResetError
- DeprecationWarning
- EOFError
- Ellipsis
- EnvironmentError
- Exception
- False
- FileExistsError
- FileNotFoundError
- FloatingPointError
- FutureWarning
- GeneratorExit
- IOError
- ImportError
- ImportWarning
- IndentationError
- IndexError
- InterruptedError
- IsADirectoryError
- KeyError
- KeyboardInterrupt
- LookupError
- MemoryError
- NameError
- None
- NotADirectoryError
- NotImplemented
- NotImplementedError
- OSError
- OverflowError
- PendingDeprecationWarning
- PermissionError
- ProcessLookupError
- RecursionError
- ReferenceError
- ResourceWarning
- RuntimeError
- RuntimeWarning
- StopAsyncIteration
- StopIteration
- SyntaxError
- SyntaxWarning
- SystemError
- SystemExit
- TabError
- TimeoutError
- True
- TypeError
- UnboundLocalError
- UnicodeDecodeError
- UnicodeEncodeError
- UnicodeError
- UnicodeTranslateError
- UnicodeWarning
- UserWarning
- ValueError
- Warning
- ZeroDivisionError
- __build_class__
- __debug__
- __doc__
- __import__
- __loader__
- __name__
- __package__
- __spec__
- abs
- all
- any
- ascii
- bin
- bool
- bytearray
- bytes
- callable
- chr
- classmethod
- compile
- complex
- copyright
- credits
- delattr
- dict
- dir
- divmod
- enumerate
- eval
- exec
- exit
- filter
- float
- format
- frozenset
- getattr
- globals
- hasattr
- hash
- help
- hex
- id
- input
- int
- isinstance
- issubclass
- iter
- len
- license
- list
- locals
- map
- max
- memoryview
- min
- next
- object
- oct
- open
- ord
- pow
- property
- quit
- range
- repr
- reversed
- round
- set
- setattr
- slice
- sorted
- staticmethod
- str
- sum
- super
- tuple
- type
- vars
- zip
- 2.全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间
- x=1 #全局命名空间
- def func():
- money=2000 #非全局
- x=2
- print('func')
- print(x)
- print(func)
- func()
- 3.局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解绑定
- x=10000 #全局
- def func():
- x=1 #局部
- def f1():
- pass
3.作用域
命名空间的可见性就是作用域
- 1. 全局作用域:内置名称空间,全局名称空间
- 2. 局部作用域:局部名称空间
名字的查找顺序:局部名称空间---》全局名层空间---》内置名称空间
查看全局作用域内的名字:gloabls()
查看局部作用域内的名字:locals()
全局作用域的名字:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕
局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效
- x=1000
- def func(y):
- x=2
- print(locals())
- print(globals())
- func(1)
输出
- {'y': 1, 'x': 2}
- {'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10c436c88>, '__package__': None, '__cached__': None, '__file__': '/Users/hexin/PycharmProjects/py3/day4/2.py', 'func': <function func at 0x10c3c9f28>, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, '__doc__': None, 'time': <module 'time' (built-in)>, '__name__': '__main__', 'x': 1000}
二、闭包函数
简单来说,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。
闭包函数须满足以下条件:
1. 定义在内部函数;
2. 包含对外部作用域而非全局作用域的引用;
例
- def f1():
- x = 1
- def f2():
- print(x)
- return f2
- f=f1()
- print(f)
- x=100
- f()
- print(x)
输出
- <function f1.<locals>.f2 at 0x107714400>
- 1
- 100
闭包应用
- from urllib.request import urlopen
- def index(url):
- def get():
- return urlopen(url).read()
- return get
- oldboy=index('http://crm.oldboyedu.com')
- print(oldboy().decode('utf-8'))
输出
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>OldboyCRM</title>
- <!--Bootstrap Stylesheet [ REQUIRED ]-->
- <link href="/static/css/bootstrap.min.css" rel="stylesheet">
- <link href="/static/css/custom.css" rel="stylesheet">
- <!--Nifty Stylesheet [ REQUIRED ]-->
- <link href="/static/css/nifty.min.css" rel="stylesheet">
- <!--Font Awesome [ OPTIONAL ]-->
- <link href="/static/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet">
- <!--Bootstrap Validator [ OPTIONAL ]-->
- <link href="/static/plugins/bootstrap-validator/bootstrapValidator.min.css" rel="stylesheet">
- <!--Demo [ DEMONSTRATION ]-->
- <link href="/static/css/demo/nifty-demo.min.css" rel="stylesheet">
- <!--Bootstrap Datepicker [ OPTIONAL ]-->
- <link href="/static/plugins/bootstrap-datepicker/bootstrap-datepicker.css" rel="stylesheet">
- </head>
- <body>
- <div id="container" class="effect mainnav-lg">
- <div id="page-title">
- <h1 class="page-header text-overflow">老男孩IT教育 | 只培养技术精英</h1>
- </div>
- <div id="page-content">
- <div class="row">
- <div class="col-lg-12">
- <div class="panel">
- <div class="panel-heading">
- <h3 class="panel-title">学员平台</h3>
- </div>
- <div class="panel-body" style="">
- <h4><a class="btn-link" href="/grade/single/">成绩查询</a></h4>
- <h4><a class="btn-link" href="/scholarship/">奖学金政策</a></h4>
- <h4><a class="btn-link" href="/training_contract/">培训协议查询</a></h4>
- <h4><a class="btn-link" href="/compliant/">投诉建议</a></h4>
- <h4><a class="btn-link" href="/stu_faq/">学员常见问题汇总</a></h4>
- <h4><a class="btn-link" href="/stu/">学员登录</a></h4>
- </div> <!--end panel-body-->
- </div> <!--end panel-->
- </div> <!--end col-lg-12-->
- </div><!--end row-->
- </div><!--end page-content-->
- </div>
- <!--jQuery [ REQUIRED ]-->
- <script src="/static/js/jquery-2.1.1.min.js"></script>
- <!--BootstrapJS [ RECOMMENDED ]-->
- <script src="/static/js/bootstrap.min.js"></script>
- <!--Nifty Admin [ RECOMMENDED ]-->
- <script src="/static/js/nifty.min.js"></script>
- <!--jquery-cookie-->
- <script src="/static/js/jquery.cookie.js"></script>
- <script src="/static/js/ajax_comm.js"></script>
- <!--Bootstrap Wizard [ OPTIONAL ]-->
- <script src="/static/plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script>
- <!--Bootstrap Validator [ OPTIONAL ]-->
- <script src="/static/plugins/bootstrap-validator/bootstrapValidator.min.js"></script>
- <!--Demo script [ DEMONSTRATION ]-->
- <script src="/static/js/demo/nifty-demo.min.js"></script>
- <!--Form Wizard [ SAMPLE ]-->
- <script src="/static/js/demo/form-wizard.js"></script>
- <!--Bootstrap Datepicker [ OPTIONAL ]-->
- <script src="/static/plugins/bootstrap-datepicker/bootstrap-datepicker.js"></script>
- </body>
- </html>
三、装饰器
1.定义
装饰器:修饰别人的工具,修饰添加功能,工具指的是函数
装饰器本身可以是任何可调用对象,被装饰的对象也可以是任意可调用对象
2.为什么要用装饰器?
开放封闭原则:对修改是封闭的,对扩展是开放的
装饰器就是为了在不修改被装饰对象的源代码以及调用方式的前提下,为其添加新功能
3.装饰器的实现
装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”
直接看示意图,其中 a 为与装饰器 @a 对应的函数, b 为装饰器修饰的函数,装饰器@a的作用是:
简而言之:@a 就是将 b 传递给 a(),并返回新的 b = a(b)
例如
- def a(name): #与装饰器对应的函数
- return name()
- @a #装饰器 b = a(b)
- def b(): #被装饰函数
- print('hexin')
输出
hexin
解析过程是这样子的:
1.python 解释器发现@a,就去调用与其对应的函数( a 函数)
2.a 函数调用前要指定一个参数,传入的就是@a下面修饰的函数,也就是 b()
3.a() 函数执行,调用 b(),b() 打印“hexin”
5.装饰器的应用
- import time
- def timmer(func):
- def wrapper():
- start_time=time.time()
- func() #index()
- stop_time=time.time()
- print('run time is %s' %(stop_time-start_time))
- return wrapper
- @timmer #index=timmer(index)
- def index():
- time.sleep(1)
- print('welcome to index')
- index()
输出
- welcome to index
- run time is 1.005241870880127
例子
- login_user={'user':None,'status':False}
- def auth(func):
- def wrapper(*args,**kwargs):
- if login_user['user'] and login_user['status']:
- res=func(*args,**kwargs)
- return res
- else:
- name=input('请输入用户名: ')
- password=input('请输入密码: ')
- if name == 'hexin' and password == '':
- login_user['user']='hexin'
- login_user['status']=True
- print('\033[45mlogin successful\033[0m')
- res=func(*args,**kwargs)
- return res
- else:
- print('\033[45mlogin err\033[0m')
- return wrapper
- @auth #index=auth(index)
- def index():
- print('welcome to index page')
- @auth #home=auth(home)
- def home(name):
- print('%s welcome to home page' %name)
- index()
- home('hexin')
输出
- 请输入用户名: heixn
- 请输入密码: 123
- login err
- 请输入用户名: hexin
- 请输入密码: 123
- login successful
- hexin welcome to home page
补充:
装饰器的基本框架:
- def timer(func):
- def wrapper():
- func()
- return wrapper
带参数
- def timer(func):
- def wrapper(*args,**kwargs):
- func(*args,**kwargs)
- return wrapper
【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】的更多相关文章
- Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- 万恶之源 - Python装饰器及内置函数
装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...
- Python装饰器及内置函数
装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...
- Python装饰器、内置函数之金兰契友
装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数.因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展, ...
- python笔记5:装饰器、内置函数、json
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
- python 之 面向对象(多态性、装饰器方法 内置函数补充)
7.6 多态性 1 什么是多态性 多态指的是同一种事物多种形态,在程序中用继承可以表现出多态.多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法 2.为什要用多态 用基类创建一套统一的规 ...
- 文成小盆友python-num4 装饰器,内置函数
一 .python 内置函数补充 chr() -- 返回所给参数对应的 ASCII 对应的字符,与ord()相反 # -*- coding:utf-8 -*- # Author:wencheng.z ...
- day0318装饰器和内置函数
一.装饰器 1.装饰器: 解释:装饰器的本事就是一个函数,不改动主代码的情况下,增加新功能.返回值也是一个函数对象. 2.装饰器工作过程 import time def func(): print(' ...
- Fluent_Python_Part3函数即对象,07-closure-decoration,闭包与装饰器
第7章 函数装饰器和闭包 装饰器用于在源码中"标记"函数,动态地增强函数的行为. 了解装饰器前提是理解闭包. 闭包除了在装饰器中有用以外,还是回调式编程和函数式编程风格的基础. 1 ...
随机推荐
- 老李分享:接电话之uiautomator 1
老李分享:接电话之uiautomator poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...
- 测试开发Python培训:实现屌丝的黄色图片收藏愿望(小插曲)
男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些情色图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追求,http://wanimal.lofter.com/ ...
- 如何高效实现扫描局域网IP、主机名、MAC和端口
近几年工作经常使用RFID识读器,智能家居网关,温湿度传感器.串口服务器.视频编码器等,一般是有串口和网口,由于现场原因一般较少使用串口,大多使用网口.连接方法是IP地址和端口,有的设备带搜索软件,有 ...
- java基础--动态代理实现与原理详细分析
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 ...
- jmeter JDBC 连接数据库
1.添加JDBC Connection Configuration 2.添加JDBC Request 3.添加查看结果树 4. 设置下列参数:Database URL:jdbc:mysql://hos ...
- Python爬虫 URLError异常处理
1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try-except语句来包围并捕获相应的异常.下 ...
- Python3.5爬虫统计AcFun所有视频,并按各个类别进行Top100排序展示
前(b)言(b): 前段时间对Python产生了浓厚的兴趣,所以决定入门学习了1个多月,后来某时我需要对tomcat做一个压力测试,于是我想到了用Python写一个压力测试的脚本吧!最后捣鼓出了一个脚 ...
- 最新windows 0day漏洞利用
利用视屏:https://v.qq.com/iframe/player.html?vid=g0393qtgvj0&tiny=0&auto=0 使用方法 环境搭建 注意,必须安装32位p ...
- php判断多维数组的技巧
直接上代码吧: if(count($array) == count($array, 1)){ echo '一维数组'; }else{ echo '多维数组'; } 看了下手册 int count (m ...
- 一款好用的jquery评分插件
一.使用说明 1.jQuery评分插件的功能: 图标显示用户评分,更美观 可实时点击,切换评分 返回用户评分,记录用户评分 实现类似下图效果 2.优点: 美观,方便 3.缺点: 只能用于jquery开 ...