最近学到 函数 闭包的时候,似懂非懂、迷迷糊糊的样子,很是头疼,今天就特意查了下关于闭包的知识,现将我自己的理解分享如下!
一、python 闭包定义
首先,关于闭包,百度百科是这样解释的:
闭包是指可以包含*(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于*变量被包含在代码块中,这些*变量以及它们引用的对象没有被释放)和为*变量提供绑定的计算环境(作用域)。
当然,这种学术性的解释对于我们小白来说,只能是更加的晦涩难懂。
从python对闭包的定义来说:
必须是内部定义的函数,该函数包含对外部作用域而不是全局作用域名字的引用!
可能这么说还是有点难理解,那咱们换一种方式理解:
python中的闭包从表现形式上可以解释为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包.
举个简单的例子来说明,可能会好理解一些:
def f1():
x = 12
def f2():
print(x)
return f2
f = f1()
print(type(f))
print(f)
f()
代码执行之后的结果如下:
<class 'function'>
<function f1.<locals>.f2 at 0x00000000028EC9D8>
12
结合这段简单的代码和定义来说明闭包:
如果在一个内部函数里:f2()就是这个内部函数,
对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域f1()里面,但不在全局作用域里。
则这个内部函数f2()就是一个闭包。
从函数的定义角度出发:函数可以嵌套使用,可以把函数当成参数或返回值进行传递,函数也可以作为容器类型的元素,作为一个变量可以去赋值。
在这个简单的例子当中,函数f1()中嵌套定义另一个函数f2(),内部的函数f2()引用了外部函数f1()的变量,函数f2()被当成夹带外部变量的 对象 返回给f1(),这样就形成一个闭包函数。
实例化输出的时候 定义的 f=f1()中, 其实 f 就是函数f2()(不准确但是好理解)。这里需要注意的是,f 是一个函数名,加上()就能当作函数来用了。(因为f2()返回的是一串函数执行过程的包)
二、闭包的用途
1、闭包就是为了不动原函数里面的代码,还要给它增加‘新功能’的一种手段。
最直接的例子就是爬取网站代码的闭包函数,不使用的时候,不用执行闭包函数,当需要爬取网站数据时,直接将定义的函数名后加上(),当作函数来使用。
1 from urllib.request import urlopen
2 def get(url):
3 def index():
4 return urlopen(url).read()
5 return index
6
7 python=get('http://www.python.org')
8 print(python) #主函数的内存
9 print(python()) #查看爬取网址之后,获得的网址的具体内容
10 print(python.__closure__[0].cell_contents) #将下载下来的内容翻译,以网址的形式显示下载的网站。
执行结果如下:
<function get.<locals>.index at 0x0000000002E45B70>
b'<!doctype html>\n<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->\n<!--[if gt IE 8]><!--><html class="no-js" lang="en" dir="ltr"> <!--<![endif]-->\n\n<head>\n <meta charset="utf-8">\n <meta http-equiv="X-UA-Compatible" content="IE=edge">\n\n <link rel="prefetch" href="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">\n\n <meta name="application-name" content="Python.org">\n <meta name="msapplication-tooltip" content="The official home of the Python Programming Language">\n <meta name="apple-mobile-web-app-title" content="Python.org">\n <meta name="apple-mobile-web-app-capable" content="yes">\n <meta name="apple-mobile-web-app-status-bar-style" content="black">\n\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <meta name="HandheldFriendly" content="True">\n <meta name="format-detection" content="telephone=no">\n <meta http-equiv="cleartype" content="on">\n <meta http-equiv="imagetoolbar" content="false">\n\n <script src="/static/js/libs/modernizr.js"></script>\n\n <link href="/static/stylesheets/style.css" rel="stylesheet" type="text/css" title="default" />\n <link href="/static/stylesheets/mq.css" rel="stylesheet" type="text/css" media="not print, braille, embossed, speech, tty" />\n \n\n <!--[if (lte IE 8)&(!IEMobile)]>\n <link href="/static/stylesheets/no-mq.css" rel="stylesheet" type="text/css" media="screen" />\n \n \n <![endif]-->\n\n \n <link rel="icon" type="image/x-icon" href="/static/favicon.ico">\n <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/static/apple-touch-icon-144x144-precomposed.png">\n <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/static/apple-touch-icon-114x114-precomposed.png">\n <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/static/apple-touch-icon-72x72-precomposed.png">\n <link rel="apple-touch-icon-precomposed" href="/static/apple-touch-icon-precomposed.png">\n <link rel="apple-touch-icon" href="/static/apple-touch-icon-precomposed.png">\n\n \n <meta name="msapplication-TileImage" content="/static/metro-icon-144x144-precomposed.png"><!-- white shape -->\n <meta name="msapplication-TileColor" content="#3673a5"><!-- python blue -->\n <meta name="msapplication-navbutton-color" content="#3673a5">\n\n <title>Welcome to Python.org</title>\n\n <meta name="description" content="The official home of the Python Programming Language">\n <meta name="keywords" content="Python programming language object oriented web free open source software license documentation download community">\n\n \n <meta property="og:type" content="website">\n <meta property="og:site_name" content="Python.org">\n <meta property="og:title" content="Welcome to Python.org">\n <meta property="og:description" content="The official home of the Python Programming Language">\n \n <meta property="og:image" content="https://www.python.org/static/opengraph-icon-200x200.png">\n <meta property="og:image:secure_url" content="https://www.python.org/static/opengraph-icon-200x200.png">\n \n <meta property="og:url" content="https://www.python.org/">\n\n <link rel="author" href="/static/humans.txt">\n\n \n\n \n <script type="application/ld+json">\n {\n "@context": "http://schema.org",\n "@type": "WebSite",\n "url": "https://www.python.org/",\n "potentialAction": {\n "@type": "SearchAction",\n "target": "https://www.python.org/search/?q={search_term_string}",\n "query-input": "required name=search_term_string"\n }\n }\n </script>\n\n \n <script type="text/javascript">\n var _gaq = _gaq || [];\n _gaq.push([\'_setAccount\', \'UA-39055973-1\']);\n _gaq.push([\'_trackPageview\']);\n\n (function() {\n var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;\n ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';\n var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);\n })();\n </script>\n \n</head>\n\n<body class="python home" id="homepage">\n\n <div id="touchnav-wrapper">\n\n <div id="nojs" class="do-not-print">\n <p><strong>Notice:</strong> While Javascript is not essential for this website, your interaction with the content will be limited. Please turn Javascript on for the full experience. </p>\n </div>\n\n <!--[if lt IE 8]>\n <div id="oldie-warning" class="do-not-print">\n <p><strong>Notice:</strong> Your browser is <em>ancient</em> and <a href="http://www.ie6countdown.com/">Microsoft agrees</a>. <a href="http://browsehappy.com/">Upgrade to a different browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to experience a better web.</p>\n </div>\n <![endif]-->\n\n <!-- Sister Site Links -->\n <div id="top" class="top-bar do-not-print">\n\n <nav class="meta-navigation container" role="navigation">\n\n \n <div class="skip-link screen-reader-text">\n <a href="#content" title="Skip to content">Skip to content</a>\n </div>\n\n \n <a id="close-python-network" class="jump-link" href="#python-network" aria-hidden="true">\n <span aria-hidden="true" class="icon-arrow-down"><span>▼</span></span> Close\n </a>\n\n \n\n<ul class="menu" role="tree">\n \n <li class="python-meta current_item selectedcurrent_branch selected">\n <a href="/" title="The Python Programming Language" class="current_item selectedcurrent_branch selected">Python</a>\n </li>\n \n <li class="psf-meta ">\n <a href="/psf-landing/" title="The Python Software Foundation" >PSF</a>\n </li>\n \n <li class="docs-meta ">\n <a href="https://docs.python.org" title="Python Documentation" >Docs</a>\n </li>\n \n <li class="pypi-meta ">\n <a href="https://pypi.python.org/" title="Python Package Index" >PyPI</a>\n </li>\n \n <li class="jobs-meta ">\n <a href="/jobs/" title="Python Job Board" >Jobs</a>\n </li>\n \n <li class="shop-meta ">\n <a href="/community/" title="Python Community" >Community</a>\n </li>\n \n</ul>\n\n\n <a id="python-network" class="jump-link" href="#top" aria-hidden="true">\n <span aria-hidden="true" class="icon-arrow-up"><span>▲</span></span> The Python Network\n </a>\n\n </nav>\n\n </div>\n\n <!-- Header elements -->\n <header class="main-header" role="banner">\n <div class="container">\n\n <h1 class="site-headline">\n <a href="/"><img class="python-logo" src="/static/img/python-logo.png" alt="python™"></a>\n </h1>\n\n <div class="options-bar do-not-print">\n\n \n <a id="site-map-link" class="jump-to-menu" href="#site-map"><span class="menu-icon">≡</span> Menu</a><form class="search-the-site" action="/search/" method="get">\n <fieldset title="Search Python.org">\n\n <span aria-hidden="true" class="icon-search"></span>\n\n <label class="screen-reader-text" for="id-search-field">Search This Site</label>\n <input id="id-search-field" name="q" type="search" role="textbox" class="search-field" placeholder="Search" value="" tabindex="1">\n\n <button type="submit" name="submit" id="submit" class="search-button" title="Submit this Search" tabindex="3">\n GO\n </button>\n\n \n <!--[if IE]><input type="text" style="display: none;" disabled="disabled" size="1" tabindex="4"><![endif]-->\n\n </fieldset>\n </form><span class="breaker"></span><div class="adjust-font-size" aria-hidden="true">\n <ul class="navigation menu" aria-label="Adjust Text Size on Page">\n <li class="tier-1 last" aria-haspopup="true">\n <a href="#" class="action-trigger"><strong><small>A</small> A</strong></a>\n <ul class="subnav menu">\n <li class="tier-2 element-1" role="treeitem"><a class="text-shrink" title="Make Text Smaller" href="javascript:;">Smaller</a></li>\n <li class="tier-2 element-2" role="treeitem"><a class="text-grow" title="Make Text Larger" href="javascript:;">Larger</a></li>\n <li class="tier-2 element-3" role="treeitem"><a class="text-reset" title="Reset any font size changes I have made" href="javascript:;">Reset</a></li>\n </ul>\n </li>\n </ul>\n </div><div class="winkwink-nudgenudge">\n <ul class="navigation menu" aria-label="Social Media Navigation">\n <li class="tier-1 last" aria-haspopup="true">\n <a href="#" class="action-trigger">Socialize</a>\n <ul class="subnav menu">\n <li class="tier-2 element-1" role="treeitem"><a href="http://plus.google.com/+Python"><span aria-hidden="true" class="icon-google-plus"></span>Google+</a></li>\n <li class="tier-2 element-2" role="treeitem"><a href="http://www.facebook.com/pythonlang?fref=ts"><span aria-hidden="true" class="icon-facebook"></span>Facebook</a></li>\n <li class="tier-2 element-3" role="treeitem"><a href="http://twitter.com/ThePSF"><span aria-hidden="true" class="icon-twitter"></span>Twitter</a></li>\n <li class="tier-2 element-4" role="treeitem"><a href="/community/irc/"><span aria-hidden="true" class="icon-freenode"></span>Chat on IRC</a></li>\n </ul>\n </li>\n </ul>\n </div><div class="account-signin">\n <ul class="navigation menu" aria-label="Social Media Navigation">\n <li class="tier-1 last" aria-haspopup="true">\n \n <a href="/accounts/login/" title="Sign Up or Sign In to Python.org">Sign In</a>\n <ul class="subnav menu">\n <li class="tier-2 element-1" role="treeitem"><a href="/accounts/signup/">Sign Up / Register</a></li>\n <li class="tier-2 element-2" role="treeitem"><a href="/accounts/login/">Sign In</a></li>\n </ul>\n \n </li>\n </ul>\n </div>\n\n </div><!-- end options-bar -->\n\n <nav id="mainnav" class="python-navigation main-navigation do-not-print" role="navigation">\n \n \n<ul class="navigation menu" role="menubar" aria-label="Main Navigation">\n \n \n \n <li id="about" class="tier-1 element-1 " aria-haspopup="true">\n <a href="/about/" title="" class="">About</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/about/apps/" title="">Applications</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/about/quotes/" title="">Quotes</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/about/gettingstarted/" title="">Getting Started</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/about/help/" title="">Help</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="http://brochure.getpython.info/" title="">Python Brochure</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="downloads" class="tier-1 element-2 " aria-haspopup="true">\n <a href="/downloads/" title="" class="">Downloads</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/downloads/" title="">All releases</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/downloads/source/" title="">Source code</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/downloads/windows/" title="">Windows</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/downloads/mac-osx/" title="">Mac OS X</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/download/other/" title="">Other Platforms</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="https://docs.python.org/3/license.html" title="">License</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/download/alternatives" title="">Alternative Implementations</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="documentation" class="tier-1 element-3 " aria-haspopup="true">\n <a href="/doc/" title="" class="">Documentation</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/doc/" title="">Docs</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/doc/av" title="">Audio/Visual Talks</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="https://wiki.python.org/moin/BeginnersGuide" title="">Beginner's Guide</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="https://docs.python.org/devguide/" title="">Developer's Guide</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="https://docs.python.org/faq/" title="">FAQ</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="http://wiki.python.org/moin/Languages" title="">Non-English Docs</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="http://python.org/dev/peps/" title="">PEP Index</a></li>\n \n <li class="tier-2 element-8" role="treeitem"><a href="https://wiki.python.org/moin/PythonBooks" title="">Python Books</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="community" class="tier-1 element-4 " aria-haspopup="true">\n <a href="/community/" title="" class="">Community</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/community/diversity/" title="">Diversity</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/community/irc/" title="">IRC</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/community/lists/" title="">Mailing Lists</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/community/workshops/" title="">Python Conferences</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/community/sigs/" title="">Special Interest Groups</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="https://wiki.python.org/moin/" title="">Python Wiki</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/community/logos/" title="">Python Logo</a></li>\n \n <li class="tier-2 element-8" role="treeitem"><a href="/community/merchandise/" title="">Merchandise</a></li>\n \n <li class="tier-2 element-9" role="treeitem"><a href="/community/awards" title="">Community Awards</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="success-stories" class="tier-1 element-5 " aria-haspopup="true">\n <a href="/about/success/" title="success-stories" class="">Success Stories</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/about/success/#arts" title="">Arts</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/about/success/#business" title="">Business</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/about/success/#education" title="">Education</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/about/success/#engineering" title="">Engineering</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/about/success/#government" title="">Government</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="/about/success/#scientific" title="">Scientific</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/about/success/#software-development" title="">Software Development</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="news" class="tier-1 element-6 " aria-haspopup="true">\n <a href="/blogs/" title="News from around the Python world" class="">News</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/blogs/" title="Python Insider Blog Posts">Python News</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="http://planetpython.org/" title="Planet Python">Community News</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="http://pyfound.blogspot.com/" title="PSF Blog">PSF News</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="http://pycon.blogspot.com/" title="PyCon Blog">PyCon News</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n <li id="events" class="tier-1 element-7 " aria-haspopup="true">\n <a href="/events/" title="" class="">Events</a>\n \n \n\n<ul class="subnav menu" role="menu" aria-hidden="true">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/events/python-events" title="">Python Events</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/events/python-user-group/" title="">User Group Events</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/events/python-events/past/" title="">Python Events Archive</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/events/python-user-group/past/" title="">User Group Events Archive</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="https://wiki.python.org/moin/PythonEventsCalendar#Submitting_an_Event" title="">Submit an Event</a></li>\n \n</ul>\n\n \n </li>\n \n \n \n \n \n</ul>\n\n \n </nav>\n\n <div class="header-banner "> <!-- for optional "do-not-print" class -->\n \n <div id="dive-into-python" class="flex-slideshow slideshow">\n\n <ul class="launch-shell menu" id="launch-shell">\n <li>\n <a class="button prompt" id="start-shell" data-shell-container="#dive-into-python" href="/shell/">>_\n <span class="message">Launch Interactive Shell</span>\n </a>\n </li>\n </ul>\n\n <ul class="slides menu">\n \n <li>\n <div class="slide-code"><pre><code><span class="comment"># Python 3: Fibonacci series up to n</span>\r\n>>> def fib(n):\r\n>>> a, b = 0, 1\r\n>>> while a < n:\r\n>>> print(a, end=\' \')\r\n>>> a, b = b, a+b\r\n>>> print()\r\n>>> fib(1000)\r\n<span class="output">0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987</span></code></pre></div>\n <div class="slide-copy"><h1>Functions Defined</h1>\r\n<p>The core of extensible programming is defining functions. Python allows mandatory and optional arguments, keyword arguments, and even arbitrary argument lists. <a href="//docs.python.org/3/tutorial/controlflow.html#defining-functions">More about defining functions in Python 3</a></p></div>\n </li>\n \n <li>\n <div class="slide-code"><pre><code><span class="comment"># Python 3: List comprehensions</span>\r\n>>> fruits = [\'Banana\', \'Apple\', \'Lime\']\r\n>>> loud_fruits = [fruit.upper() for fruit in fruits]\r\n>>> print(loud_fruits)\r\n<span class="output">[\'BANANA\', \'APPLE\', \'LIME\']</span>\r\n\r\n<span class="comment"># List and the enumerate function</span>\r\n>>> list(enumerate(fruits))\r\n<span class="output">[(0, \'Banana\'), (1, \'Apple\'), (2, \'Lime\')]</span></code></pre></div>\n <div class="slide-copy"><h1>Compound Data Types</h1>\r\n<p>Lists (known as arrays in other languages) are one of the compound data types that Python understands. Lists can be indexed, sliced and manipulated with other built-in functions. <a href="//docs.python.org/3/tutorial/introduction.html#lists">More about lists in Python 3</a></p></div>\n </li>\n \n <li>\n <div class="slide-code"><pre><code><span class="comment"># Python 3: Simple arithmetic</span>\r\n>>> 1 / 2\r\n<span class="output">0.5</span>\r\n>>> 2 ** 3\r\n<span class="output">8</span>\r\n>>> 17 / 3 <span class="comment"># classic division returns a float</span>\r\n<span class="output">5.666666666666667</span>\r\n>>> 17 // 3 <span class="comment"># floor division</span>\r\n<span class="output">5</span></code></pre></div>\n <div class="slide-copy"><h1>Intuitive Interpretation</h1>\r\n<p>Calculations are simple with Python, and expression syntax is straightforward: the operators <code>+</code>, <code>-</code>, <code>*</code> and <code>/</code> work as expected; parentheses <code>()</code> can be used for grouping. <a href="http://docs.python.org/3/tutorial/introduction.html#using-python-as-a-calculator">More about simple math functions in Python 3</a>.</p></div>\n </li>\n \n <li>\n <div class="slide-code"><pre><code><span class="comment"># Python 3: Simple output (with Unicode)</span>\r\n>>> print("Hello, I\'m Python!")\r\n<span class="output">Hello, I\'m Python!</span>\r\n\r\n<span class="comment"># Input, assignment</span>\r\n>>> name = input(\'What is your name?\\n\')\r\n>>> print(\'Hi, %s.\' % name)\r\n<span class="output">What is your name?\r\nPython\r\nHi, Python.</span></code></pre></div>\n <div class="slide-copy"><h1>Quick & Easy to Learn</h1>\r\n<p>Experienced programmers in any other language can pick up Python very quickly, and beginners find the clean syntax and indentation structure easy to learn. <a href="//docs.python.org/3/tutorial/">Whet your appetite</a> with our Python 3 overview.</p>\r\n </div>\n </li>\n \n <li>\n <div class="slide-code"><pre><code><span class="comment"># For loop on a list</span>\r\n>>> numbers = [2, 4, 6, 8]\r\n>>> product = 1\r\n>>> for number in numbers:\r\n... product = product * number\r\n... \r\n>>> print(\'The product is:\', product)\r\n<span class="output">The product is: 384</span></code></pre></div>\n <div class="slide-copy"><h1>All the Flow You’d Expect</h1>\r\n<p>Python knows the usual control flow statements that other languages speak — <code>if</code>, <code>for</code>, <code>while</code> and <code>range</code> — with some of its own twists, of course. <a href="//docs.python.org/3/tutorial/controlflow.html">More control flow tools in Python 3</a></p></div>\n </li>\n \n </ul>\n </div>\n\n\n </div>\n\n \n <div class="introduction">\n <p>Python is a programming language that lets you work quickly <span class="breaker"></span>and integrate systems more effectively. <a class="readmore" href="/doc/">Learn More</a></p>\n </div>\n\n\n </div><!-- end .container -->\n </header>\n\n <div id="content" class="content-wrapper">\n <!-- Main Content Column -->\n <div class="container">\n\n <section class="main-content " role="main">\n\n \n \n\n \n\n \n\n <div class="row">\n\n <div class="small-widget get-started-widget">\n <h2 class="widget-title"><span aria-hidden="true" class="icon-get-started"></span>Get Started</h2>\r\n<p>Whether you\'re new to programming or an experienced developer, it\'s easy to learn and use Python.</p>\r\n<p><a href="/about/gettingstarted/">Start with our Beginner’s Guide</a></p>\n </div>\n\n <div class="small-widget download-widget">\n <h2 class="widget-title"><span aria-hidden="true" class="icon-download"></span>Download</h2>\n<p>Python source code and installers are available for download for all versions! Not sure which version to use? <a href="https://wiki.python.org/moin/Python2orPython3">Check here</a>.</p>\n<p>Latest: <a href="/downloads/release/python-361/">Python 3.6.1</a> - <a href="/downloads/release/python-2713/">Python 2.7.13</a></p>\n </div>\n\n <div class="small-widget documentation-widget">\n <h2 class="widget-title"><span aria-hidden="true" class="icon-documentation"></span>Docs</h2>\r\n<p>Documentation for Python\'s standard library, along with tutorials and guides, are available online.</p>\r\n<p><a href="https://docs.python.org">docs.python.org</a></p>\n </div>\n\n <div class="small-widget jobs-widget last">\n <h2 class="widget-title"><span aria-hidden="true" class="icon-jobs"></span>Jobs</h2>\r\n<p>Looking for work or have a Python related position that you\'re trying to hire for? Our <strong>relaunched community-run job board</strong> is the place to go.</p>\r\n<p><a href="//jobs.python.org">jobs.python.org</a></p>\n </div>\n\n </div>\n\n <div class="list-widgets row">\n\n <div class="medium-widget blog-widget">\n \n <div class="shrubbery">\n \n <h2 class="widget-title"><span aria-hidden="true" class="icon-news"></span>Latest News</h2>\n <p class="give-me-more"><a href="http://blog.python.org" title="More News">More</a></p>\n \n <ul class="menu">\n \n \n <li>\n<time datetime="2017-03-22T03:13:00.000002+00:00"><span class="say-no-more">2017-</span>03-22</time>\n <a href="http://feedproxy.google.com/~r/PythonInsider/~3/C-xfWJKP0-A/python-361-is-now-available.html">Python 3.6.1 is now available. Python 3.6.1 is the ...</a></li>\n \n <li>\n<time datetime="2017-03-05T12:11:00.000006+00:00"><span class="say-no-more">2017-</span>03-05</time>\n <a href="http://feedproxy.google.com/~r/PythonInsider/~3/w2AW2NRSOEM/python-361rc1-is-now-available-for.html">Python 3.6.1rc1 is now available. Python 3.6.1rc1 is the ...</a></li>\n \n <li>\n<time datetime="2017-01-17T08:40:00.000001+00:00"><span class="say-no-more">2017-</span>01-17</time>\n <a href="http://feedproxy.google.com/~r/PythonInsider/~3/NeIHRAidlpc/python-353-and-346-are-now-available.html">Python 3.5.3 and Python 3.4.6 are now available for download. ...</a></li>\n \n <li>\n<time datetime="2017-01-03T02:24:00.000001+00:00"><span class="say-no-more">2017-</span>01-03</time>\n <a href="http://feedproxy.google.com/~r/PythonInsider/~3/UoiMThSwgQM/python-353rc1-and-python-346rc1-are-now.html">Python 3.5.3rc1 and Python 3.4.6rc1 are now available for download. ...</a></li>\n \n <li>\n<time datetime="2016-12-23T10:11:00.000004+00:00"><span class="say-no-more">2016-</span>12-23</time>\n <a href="http://feedproxy.google.com/~r/PythonInsider/~3/4gOtq8ChYHk/python-360-is-now-available.html">Python 3.6.0 is now available! Python 3.6.0 is the ...</a></li>\n \n </ul>\n </div><!-- end .shrubbery -->\n\n </div>\n\n <div class="medium-widget event-widget last">\n \n <div class="shrubbery">\n \n <h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>\n <p class="give-me-more"><a href="/events/calendars/" title="More Events">More</a></p>\n \n <ul class="menu">\n \n \n \n <li>\n<time datetime="2017-04-25T17:00:00+00:00"><span class="say-no-more">2017-</span>04-25</time>\n <a href="/events/python-user-group/517/">Python Meetup Innsbruck: imp.reload(innsbruck)</a></li>\n \n \n \n <li>\n<time datetime="2017-05-05T00:00:00+00:00"><span class="say-no-more">2017-</span>05-05</time>\n <a href="/events/python-events/501/">PyDays Vienna 2017</a></li>\n \n \n \n <li>\n<time datetime="2017-05-05T00:00:00+00:00"><span class="say-no-more">2017-</span>05-05</time>\n <a href="/events/python-events/520/">PyData London 2017</a></li>\n \n \n \n <li>\n<time datetime="2017-05-08T00:00:00+00:00"><span class="say-no-more">2017-</span>05-08</time>\n <a href="/events/python-events/463/">GeoPython 2017</a></li>\n \n \n \n <li>\n<time datetime="2017-05-17T00:00:00+00:00"><span class="say-no-more">2017-</span>05-17</time>\n <a href="/events/python-events/465/">PyCon US 2017</a></li>\n \n \n </ul>\n </div>\n\n </div>\n\n </div>\n\n <div class="row">\n\n <div class="medium-widget success-stories-widget">\n \n\n <div class="shrubbery">\n \n\n <h2 class="widget-title"><span aria-hidden="true" class="icon-success-stories"></span>Success Stories</h2>\n <p class="give-me-more"><a href="/success-stories/" title="More Success Stories">More</a></p>\n\n \n <div class="success-story-item" data-weight="25" id="success-story-2" style="display: none;">\n\n <blockquote>\n <a href="/success-stories/industrial-light-magic-runs-python/">ILM runs a batch processing environment capable of modeling, rendering and compositing tens of thousands of motion picture frames per day. Thousands of machines running Linux, IRIX, Compaq Tru64, OS X, Solaris, and Windows join together to provide a production pipeline used by ~800 users daily. Speed of development is key, and Python was a faster way to code (and re-code) the programs that control this production pipeline.</a>\n </blockquote>\n\n <table cellpadding="0" cellspacing="0" border="0" width="100%" class="quote-from">\n <tbody>\n <tr>\n \n <td><p><a href="/success-stories/industrial-light-magic-runs-python/">Industrial Light & Magic Runs on Python</a> <em>by Tim Fortenberry</em></p></td>\n </tr>\n </tbody>\n </table>\n </div>\n \n\n </div><!-- end .shrubbery -->\n\n </div>\n\n <div class="medium-widget applications-widget last">\n <div class="shrubbery">\n <h2 class="widget-title"><span aria-hidden="true" class="icon-python"></span>Use Python for…</h2>\r\n<p class="give-me-more"><a href="/about/apps" title="More Applications">More</a></p>\r\n\r\n<ul class="menu">\r\n <li><b>Web Development</b>:\r\n <span class="tag-wrapper"><a class="tag" href="http://www.djangoproject.com/">Django</a>, <a class="tag" href="http://www.pylonsproject.org/">Pyramid</a>, <a class="tag" href="http://bottlepy.org">Bottle</a>, <a class="tag" href="http://tornadoweb.org">Tornado</a>, <a href="http://flask.pocoo.org/" class="tag">Flask</a>, <a class="tag" href="http://www.web2py.com/">web2py</a></span></li>\r\n <li><b>GUI Development</b>:\r\n <span class="tag-wrapper"><a class="tag" href="http://wiki.python.org/moin/TkInter">tkInter</a>, <a class="tag" href="https://wiki.gnome.org/Projects/PyGObject">PyGObject</a>, <a class="tag" href="http://www.riverbankcomputing.co.uk/software/pyqt/intro">PyQt</a>, <a class="tag" href="https://wiki.qt.io/PySide">PySide</a>, <a class="tag" href="https://kivy.org/">Kivy</a>, <a class="tag" href="http://www.wxpython.org/">wxPython</a></span></li>\r\n <li><b>Scientific and Numeric</b>:\r\n <span class="tag-wrapper">\r\n<a class="tag" href="http://www.scipy.org">SciPy</a>, <a class="tag" href="http://pandas.pydata.org/">Pandas</a>, <a href="http://ipython.org" class="tag">IPython</a></span></li>\r\n <li><b>Software Development</b>:\r\n <span class="tag-wrapper"><a class="tag" href="http://buildbot.net/">Buildbot</a>, <a class="tag" href="http://trac.edgewall.org/">Trac</a>, <a class="tag" href="http://roundup.sourceforge.net/">Roundup</a></span></li>\r\n <li><b>System Administration</b>:\r\n <span class="tag-wrapper"><a class="tag" href="http://www.ansible.com">Ansible</a>, <a class="tag" href="http://www.saltstack.com">Salt</a>, <a class="tag" href="https://www.openstack.org">OpenStack</a></span></li>\r\n</ul>\r\n\n </div><!-- end .shrubbery -->\n </div>\n\n </div>\n\n \n <div class="pep-widget">\n\n <h2 class="widget-title">\n <span class="prompt">>>></span> <a href="/dev/peps/">Python Enhancement Proposals<span class="say-no-more"> (PEPs)</span></a>: The future of Python<span class="say-no-more"> is discussed here.</span>\n <a aria-hidden="true" class="rss-link" href="/dev/peps/peps.rss"><span class="icon-feed"></span> RSS</a>\n </h2>\n\n\n \n \n </div>\n\n <div class="psf-widget">\n\n <div class="python-logo"></div>\n \n <h2 class="widget-title">\r\n <span class="prompt">>>></span> <a href="/psf/">Python Software Foundation</a>\r\n</h2>\r\n<p>The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers. <a class="readmore" href="/psf/">Learn more</a> </p>\r\n<p class="click-these">\r\n <a class="button" href="/users/membership/">Become a Member</a>\r\n <a class="button" href="/psf/donations/">Donate to the PSF</a>\r\n</p>\n </div>\n\n\n\n\n </section>\n\n \n \n\n \n \n\n\n </div><!-- end .container -->\n </div><!-- end #content .content-wrapper -->\n\n <!-- Footer and social media list -->\n <footer id="site-map" class="main-footer" role="contentinfo">\n <div class="main-footer-links">\n <div class="container">\n\n \n <a id="back-to-top-1" class="jump-link" href="#python-network"><span aria-hidden="true" class="icon-arrow-up"><span>▲</span></span> Back to Top</a>\n\n \n\n<ul class="sitemap navigation menu do-not-print" role="tree" id="container">\n \n <li class="tier-1 element-1">\n <a href="/about/" >About</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/about/apps/" title="">Applications</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/about/quotes/" title="">Quotes</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/about/gettingstarted/" title="">Getting Started</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/about/help/" title="">Help</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="http://brochure.getpython.info/" title="">Python Brochure</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-2">\n <a href="/downloads/" >Downloads</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/downloads/" title="">All releases</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/downloads/source/" title="">Source code</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/downloads/windows/" title="">Windows</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/downloads/mac-osx/" title="">Mac OS X</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/download/other/" title="">Other Platforms</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="https://docs.python.org/3/license.html" title="">License</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/download/alternatives" title="">Alternative Implementations</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-3">\n <a href="/doc/" >Documentation</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/doc/" title="">Docs</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/doc/av" title="">Audio/Visual Talks</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="https://wiki.python.org/moin/BeginnersGuide" title="">Beginner's Guide</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="https://docs.python.org/devguide/" title="">Developer's Guide</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="https://docs.python.org/faq/" title="">FAQ</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="http://wiki.python.org/moin/Languages" title="">Non-English Docs</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="http://python.org/dev/peps/" title="">PEP Index</a></li>\n \n <li class="tier-2 element-8" role="treeitem"><a href="https://wiki.python.org/moin/PythonBooks" title="">Python Books</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-4">\n <a href="/community/" >Community</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/community/diversity/" title="">Diversity</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/community/irc/" title="">IRC</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/community/lists/" title="">Mailing Lists</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/community/workshops/" title="">Python Conferences</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/community/sigs/" title="">Special Interest Groups</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="https://wiki.python.org/moin/" title="">Python Wiki</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/community/logos/" title="">Python Logo</a></li>\n \n <li class="tier-2 element-8" role="treeitem"><a href="/community/merchandise/" title="">Merchandise</a></li>\n \n <li class="tier-2 element-9" role="treeitem"><a href="/community/awards" title="">Community Awards</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-5">\n <a href="/about/success/" title="success-stories">Success Stories</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/about/success/#arts" title="">Arts</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/about/success/#business" title="">Business</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/about/success/#education" title="">Education</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/about/success/#engineering" title="">Engineering</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="/about/success/#government" title="">Government</a></li>\n \n <li class="tier-2 element-6" role="treeitem"><a href="/about/success/#scientific" title="">Scientific</a></li>\n \n <li class="tier-2 element-7" role="treeitem"><a href="/about/success/#software-development" title="">Software Development</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-6">\n <a href="/blogs/" title="News from around the Python world">News</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/blogs/" title="Python Insider Blog Posts">Python News</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="http://planetpython.org/" title="Planet Python">Community News</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="http://pyfound.blogspot.com/" title="PSF Blog">PSF News</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="http://pycon.blogspot.com/" title="PyCon Blog">PyCon News</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-7">\n <a href="/events/" >Events</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="/events/python-events" title="">Python Events</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="/events/python-user-group/" title="">User Group Events</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="/events/python-events/past/" title="">Python Events Archive</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/events/python-user-group/past/" title="">User Group Events Archive</a></li>\n \n <li class="tier-2 element-5" role="treeitem"><a href="https://wiki.python.org/moin/PythonEventsCalendar#Submitting_an_Event" title="">Submit an Event</a></li>\n \n</ul>\n\n \n </li>\n \n <li class="tier-1 element-8">\n <a href="/dev/" >Contributing</a>\n \n \n\n<ul class="subnav menu">\n \n <li class="tier-2 element-1" role="treeitem"><a href="http://docs.python.org/devguide/" title="">Developer's Guide</a></li>\n \n <li class="tier-2 element-2" role="treeitem"><a href="http://bugs.python.org/" title="">Issue Tracker</a></li>\n \n <li class="tier-2 element-3" role="treeitem"><a href="https://mail.python.org/mailman/listinfo/python-dev" title="">python-dev list</a></li>\n \n <li class="tier-2 element-4" role="treeitem"><a href="/dev/core-mentorship/" title="">Core Mentorship</a></li>\n \n</ul>\n\n \n </li>\n \n</ul>\n\n\n <a id="back-to-top-2" class="jump-link" href="#python-network"><span aria-hidden="true" class="icon-arrow-up"><span>▲</span></span> Back to Top</a>\n \n\n </div><!-- end .container -->\n </div> <!-- end .main-footer-links -->\n\n <div class="site-base">\n <div class="container">\n \n <ul class="footer-links navigation menu do-not-print" role="tree">\n <li class="tier-1 element-1"><a href="/about/help/">Help & <span class="say-no-more">General</span> Contact</a></li>\n <li class="tier-1 element-2"><a href="/community/diversity/">Diversity <span class="say-no-more">Initiatives</span></a></li>\n <li class="tier-1 element-3"><a href="https://github.com/python/pythondotorg/issues">Submit Website Bug</a></li>\n <li class="tier-1 element-4">\n <a href="https://status.python.org/">Status <span class="python-status-indicator-default" id="python-status-indicator"></span></a>\n </li>\n </ul>\n\n <div class="copyright">\n <p><small>\n <span class="pre">Copyright ©2001-2017.</span>\n <span class="pre"><a href="/psf-landing/">Python Software Foundation</a></span>\n <span class="pre"><a href="/about/legal/">Legal Statements</a></span>\n <span class="pre"><a href="/privacy/">Privacy Policy</a></span>\n </small></p>\n </div>\n\n </div><!-- end .container -->\n </div><!-- end .site-base -->\n\n </footer>\n\n </div><!-- end #touchnav-wrapper -->\n\n \n <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>\n <script>window.jQuery || document.write(\'<script src="/static/js/libs/jquery-1.8.2.min.js"><\\/script>\')</script>\n\n <script src="/static/js/libs/masonry.pkgd.min.js"></script>\n\n <script type="text/javascript" src="/static/js/main-min.js" charset="utf-8"></script>\n \n\n <!--[if lte IE 7]>\n <script type="text/javascript" src="/static/js/plugins/IE8-min.js" charset="utf-8"></script>\n \n \n <![endif]-->\n\n <!--[if lte IE 8]>\n <script type="text/javascript" src="/static/js/plugins/getComputedStyle-min.js" charset="utf-8"></script>\n \n \n <![endif]-->\n\n \n\n \n \n\n</body>\n</html>\n'
http://www.python.org
2、通过外面的一层层的函数传递的参数,让最内层的函数可以直接调用外层函数所有参数,从而实现不动原函数的代码,增加新功能的办法。
在python中,最恰当的例子就是装饰器!不动源代码,通过装饰器给源代码加上新的功能!
1 import time
2
3 def timer(func):
4 def wrapper(*args,**kwargs):
5 start_time = time.time()
6 func(*args,**kwargs)
7 stop_time = time.time()
8 print("run time is %s"%(stop_time-start_time))
9 return wrapper
10
11 @timer
12 def index(): #index = timer(index)
13 time.sleep(1.5)
14 print("welcome to beijing!")
15
16 @timer
17 def home(name):
18 time.sleep(1)
19 print("welcome to %s home page"%name)
20
21 @timer
22 def auth(name,passwd):
23 time.sleep(0.5)
24 print(name,passwd)
25
26 @timer
27 def tell():
28 print("---***---")
29
30 index()
31 home("alex")
32 auth("alex","alex3714")
33 tell()
执行结果如下:
welcome to beijing!
run time is 1.5000858306884766
welcome to alex home page
run time is 1.0000572204589844
alex alex3714
run time is 0.5000283718109131
---***---
run time is 0.0