在Python中,读写文件这样的资源要特别注意,必须在使用完毕后正确关闭它们。正确关闭文件资源的一个方法是使用try...finally:
try:
f = open('/path/to/file', 'r')
f.read()
finally:
if f:
f.close()
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-3-0bd1c4bd620b> in <module>
1 try:
----> 2 f = open('/path/to/file', 'r')
3 f.read()
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/file'
During handling of the above exception, another exception occurred:
NameError Traceback (most recent call last)
<ipython-input-3-0bd1c4bd620b> in <module>
3 f.read()
4 finally:
----> 5 if f:
6 f.close()
NameError: name 'f' is not defined
写try...finally非常繁琐。Python的with语句允许我们非常方便地使用资源,而不必担心资源没有关闭,所以上面的代码可以简化为:
with open('/path/to/file', 'r') as f:
f.read()
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-4-965e8467ce47> in <module>
----> 1 with open('/path/to/file', 'r') as f:
2 f.read()
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/file'
并不是只有open()函数返回的fp对象才能使用with语句。实际上,任何对象,只要正确实现了上下文管理,就可以用于with语句。
实现上下文管理是通过__enter__和__exit__这两个方法实现的。例如,下面的class实现了这两个方法:
class Query(object):
def __init__(self, name):
self.name = name
def __enter__(self):
print('Begin')
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
print('Error')
else:
print('End')
def query(self):
print('Query info about %s...' % self.name)
这样我们就可以把自己写的资源对象用于with语句:
with Query('Bob') as q:
q.query()
Begin
Query info about Bob...
End
编写__enter__和__exit__仍然很繁琐,因此Python的标准库contextlib提供了更简单的写法,上面的代码可以改写如下:
from contextlib import contextmanager
class Query(object):
def __init__(self, name):
self.name = name
def query(self):
print('Query info about %s...' % self.name)
@contextmanager
def create_query(name):
print('Begin')
q = Query(name)
yield q
print('End')
@contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了:
with create_query('Bob') as q:
q.query()
Begin
Query info about Bob...
End
很多时候,我们希望在某段代码执行前后自动执行特定代码,也可以用@contextmanager实现。例如:
@contextmanager
def tag(name):
print("<%s>" % name)
yield
print("</%s>" % name)
with tag("h1"):
print("hello")
print("world")
<h1>
hello
world
</h1>
上述代码执行结果为:
<h1>
hello
world
</h1>
代码的执行顺序是:
with语句首先执行yield之前的语句,因此打印出<h1>;
yield调用会执行with语句内部的所有语句,因此打印出hello和world;
最后执行yield之后的语句,打印出</h1>。
因此,@contextmanager让我们通过编写generator来简化上下文管理。
如果一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用closing()来把该对象变为上下文对象。例如,用with语句使用urlopen():
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen('https://www.python.org')) as page:
for line in page:
print(line)
b'<!doctype html>\n'
b'<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->\n'
b'<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->\n'
b'<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->\n'
b'<!--[if gt IE 8]><!--><html class="no-js" lang="en" dir="ltr"> <!--<![endif]-->\n'
b'\n'
b'<head>\n'
b' <meta charset="utf-8">\n'
b' <meta http-equiv="X-UA-Compatible" content="IE=edge">\n'
b'\n'
b' <link rel="prefetch" href="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">\n'
b'\n'
b' <meta name="application-name" content="Python.org">\n'
b' <meta name="msapplication-tooltip" content="The official home of the Python Programming Language">\n'
b' <meta name="apple-mobile-web-app-title" content="Python.org">\n'
b' <meta name="apple-mobile-web-app-capable" content="yes">\n'
b' <meta name="apple-mobile-web-app-status-bar-style" content="black">\n'
b'\n'
b' <meta name="viewport" content="width=device-width, initial-scale=1.0">\n'
b' <meta name="HandheldFriendly" content="True">\n'
b' <meta name="format-detection" content="telephone=no">\n'
b' <meta http-equiv="cleartype" content="on">\n'
b' <meta http-equiv="imagetoolbar" content="false">\n'
b'\n'
b' <script src="/static/js/libs/modernizr.js"></script>\n'
b'\n'
b' <link href="/static/stylesheets/style.css" rel="stylesheet" type="text/css" title="default" />\n'
b' <link href="/static/stylesheets/mq.css" rel="stylesheet" type="text/css" media="not print, braille, embossed, speech, tty" />\n'
b' \n'
b'\n'
b' <!--[if (lte IE 8)&(!IEMobile)]>\n'
b' <link href="/static/stylesheets/no-mq.css" rel="stylesheet" type="text/css" media="screen" />\n'
b' \n'
b' \n'
b' <![endif]-->\n'
b'\n'
b' \n'
b' <link rel="icon" type="image/x-icon" href="/static/favicon.ico">\n'
b' <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/static/apple-touch-icon-144x144-precomposed.png">\n'
b' <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/static/apple-touch-icon-114x114-precomposed.png">\n'
b' <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/static/apple-touch-icon-72x72-precomposed.png">\n'
b' <link rel="apple-touch-icon-precomposed" href="/static/apple-touch-icon-precomposed.png">\n'
b' <link rel="apple-touch-icon" href="/static/apple-touch-icon-precomposed.png">\n'
b'\n'
b' \n'
b' <meta name="msapplication-TileImage" content="/static/metro-icon-144x144-precomposed.png"><!-- white shape -->\n'
b' <meta name="msapplication-TileColor" content="#3673a5"><!-- python blue -->\n'
b' <meta name="msapplication-navbutton-color" content="#3673a5">\n'
b'\n'
b' <title>Welcome to Python.org</title>\n'
b'\n'
b' <meta name="description" content="The official home of the Python Programming Language">\n'
b' <meta name="keywords" content="Python programming language object oriented web free open source software license documentation download community">\n'
b'\n'
b' \n'
b' <meta property="og:type" content="website">\n'
b' <meta property="og:site_name" content="Python.org">\n'
b' <meta property="og:title" content="Welcome to Python.org">\n'
b' <meta property="og:description" content="The official home of the Python Programming Language">\n'
b' \n'
b' <meta property="og:image" content="https://www.python.org/static/opengraph-icon-200x200.png">\n'
b' <meta property="og:image:secure_url" content="https://www.python.org/static/opengraph-icon-200x200.png">\n'
b' \n'
b' <meta property="og:url" content="https://www.python.org/">\n'
b'\n'
b' <link rel="author" href="/static/humans.txt">\n'
b'\n'
b' <link rel="alternate" type="application/rss+xml" title="Python Enhancement Proposals"\n'
b' href="https://www.python.org/dev/peps/peps.rss/">\n'
b' <link rel="alternate" type="application/rss+xml" title="Python Job Opportunities"\n'
b' href="https://www.python.org/jobs/feed/rss/">\n'
b' <link rel="alternate" type="application/rss+xml" title="Python Software Foundation News"\n'
b' href="https://feeds.feedburner.com/PythonSoftwareFoundationNews">\n'
b' <link rel="alternate" type="application/rss+xml" title="Python Insider"\n'
b' href="https://feeds.feedburner.com/PythonInsider">\n'
b'\n'
b' \n'
b'\n'
b' \n'
b' <script type="application/ld+json">\n'
b' {\n'
b' "@context": "http://schema.org",\n'
b' "@type": "WebSite",\n'
b' "url": "https://www.python.org/",\n'
b' "potentialAction": {\n'
b' "@type": "SearchAction",\n'
b' "target": "https://www.python.org/search/?q={search_term_string}",\n'
b' "query-input": "required name=search_term_string"\n'
b' }\n'
b' }\n'
b' </script>\n'
b'\n'
b' \n'
b' <script type="text/javascript">\n'
b' var _gaq = _gaq || [];\n'
b" _gaq.push(['_setAccount', 'UA-39055973-1']);\n"
b" _gaq.push(['_trackPageview']);\n"
b'\n'
b' (function() {\n'
b" var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n"
b" ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n"
b" var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n"
b' })();\n'
b' </script>\n'
b' \n'
b'</head>\n'
b'\n'
b'<body class="python home" id="homepage">\n'
b'\n'
b' <div id="touchnav-wrapper">\n'
b'\n'
b' <div id="nojs" class="do-not-print">\n'
b' <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'
b' </div>\n'
b'\n'
b' <!--[if lt IE 8]>\n'
b' <div id="oldie-warning" class="do-not-print">\n'
b' <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'
b' </div>\n'
b' <![endif]-->\n'
b'\n'
b' <!-- Sister Site Links -->\n'
b' <div id="top" class="top-bar do-not-print">\n'
b'\n'
b' <nav class="meta-navigation container" role="navigation">\n'
b'\n'
b' \n'
b' <div class="skip-link screen-reader-text">\n'
b' <a href="#content" title="Skip to content">Skip to content</a>\n'
b' </div>\n'
b'\n'
b' \n'
b' <a id="close-python-network" class="jump-link" href="#python-network" aria-hidden="true">\n'
b' <span aria-hidden="true" class="icon-arrow-down"><span>▼</span></span> Close\n'
b' </a>\n'
b'\n'
b' \n'
b'\n'
b'<ul class="menu" role="tree">\n'
b' \n'
b' <li class="python-meta current_item selectedcurrent_branch selected">\n'
b' <a href="/" title="The Python Programming Language" class="current_item selectedcurrent_branch selected">Python</a>\n'
b' </li>\n'
b' \n'
b' <li class="psf-meta ">\n'
b' <a href="/psf-landing/" title="The Python Software Foundation" >PSF</a>\n'
b' </li>\n'
b' \n'
b' <li class="docs-meta ">\n'
b' <a href="https://docs.python.org" title="Python Documentation" >Docs</a>\n'
b' </li>\n'
b' \n'
b' <li class="pypi-meta ">\n'
b' <a href="https://pypi.python.org/" title="Python Package Index" >PyPI</a>\n'
b' </li>\n'
b' \n'
b' <li class="jobs-meta ">\n'
b' <a href="/jobs/" title="Python Job Board" >Jobs</a>\n'
b' </li>\n'
b' \n'
b' <li class="shop-meta ">\n'
b' <a href="/community/" title="Python Community" >Community</a>\n'
b' </li>\n'
b' \n'
b'</ul>\n'
b'\n'
b'\n'
b' <a id="python-network" class="jump-link" href="#top" aria-hidden="true">\n'
b' <span aria-hidden="true" class="icon-arrow-up"><span>▲</span></span> The Python Network\n'
b' </a>\n'
b'\n'
b' </nav>\n'
b'\n'
b' </div>\n'
b'\n'
b' <!-- Header elements -->\n'
b' <header class="main-header" role="banner">\n'
b' <div class="container">\n'
b'\n'
b' <h1 class="site-headline">\n'
b' <a href="/"><img class="python-logo" src="/static/img/python-logo.png" alt="python™"></a>\n'
b' </h1>\n'
b'\n'
b' <div class="options-bar-container do-not-print">\n'
b' <a href="/psf/donations/" class="donate-button">Donate</a>\n'
b' <div class="options-bar">\n'
b' \n'
b' <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'
b' <fieldset title="Search Python.org">\n'
b'\n'
b' <span aria-hidden="true" class="icon-search"></span>\n'
b'\n'
b' <label class="screen-reader-text" for="id-search-field">Search This Site</label>\n'
b' <input id="id-search-field" name="q" type="search" role="textbox" class="search-field" placeholder="Search" value="" tabindex="1">\n'
b'\n'
b' <button type="submit" name="submit" id="submit" class="search-button" title="Submit this Search" tabindex="3">\n'
b' GO\n'
b' </button>\n'
b'\n'
b' \n'
b' <!--[if IE]><input type="text" style="display: none;" disabled="disabled" size="1" tabindex="4"><![endif]-->\n'
b'\n'
b' </fieldset>\n'
b' </form><span class="breaker"></span><div class="adjust-font-size" aria-hidden="true">\n'
b' <ul class="navigation menu" aria-label="Adjust Text Size on Page">\n'
b' <li class="tier-1 last" aria-haspopup="true">\n'
b' <a href="#" class="action-trigger"><strong><small>A</small> A</strong></a>\n'
b' <ul class="subnav menu">\n'
b' <li class="tier-2 element-1" role="treeitem"><a class="text-shrink" title="Make Text Smaller" href="javascript:;">Smaller</a></li>\n'
b' <li class="tier-2 element-2" role="treeitem"><a class="text-grow" title="Make Text Larger" href="javascript:;">Larger</a></li>\n'
b' <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'
b' </ul>\n'
b' </li>\n'
b' </ul>\n'
b' </div><div class="winkwink-nudgenudge">\n'
b' <ul class="navigation menu" aria-label="Social Media Navigation">\n'
b' <li class="tier-1 last" aria-haspopup="true">\n'
b' <a href="#" class="action-trigger">Socialize</a>\n'
b' <ul class="subnav menu">\n'
b' <li class="tier-2 element-1" role="treeitem"><a href="https://plus.google.com/+Python"><span aria-hidden="true" class="icon-google-plus"></span>Google+</a></li>\n'
b' <li class="tier-2 element-2" role="treeitem"><a href="https://www.facebook.com/pythonlang?fref=ts"><span aria-hidden="true" class="icon-facebook"></span>Facebook</a></li>\n'
b' <li class="tier-2 element-3" role="treeitem"><a href="https://twitter.com/ThePSF"><span aria-hidden="true" class="icon-twitter"></span>Twitter</a></li>\n'
b' <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'
b' </ul>\n'
b' </li>\n'
b' </ul>\n'
b' </div><div class="account-signin">\n'
b' <ul class="navigation menu" aria-label="Social Media Navigation">\n'
b' <li class="tier-1 last" aria-haspopup="true">\n'
b' \n'
b' <a href="/accounts/login/" title="Sign Up or Sign In to Python.org">Sign In</a>\n'
b' <ul class="subnav menu">\n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/accounts/signup/">Sign Up / Register</a></li>\n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/accounts/login/">Sign In</a></li>\n'
b' </ul>\n'
b' \n'
b' </li>\n'
b' </ul>\n'
b' </div>\n'
b'\n'
b' </div><!-- end options-bar -->\n'
b' </div>\n'
b'\n'
b' <nav id="mainnav" class="python-navigation main-navigation do-not-print" role="navigation">\n'
b' \n'
b' \n'
b'<ul class="navigation menu" role="menubar" aria-label="Main Navigation">\n'
b' \n'
b' \n'
b' \n'
b' <li id="about" class="tier-1 element-1 " aria-haspopup="true">\n'
b' <a href="/about/" title="" class="">About</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/about/apps/" title="">Applications</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/about/quotes/" title="">Quotes</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/about/gettingstarted/" title="">Getting Started</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/about/help/" title="">Help</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="http://brochure.getpython.info/" title="">Python Brochure</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="downloads" class="tier-1 element-2 " aria-haspopup="true">\n'
b' <a href="/downloads/" title="" class="">Downloads</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/downloads/" title="">All releases</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/downloads/source/" title="">Source code</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/downloads/windows/" title="">Windows</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/downloads/mac-osx/" title="">Mac OS X</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/download/other/" title="">Other Platforms</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="https://docs.python.org/3/license.html" title="">License</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/download/alternatives" title="">Alternative Implementations</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="documentation" class="tier-1 element-3 " aria-haspopup="true">\n'
b' <a href="/doc/" title="" class="">Documentation</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/doc/" title="">Docs</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/doc/av" title="">Audio/Visual Talks</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="https://wiki.python.org/moin/BeginnersGuide" title="">Beginner's Guide</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="https://devguide.python.org/" title="">Developer's Guide</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="https://docs.python.org/faq/" title="">FAQ</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="http://wiki.python.org/moin/Languages" title="">Non-English Docs</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="http://python.org/dev/peps/" title="">PEP Index</a></li>\n'
b' \n'
b' <li class="tier-2 element-8" role="treeitem"><a href="https://wiki.python.org/moin/PythonBooks" title="">Python Books</a></li>\n'
b' \n'
b' <li class="tier-2 element-9" role="treeitem"><a href="/doc/essays/" title="">Python Essays</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="community" class="tier-1 element-4 " aria-haspopup="true">\n'
b' <a href="/community/" title="" class="">Community</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/community/survey" title="">Community Survey</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/community/diversity/" title="">Diversity</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/community/lists/" title="">Mailing Lists</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/community/irc/" title="">IRC</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/community/forums/" title="">Forums</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="/community/workshops/" title="">Python Conferences</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/community/sigs/" title="">Special Interest Groups</a></li>\n'
b' \n'
b' <li class="tier-2 element-8" role="treeitem"><a href="/community/logos/" title="">Python Logo</a></li>\n'
b' \n'
b' <li class="tier-2 element-9" role="treeitem"><a href="https://wiki.python.org/moin/" title="">Python Wiki</a></li>\n'
b' \n'
b' <li class="tier-2 element-10" role="treeitem"><a href="/community/merchandise/" title="">Merchandise</a></li>\n'
b' \n'
b' <li class="tier-2 element-11" role="treeitem"><a href="/community/awards" title="">Community Awards</a></li>\n'
b' \n'
b' <li class="tier-2 element-12" role="treeitem"><a href="https://www.python.org/psf/codeofconduct/" title="">Code of Conduct</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="success-stories" class="tier-1 element-5 " aria-haspopup="true">\n'
b' <a href="/success-stories/" title="success-stories" class="">Success Stories</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/success-stories/category/arts/" title="">Arts</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/success-stories/category/business/" title="">Business</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/success-stories/category/education/" title="">Education</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/success-stories/category/engineering/" title="">Engineering</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/success-stories/category/government/" title="">Government</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="/success-stories/category/scientific/" title="">Scientific</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/success-stories/category/software-development/" title="">Software Development</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="news" class="tier-1 element-6 " aria-haspopup="true">\n'
b' <a href="/blogs/" title="News from around the Python world" class="">News</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/blogs/" title="Python Insider Blog Posts">Python News</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="http://planetpython.org/" title="Planet Python">Community News</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="http://pyfound.blogspot.com/" title="PSF Blog">PSF News</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="http://pycon.blogspot.com/" title="PyCon Blog">PyCon News</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' <li id="events" class="tier-1 element-7 " aria-haspopup="true">\n'
b' <a href="/events/" title="" class="">Events</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu" role="menu" aria-hidden="true">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/events/python-events" title="">Python Events</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/events/python-user-group/" title="">User Group Events</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/events/python-events/past/" title="">Python Events Archive</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/events/python-user-group/past/" title="">User Group Events Archive</a></li>\n'
b' \n'
b' <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'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' \n'
b' \n'
b' \n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </nav>\n'
b'\n'
b' <div class="header-banner "> <!-- for optional "do-not-print" class -->\n'
b' \n'
b' <div id="dive-into-python" class="flex-slideshow slideshow">\n'
b'\n'
b' <ul class="launch-shell menu" id="launch-shell">\n'
b' <li>\n'
b' <a class="button prompt" id="start-shell" data-shell-container="#dive-into-python" href="/shell/">>_\n'
b' <span class="message">Launch Interactive Shell</span>\n'
b' </a>\n'
b' </li>\n'
b' </ul>\n'
b'\n'
b' <ul class="slides menu">\n'
b' \n'
b' <li>\n'
b' <div class="slide-code"><pre><code><span class="comment"># Python 3: Fibonacci series up to n</span>\r\n'
b'>>> def fib(n):\r\n'
b'>>> a, b = 0, 1\r\n'
b'>>> while a < n:\r\n'
b">>> print(a, end=' ')\r\n"
b'>>> a, b = b, a+b\r\n'
b'>>> print()\r\n'
b'>>> fib(1000)\r\n'
b'<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'
b' <div class="slide-copy"><h1>Functions Defined</h1>\r\n'
b'<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'
b' </li>\n'
b' \n'
b' <li>\n'
b' <div class="slide-code"><pre><code><span class="comment"># Python 3: List comprehensions</span>\r\n'
b">>> fruits = ['Banana', 'Apple', 'Lime']\r\n"
b'>>> loud_fruits = [fruit.upper() for fruit in fruits]\r\n'
b'>>> print(loud_fruits)\r\n'
b'<span class="output">[\'BANANA\', \'APPLE\', \'LIME\']</span>\r\n'
b'\r\n'
b'<span class="comment"># List and the enumerate function</span>\r\n'
b'>>> list(enumerate(fruits))\r\n'
b'<span class="output">[(0, \'Banana\'), (1, \'Apple\'), (2, \'Lime\')]</span></code></pre></div>\n'
b' <div class="slide-copy"><h1>Compound Data Types</h1>\r\n'
b'<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'
b' </li>\n'
b' \n'
b' <li>\n'
b' <div class="slide-code"><pre><code><span class="comment"># Python 3: Simple arithmetic</span>\r\n'
b'>>> 1 / 2\r\n'
b'<span class="output">0.5</span>\r\n'
b'>>> 2 ** 3\r\n'
b'<span class="output">8</span>\r\n'
b'>>> 17 / 3 <span class="comment"># classic division returns a float</span>\r\n'
b'<span class="output">5.666666666666667</span>\r\n'
b'>>> 17 // 3 <span class="comment"># floor division</span>\r\n'
b'<span class="output">5</span></code></pre></div>\n'
b' <div class="slide-copy"><h1>Intuitive Interpretation</h1>\r\n'
b'<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'
b' </li>\n'
b' \n'
b' <li>\n'
b' <div class="slide-code"><pre><code><span class="comment"># Python 3: Simple output (with Unicode)</span>\r\n'
b'>>> print("Hello, I\'m Python!")\r\n'
b'<span class="output">Hello, I\'m Python!</span>\r\n'
b'\r\n'
b'<span class="comment"># Input, assignment</span>\r\n'
b">>> name = input('What is your name?\\n')\r\n"
b">>> print('Hi, %s.' % name)\r\n"
b'<span class="output">What is your name?\r\n'
b'Python\r\n'
b'Hi, Python.</span></code></pre></div>\n'
b' <div class="slide-copy"><h1>Quick & Easy to Learn</h1>\r\n'
b'<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'
b' </div>\n'
b' </li>\n'
b' \n'
b' <li>\n'
b' <div class="slide-code"><pre><code><span class="comment"># For loop on a list</span>\r\n'
b'>>> numbers = [2, 4, 6, 8]\r\n'
b'>>> product = 1\r\n'
b'>>> for number in numbers:\r\n'
b'... product = product * number\r\n'
b'... \r\n'
b">>> print('The product is:', product)\r\n"
b'<span class="output">The product is: 384</span></code></pre></div>\n'
b' <div class="slide-copy"><h1>All the Flow You’d Expect</h1>\r\n'
b'<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'
b' </li>\n'
b' \n'
b' </ul>\n'
b' </div>\n'
b'\n'
b'\n'
b' </div>\n'
b'\n'
b' \n'
b' <div class="introduction">\n'
b' <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'
b' </div>\n'
b'\n'
b'\n'
b' </div><!-- end .container -->\n'
b' </header>\n'
b'\n'
b' <div id="content" class="content-wrapper">\n'
b' <!-- Main Content Column -->\n'
b' <div class="container">\n'
b'\n'
b' <section class="main-content " role="main">\n'
b'\n'
b' \n'
b' \n'
b'\n'
b' \n'
b'\n'
b' \n'
b'\n'
b' <div class="row">\n'
b'\n'
b' <div class="small-widget get-started-widget">\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-get-started"></span>Get Started</h2>\r\n'
b"<p>Whether you're new to programming or an experienced developer, it's easy to learn and use Python.</p>\r\n"
b'<p><a href="/about/gettingstarted/">Start with our Beginner’s Guide</a></p>\n'
b' </div>\n'
b'\n'
b' <div class="small-widget download-widget">\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-download"></span>Download</h2>\n'
b'<p>Python source code and installers are available for download for all versions!</p>\n'
b'<p>Latest: <a href="/downloads/release/python-372/">Python 3.7.2</a></p>\n'
b' </div>\n'
b'\n'
b' <div class="small-widget documentation-widget">\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-documentation"></span>Docs</h2>\r\n'
b"<p>Documentation for Python's standard library, along with tutorials and guides, are available online.</p>\r\n"
b'<p><a href="https://docs.python.org">docs.python.org</a></p>\n'
b' </div>\n'
b'\n'
b' <div class="small-widget jobs-widget last">\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-jobs"></span>Jobs</h2>\r\n'
b"<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"
b'<p><a href="//jobs.python.org">jobs.python.org</a></p>\n'
b' </div>\n'
b'\n'
b' </div>\n'
b'\n'
b' <div class="list-widgets row">\n'
b'\n'
b' <div class="medium-widget blog-widget">\n'
b' \n'
b' <div class="shrubbery">\n'
b' \n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-news"></span>Latest News</h2>\n'
b' <p class="give-me-more"><a href="http://blog.python.org" title="More News">More</a></p>\n'
b' \n'
b' <ul class="menu">\n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-01-24T14:58:00.000003+00:00"><span class="say-no-more">2019-</span>01-24</time>\n'
b' <a href="http://feedproxy.google.com/~r/PythonSoftwareFoundationNews/~3/Y6UYQ_uYO7Y/python-in-education-request-for-ideas.html">The Python Software Foundation Board Committee for Python in Education ...</a></li>\n'
b' \n'
b' <li>\n'
b'<time datetime="2019-01-22T15:00:00.000001+00:00"><span class="say-no-more">2019-</span>01-22</time>\n'
b' <a href="http://feedproxy.google.com/~r/PythonSoftwareFoundationNews/~3/KZNgSRhyRZs/python-software-foundation-fellow.html">It\'s a new year and we are happy to announce ...</a></li>\n'
b' \n'
b' <li>\n'
b'<time datetime="2019-01-09T21:45:00.000002+00:00"><span class="say-no-more">2019-</span>01-09</time>\n'
b' <a href="http://feedproxy.google.com/~r/PythonSoftwareFoundationNews/~3/NXMcoIchkxY/2018-in-review.html">Happy New Year from the PSF! We\xe2\x80\x99d like to highlight ...</a></li>\n'
b' \n'
b' <li>\n'
b'<time datetime="2018-12-24T11:26:00+00:00"><span class="say-no-more">2018-</span>12-24</time>\n'
b' <a href="http://feedproxy.google.com/~r/PythonInsider/~3/KoVsY316T7U/python-372-and-368-are-now-available.html">Python 3.7.2 and 3.6.8 are now available. Python 3.7.2 is the next maintenance release ...</a></li>\n'
b' \n'
b' <li>\n'
b'<time datetime="2018-12-24T11:26:00+00:00"><span class="say-no-more">2018-</span>12-24</time>\n'
b' <a href="http://feedproxy.google.com/~r/PythonInsider/~3/o5ROzg9M8NY/python-372-and-368-are-now-available.html">Python 3.7.2 and 3.6.8 are now available. Python 3.7.2 is the next maintenance release ...</a></li>\n'
b' \n'
b' </ul>\n'
b' </div><!-- end .shrubbery -->\n'
b'\n'
b' </div>\n'
b'\n'
b' <div class="medium-widget event-widget last">\n'
b' \n'
b' <div class="shrubbery">\n'
b' \n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-calendar"></span>Upcoming Events</h2>\n'
b' <p class="give-me-more"><a href="/events/calendars/" title="More Events">More</a></p>\n'
b' \n'
b' <ul class="menu">\n'
b' \n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-01-27T10:00:00+00:00"><span class="say-no-more">2019-</span>01-27</time>\n'
b' <a href="/events/python-user-group/818/"></a></li>\n'
b' \n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-02-02T00:00:00+00:00"><span class="say-no-more">2019-</span>02-02</time>\n'
b' <a href="/events/python-events/800/">FOSDEM 2019</a></li>\n'
b' \n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-02-09T00:00:00+00:00"><span class="say-no-more">2019-</span>02-09</time>\n'
b' <a href="/events/python-events/770/">PyTennessee 2019</a></li>\n'
b' \n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-02-09T00:00:00+00:00"><span class="say-no-more">2019-</span>02-09</time>\n'
b' <a href="/events/python-user-group/803/">DjangoGirls Bangalore</a></li>\n'
b' \n'
b' \n'
b' \n'
b' <li>\n'
b'<time datetime="2019-02-15T00:00:00+00:00"><span class="say-no-more">2019-</span>02-15</time>\n'
b' <a href="/events/python-events/801/">PyCon Belarus 2019</a></li>\n'
b' \n'
b' \n'
b' </ul>\n'
b' </div>\n'
b'\n'
b' </div>\n'
b'\n'
b' </div>\n'
b'\n'
b' <div class="row">\n'
b'\n'
b' <div class="medium-widget success-stories-widget">\n'
b' \n'
b'\n'
b'\n'
b'\n'
b' <div class="shrubbery">\n'
b' \n'
b'\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-success-stories"></span>Success Stories</h2>\n'
b' <p class="give-me-more"><a href="/success-stories/" title="More Success Stories">More</a></p>\n'
b'\n'
b' \n'
b' <div class="success-story-item" id="success-story-833">\n'
b'\n'
b' <blockquote>\n'
b' <a href="/success-stories/using-python-to-automate-tedious-tasks/">How we used Python to automate a problem that occurred infrequently, but was a huge nuisance when it did occur.</a>\n'
b' </blockquote>\n'
b'\n'
b' <table cellpadding="0" cellspacing="0" border="0" width="100%" class="quote-from">\n'
b' <tbody>\n'
b' <tr>\n'
b' \n'
b' <td><p><a href="/success-stories/using-python-to-automate-tedious-tasks/">Using Python to Automate Tedious Tasks</a> <em>by Nat Dunn</em></p></td>\n'
b' </tr>\n'
b' </tbody>\n'
b' </table>\n'
b' </div>\n'
b' \n'
b'\n'
b' </div><!-- end .shrubbery -->\n'
b'\n'
b' </div>\n'
b'\n'
b' <div class="medium-widget applications-widget last">\n'
b' <div class="shrubbery">\n'
b' <h2 class="widget-title"><span aria-hidden="true" class="icon-python"></span>Use Python for…</h2>\r\n'
b'<p class="give-me-more"><a href="/about/apps" title="More Applications">More</a></p>\r\n'
b'\r\n'
b'<ul class="menu">\r\n'
b' <li><b>Web Development</b>:\r\n'
b' <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'
b' <li><b>GUI Development</b>:\r\n'
b' <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'
b' <li><b>Scientific and Numeric</b>:\r\n'
b' <span class="tag-wrapper">\r\n'
b'<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'
b' <li><b>Software Development</b>:\r\n'
b' <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'
b' <li><b>System Administration</b>:\r\n'
b' <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'
b'</ul>\r\n'
b'\n'
b' </div><!-- end .shrubbery -->\n'
b' </div>\n'
b'\n'
b' </div>\n'
b'\n'
b' \n'
b' <div class="pep-widget">\n'
b'\n'
b' <h2 class="widget-title">\n'
b' <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'
b' <a aria-hidden="true" class="rss-link" href="/dev/peps/peps.rss"><span class="icon-feed"></span> RSS</a>\n'
b' </h2>\n'
b'\n'
b'\n'
b' \n'
b' \n'
b' </div>\n'
b'\n'
b' <div class="psf-widget">\n'
b'\n'
b' <div class="python-logo"></div>\n'
b' \n'
b' <h2 class="widget-title">\r\n'
b' <span class="prompt">>>></span> <a href="/psf/">Python Software Foundation</a>\r\n'
b'</h2>\r\n'
b'<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'
b'<p class="click-these">\r\n'
b' <a class="button" href="/users/membership/">Become a Member</a>\r\n'
b' <a class="button" href="/psf/donations/">Donate to the PSF</a>\r\n'
b'</p>\n'
b' </div>\n'
b'\n'
b'\n'
b'\n'
b'\n'
b' </section>\n'
b'\n'
b' \n'
b' \n'
b'\n'
b' \n'
b' \n'
b'\n'
b'\n'
b' </div><!-- end .container -->\n'
b' </div><!-- end #content .content-wrapper -->\n'
b'\n'
b' <!-- Footer and social media list -->\n'
b' <footer id="site-map" class="main-footer" role="contentinfo">\n'
b' <div class="main-footer-links">\n'
b' <div class="container">\n'
b'\n'
b' \n'
b' <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'
b'\n'
b' \n'
b'\n'
b'<ul class="sitemap navigation menu do-not-print" role="tree" id="container">\n'
b' \n'
b' <li class="tier-1 element-1">\n'
b' <a href="/about/" >About</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/about/apps/" title="">Applications</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/about/quotes/" title="">Quotes</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/about/gettingstarted/" title="">Getting Started</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/about/help/" title="">Help</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="http://brochure.getpython.info/" title="">Python Brochure</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-2">\n'
b' <a href="/downloads/" >Downloads</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/downloads/" title="">All releases</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/downloads/source/" title="">Source code</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/downloads/windows/" title="">Windows</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/downloads/mac-osx/" title="">Mac OS X</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/download/other/" title="">Other Platforms</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="https://docs.python.org/3/license.html" title="">License</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/download/alternatives" title="">Alternative Implementations</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-3">\n'
b' <a href="/doc/" >Documentation</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/doc/" title="">Docs</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/doc/av" title="">Audio/Visual Talks</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="https://wiki.python.org/moin/BeginnersGuide" title="">Beginner's Guide</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="https://devguide.python.org/" title="">Developer's Guide</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="https://docs.python.org/faq/" title="">FAQ</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="http://wiki.python.org/moin/Languages" title="">Non-English Docs</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="http://python.org/dev/peps/" title="">PEP Index</a></li>\n'
b' \n'
b' <li class="tier-2 element-8" role="treeitem"><a href="https://wiki.python.org/moin/PythonBooks" title="">Python Books</a></li>\n'
b' \n'
b' <li class="tier-2 element-9" role="treeitem"><a href="/doc/essays/" title="">Python Essays</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-4">\n'
b' <a href="/community/" >Community</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/community/survey" title="">Community Survey</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/community/diversity/" title="">Diversity</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/community/lists/" title="">Mailing Lists</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/community/irc/" title="">IRC</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/community/forums/" title="">Forums</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="/community/workshops/" title="">Python Conferences</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/community/sigs/" title="">Special Interest Groups</a></li>\n'
b' \n'
b' <li class="tier-2 element-8" role="treeitem"><a href="/community/logos/" title="">Python Logo</a></li>\n'
b' \n'
b' <li class="tier-2 element-9" role="treeitem"><a href="https://wiki.python.org/moin/" title="">Python Wiki</a></li>\n'
b' \n'
b' <li class="tier-2 element-10" role="treeitem"><a href="/community/merchandise/" title="">Merchandise</a></li>\n'
b' \n'
b' <li class="tier-2 element-11" role="treeitem"><a href="/community/awards" title="">Community Awards</a></li>\n'
b' \n'
b' <li class="tier-2 element-12" role="treeitem"><a href="https://www.python.org/psf/codeofconduct/" title="">Code of Conduct</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-5">\n'
b' <a href="/success-stories/" title="success-stories">Success Stories</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/success-stories/category/arts/" title="">Arts</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/success-stories/category/business/" title="">Business</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/success-stories/category/education/" title="">Education</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/success-stories/category/engineering/" title="">Engineering</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/success-stories/category/government/" title="">Government</a></li>\n'
b' \n'
b' <li class="tier-2 element-6" role="treeitem"><a href="/success-stories/category/scientific/" title="">Scientific</a></li>\n'
b' \n'
b' <li class="tier-2 element-7" role="treeitem"><a href="/success-stories/category/software-development/" title="">Software Development</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-6">\n'
b' <a href="/blogs/" title="News from around the Python world">News</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/blogs/" title="Python Insider Blog Posts">Python News</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="http://planetpython.org/" title="Planet Python">Community News</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="http://pyfound.blogspot.com/" title="PSF Blog">PSF News</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="http://pycon.blogspot.com/" title="PyCon Blog">PyCon News</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-7">\n'
b' <a href="/events/" >Events</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="/events/python-events" title="">Python Events</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="/events/python-user-group/" title="">User Group Events</a></li>\n'
b' \n'
b' <li class="tier-2 element-3" role="treeitem"><a href="/events/python-events/past/" title="">Python Events Archive</a></li>\n'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/events/python-user-group/past/" title="">User Group Events Archive</a></li>\n'
b' \n'
b' <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'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b' <li class="tier-1 element-8">\n'
b' <a href="/dev/" >Contributing</a>\n'
b' \n'
b' \n'
b'\n'
b'<ul class="subnav menu">\n'
b' \n'
b' <li class="tier-2 element-1" role="treeitem"><a href="https://devguide.python.org/" title="">Developer's Guide</a></li>\n'
b' \n'
b' <li class="tier-2 element-2" role="treeitem"><a href="https://bugs.python.org/" title="">Issue Tracker</a></li>\n'
b' \n'
b' <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'
b' \n'
b' <li class="tier-2 element-4" role="treeitem"><a href="/dev/core-mentorship/" title="">Core Mentorship</a></li>\n'
b' \n'
b' <li class="tier-2 element-5" role="treeitem"><a href="/news/security/" title="">Report a Security Issue</a></li>\n'
b' \n'
b'</ul>\n'
b'\n'
b' \n'
b' </li>\n'
b' \n'
b'</ul>\n'
b'\n'
b'\n'
b' <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'
b' \n'
b'\n'
b' </div><!-- end .container -->\n'
b' </div> <!-- end .main-footer-links -->\n'
b'\n'
b' <div class="site-base">\n'
b' <div class="container">\n'
b' \n'
b' <ul class="footer-links navigation menu do-not-print" role="tree">\n'
b' <li class="tier-1 element-1"><a href="/about/help/">Help & <span class="say-no-more">General</span> Contact</a></li>\n'
b' <li class="tier-1 element-2"><a href="/community/diversity/">Diversity <span class="say-no-more">Initiatives</span></a></li>\n'
b' <li class="tier-1 element-3"><a href="https://github.com/python/pythondotorg/issues">Submit Website Bug</a></li>\n'
b' <li class="tier-1 element-4">\n'
b' <a href="https://status.python.org/">Status <span class="python-status-indicator-default" id="python-status-indicator"></span></a>\n'
b' </li>\n'
b' </ul>\n'
b'\n'
b' <div class="copyright">\n'
b' <p><small>\n'
b' <span class="pre">Copyright ©2001-2019.</span>\n'
b' <span class="pre"><a href="/psf-landing/">Python Software Foundation</a></span>\n'
b' <span class="pre"><a href="/about/legal/">Legal Statements</a></span>\n'
b' <span class="pre"><a href="/privacy/">Privacy Policy</a></span>\n'
b' <span class="pre"><a href="/psf/sponsorship/sponsors/">Powered by Rackspace</a></span>\n'
b' </small></p>\n'
b' </div>\n'
b'\n'
b' </div><!-- end .container -->\n'
b' </div><!-- end .site-base -->\n'
b'\n'
b' </footer>\n'
b'\n'
b' </div><!-- end #touchnav-wrapper -->\n'
b'\n'
b' \n'
b' <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>\n'
b' <script>window.jQuery || document.write(\'<script src="/static/js/libs/jquery-1.8.2.min.js"><\\/script>\')</script>\n'
b'\n'
b' <script src="/static/js/libs/masonry.pkgd.min.js"></script>\n'
b'\n'
b' <script type="text/javascript" src="/static/js/main-min.js" charset="utf-8"></script>\n'
b' \n'
b'\n'
b' <!--[if lte IE 7]>\n'
b' <script type="text/javascript" src="/static/js/plugins/IE8-min.js" charset="utf-8"></script>\n'
b' \n'
b' \n'
b' <![endif]-->\n'
b'\n'
b' <!--[if lte IE 8]>\n'
b' <script type="text/javascript" src="/static/js/plugins/getComputedStyle-min.js" charset="utf-8"></script>\n'
b' \n'
b' \n'
b' <![endif]-->\n'
b'\n'
b' \n'
b'\n'
b' \n'
b' \n'
b'\n'
b'</body>\n'
b'</html>\n'
closing也是一个经过@contextmanager装饰的generator,这个generator编写起来其实非常简单:
@contextmanager
def closing(thing):
try:
yield thing
finally:
thing.close()
它的作用就是把任意对象变为上下文对象,并支持with语句。
@contextlib还有一些其他decorator,便于我们编写更简洁的代码。