设为首页 收藏本站
查看: 1119|回复: 0

[经验分享] Python 2.7 Tutorial —— 标准库II

[复制链接]

尚未签到

发表于 2017-5-3 08:44:30 | 显示全部楼层 |阅读模式
  .. _tut-brieftourtwo:
  **********************************************************************
  Brief Tour of the Standard Library -- Part II 标准库概览 II
  **********************************************************************
  This second tour covers more advanced modules that support professional
  programming needs. These modules rarely occur in small scripts.
  第二部分包含了支持专业编程工作所需的更高级的模块,这些模块很少出现在小脚本中。
  .. _tut-output-formatting:
  Output Formatting 输出格式
  =======================================
  The :mod:`repr` module provides a version of :func:`repr` customized for
  abbreviated displays of large or deeply nested containers:
  :mod:`repr` 提供了一个 :func:`repr` 的定制版本,以显示大型或深度嵌套的容器 ::
  >>> import repr
  >>> repr.repr(set('supercalifragilisticexpialidocious'))
  "set(['a', 'c', 'd', 'e', 'f', 'g', ...])"
  The :mod:`pprint` module offers more sophisticated control over printing both
  built-in and user defined objects in a way that is readable by the interpreter.
  When the result is longer than one line, the "pretty printer" adds line breaks
  and indentation to more clearly reveal data structure:
  :mod:`pprint` 模块给老手提供了一种解释器可读的方式深入控制内置和用户自定
  义对象的打印。当输出超过一行的时候,“美化打印(pretty printer)”添加
  断行和标识符,使得数据结构显示的更清晰 ::
  >>> import pprint
  >>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
  ...   'yellow'], 'blue']]]
  ...
  >>> pprint.pprint(t, width=30)
  [[[['black', 'cyan'],
  'white',
  ['green', 'red']],
  [['magenta', 'yellow'],
  'blue']]]
  The :mod:`textwrap` module formats paragraphs of text to fit a given screen
  width:
  :mod:`textwrap` 模块格式化文本段落以适应设定的屏宽 ::
  >>> import textwrap
  >>> doc = """The wrap() method is just like fill() except that it returns
  ... a list of strings instead of one big string with newlines to separate
  ... the wrapped lines."""
  ...
  >>> print textwrap.fill(doc, width=40)
  The wrap() method is just like fill()
  except that it returns a list of strings
  instead of one big string with newlines
  to separate the wrapped lines.
  The :mod:`locale` module accesses a database of culture specific data formats.
  The grouping attribute of locale's format function provides a direct way of
  formatting numbers with group separators:
  :mod:`locale` 模块按访问预定好的国家信息数据库。locale 的格式化函数属性集提供
  了一个直接方式以分组标示格式化数字 ::
  >>> import locale
  >>> locale.setlocale(locale.LC_ALL, 'English_United States.1252')
  'English_United States.1252'
  >>> conv = locale.localeconv()     # get a mapping of conventions
  >>> x = 1234567.8
  >>> locale.format("%d", x, grouping=True)
  '1,234,567'
  >>> locale.format_string("%s%.*f", (conv['currency_symbol'],
  ...           conv['frac_digits'], x), grouping=True)
  '$1,234,567.80'
  .. _tut-templating:
  Templating 模板
  ======================
  The :mod:`string` module includes a versatile :class:`Template` class with a
  simplified syntax suitable for editing by end-users. This allows users to
  customize their applications without having to alter the application.
  :mod:`string` 提供了一个灵活多变的模版类 :class:`template` ,使用它最
  终用户可以用简单的进行编辑。这使用户可以在不进行改变的情况下定制他们的
  应用程序。
  The format uses placeholder names formed by ``$`` with valid Python identifiers
  (alphanumeric characters and underscores). Surrounding the placeholder with
  braces allows it to be followed by more alphanumeric letters with no intervening
  spaces. Writing ``$$`` creates a single escaped ``$``:
  格式使用 ``$`` 为开头的 Python 合法标识(数字、字母和下划线)作为占位
  符。占位符外面的大括号使它可以和其它的字符不加空格混在一起。 ``$$`` 创
  建一个单独的 ``$`` ::
  >>> from string import Template
  >>> t = Template('${village}folk send $$10 to $cause.')
  >>> t.substitute(village='Nottingham', cause='the ditch fund')
  'Nottinghamfolk send $10 to the ditch fund.'
  The :meth:`substitute` method raises a :exc:`KeyError` when a placeholder is not
  supplied in a dictionary or a keyword argument. For mail-merge style
  applications, user supplied data may be incomplete and the
  :meth:`safe_substitute` method may be more appropriate --- it will leave
  placeholders unchanged if data is missing:
  字典或者关键字参数中缺少某个占位符的时候 :meth:`substitute` 方法抛出 :exc:`KeyError`
  异常。在邮件-合并风格的应用程序中,用户提供的数据可能并不完整,也许用
  :meth:`safe-substitute` 方法更合适——如果数据不完整,它保留未改动的占位符 ::
  >>> t = Template('Return the $item to $owner.')
  >>> d = dict(item='unladen swallow')
  >>> t.substitute(d)
  Traceback (most recent call last):
  . . .
  KeyError: 'owner'
  >>> t.safe_substitute(d)
  'Return the unladen swallow to $owner.'
  Template subclasses can specify a custom delimiter. For example, a batch
  renaming utility for a photo browser may elect to use percent signs for
  placeholders such as the current date, image sequence number, or file format:
  模板子类可以指定一个定制分隔符。例如,图像浏览器的批量命名工具可能选用
  百分号作为表示当前日期、图像序列号或文件格式的占位符 ::
  >>> import time, os.path
  >>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
  >>> class BatchRename(Template):
  ...   delimiter = '%'
  >>> fmt = raw_input('Enter rename style (%d-date %n-seqnum %f-format): ')
  Enter rename style (%d-date %n-seqnum %f-format): Ashley_%n%f
  >>> t = BatchRename(fmt)
  >>> date = time.strftime('%d%b%y')
  >>> for i, filename in enumerate(photofiles):
  ...   base, ext = os.path.splitext(filename)
  ...   newname = t.substitute(d=date, n=i, f=ext)
  ...   print '{0} --> {1}'.format(filename, newname)
  img_1074.jpg --> Ashley_0.jpg
  img_1076.jpg --> Ashley_1.jpg
  img_1077.jpg --> Ashley_2.jpg
  Another application for templating is separating program logic from the details
  of multiple output formats. This makes it possible to substitute custom
  templates for XML files, plain text reports, and HTML web reports.
  另一个应用是将多样化的输出格式细节从程序逻辑中分离出来。这使得为 XML
  文件,纯文本报表,HTML web 报表定制替换模版成为可能。
  .. _tut-binary-formats:
  Working with Binary Data Record Layouts 使用二进制记录层
  ===================================================================
  The :mod:`struct` module provides :func:`pack` and :func:`unpack` functions for
  working with variable length binary record formats. The following example shows
  how to loop through header information in a ZIP file without using the
  :mod:`zipfile` module. Pack codes ``"H"`` and ``"I"`` represent two and four
  byte unsigned numbers respectively. The ``"<"`` indicates that they are
  standard size and in little-endian byte order:
  :mod:`struct` 模块提供 :func:`pack` 和 :func:`unpack` 函数用于变长二进制记录格式。以下示
  例显示了如何通过 ZIP 文件的头信息(压缩代码中的 ``"H"`` 和 ``"L"`` 分别传递二和
  四字节无符号整数), ``"<"`` 标识了它们以标准尺寸和低地址低字节存储 ::
  import struct
  data = open('myfile.zip', 'rb').read()
  start = 0
  for i in range(3):           # show the first 3 file headers
  start += 14
  fields = struct.unpack('<IIIHH', data[start:start+16])
  crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
  start += 16
  filename = data[start:start+filenamesize]
  start += filenamesize
  extra = data[start:start+extra_size]
  print filename, hex(crc32), comp_size, uncomp_size
  start += extra_size + comp_size   # skip to the next header
  .. _tut-multi-threading:
  Multi-threading 多线程
  ===============================
  Threading is a technique for decoupling tasks which are not sequentially
  dependent. Threads can be used to improve the responsiveness of applications
  that accept user input while other tasks run in the background. A related use
  case is running I/O in parallel with computations in another thread.
  线程是一个分离无顺序依赖关系任务的技术。在某些任务运行于后台的时候应用
  程序会变得迟缓,线程可以提升其速度。一个有关的用途是在 I/O 的同时其它线
  程可以并行计算。
  The following code shows how the high level :mod:`threading` module can run
  tasks in background while the main program continues to run:
  下面的代码显示了高级模块 :mod:`threading` 如何在主程序运行的同时运行任
  务 ::
  import threading, zipfile
  class AsyncZip(threading.Thread):
  def __init__(self, infile, outfile):
  threading.Thread.__init__(self)
  self.infile = infile
  self.outfile = outfile
  def run(self):
  f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
  f.write(self.infile)
  f.close()
  print 'Finished background zip of: ', self.infile
  background = AsyncZip('mydata.txt', 'myarchive.zip')
  background.start()
  print 'The main program continues to run in foreground.'
  background.join()  # Wait for the background task to finish
  print 'Main program waited until background was done.'
  The principal challenge of multi-threaded applications is coordinating threads
  that share data or other resources. To that end, the threading module provides
  a number of synchronization primitives including locks, events, condition
  variables, and semaphores.
  多线程应用程序最重要的挑战是在协调线程共享的数据和其它资源。另外,线程
  模块提供了几个基本的同步方式如锁、事件,条件变量和信号量。
  While those tools are powerful, minor design errors can result in problems that
  are difficult to reproduce. So, the preferred approach to task coordination is
  to concentrate all access to a resource in a single thread and then use the
  :mod:`Queue` module to feed that thread with requests from other threads.
  Applications using :class:`Queue.Queue` objects for inter-thread communication
  and coordination are easier to design, more readable, and more reliable.
  尽管工具很强大,微小的设计错误也可能造成难以挽回的故障。因此,更好的方
  法是将所有的资源访问集中到一个独立的线程中,然后使用 :mod:`Queue` 模块调度该
  线程相应其它线程的请求。应用程序使用 :class:`Queue.Queue` 对象可以让内部线程通信和协
  调更容易设计,更可读,更可靠。
  .. _tut-logging:
  Logging 日志
  ================
  The :mod:`logging` module offers a full featured and flexible logging system.
  At its simplest, log messages are sent to a file or to ``sys.stderr``:
  :mod:`logging` 模块提供了完整和灵活的日志系统。它最简单的用法是记录信息并发送
  到一个文件或 ``sys.stderr`` ::
  import logging
  logging.debug('Debugging information')
  logging.info('Informational message')
  logging.warning('Warning:config file %s not found', 'server.conf')
  logging.error('Error occurred')
  logging.critical('Critical error -- shutting down')
  This produces the following output:
  输出如下 ::
  WARNING:root:Warning:config file server.conf not found
  ERROR:root:Error occurred
  CRITICAL:root:Critical error -- shutting down
  By default, informational and debugging messages are suppressed and the output
  is sent to standard error. Other output options include routing messages
  through email, datagrams, sockets, or to an HTTP Server. New filters can select
  different routing based on message priority: :const:`DEBUG`, :const:`INFO`,
  :const:`WARNING`, :const:`ERROR`, and :const:`CRITICAL`.
  默认情况下捕获信息和调试消息并将输出发送到标准错误流。其它可选的路由信
  息方式通过email,数据报文,socket或者HTTP Server。基于消息属性,新的过
  滤器可以选择不同的路由: :const:`DEBUG`, :const:`INFO`
  , :const:`WARNING` , :const:`ERROR` 和 :const:`CRITICAL` 。
  The logging system can be configured directly from Python or can be loaded from
  a user editable configuration file for customized logging without altering the
  application.
  日志系统可以直接在 Python 代码中定制,也可以不经过应用程序直接在一个用户可编辑的配置文件中加载。
  .. _tut-weak-references:
  Weak References 弱引用
  ================================
  Python does automatic memory management (reference counting for most objects and
  :term:`garbage collection` to eliminate cycles). The memory is freed shortly
  after the last reference to it has been eliminated.
  Python 自动进行内存管理(对大多数的对象进行引用计数和垃圾回收——
  :term:`garbage collection` ——以循环利用)在最后一个引用消失后,内存会
  很快释放。
  This approach works fine for most applications but occasionally there is a need
  to track objects only as long as they are being used by something else.
  Unfortunately, just tracking them creates a reference that makes them permanent.
  The :mod:`weakref` module provides tools for tracking objects without creating a
  reference. When the object is no longer needed, it is automatically removed
  from a weakref table and a callback is triggered for weakref objects. Typical
  applications include caching objects that are expensive to create:
  这个工作方式对大多数应用程序工作良好,但是偶尔会需要跟踪对象来做一些事。
  不幸的是,仅仅为跟踪它们创建引用也会使其长期存在。 :mod:`weakref` 模块
  提供了不用创建引用的跟踪对象工具,一旦对象不再存在,它自动从弱引用表上
  删除并触发回调。典型的应用包括捕获难以构造的对象 ::
  >>> import weakref, gc
  >>> class A:
  ...   def __init__(self, value):
  ...       self.value = value
  ...   def __repr__(self):
  ...       return str(self.value)
  ...
  >>> a = A(10)          # create a reference
  >>> d = weakref.WeakValueDictionary()
  >>> d['primary'] = a      # does not create a reference
  >>> d['primary']        # fetch the object if it is still alive
  10
  >>> del a            # remove the one reference
  >>> gc.collect()        # run garbage collection right away
  0
  >>> d['primary']        # entry was automatically removed
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  d['primary']        # entry was automatically removed
  File "C:/python26/lib/weakref.py", line 46, in __getitem__
  o = self.data[key]()
  KeyError: 'primary'
  .. _tut-list-tools:
  Tools for Working with Lists 列表工具
  ================================================
  Many data structure needs can be met with the built-in list type. However,
  sometimes there is a need for alternative implementations with different
  performance trade-offs.
  很多数据结构可能会用到内置列表类型。然而,有时可能需要不同性能代价的实现。
  The :mod:`array` module provides an :class:`array()` object that is like a list
  that stores only homogeneous data and stores it more compactly. The following
  example shows an array of numbers stored as two byte unsigned binary numbers
  (typecode ``"H"``) rather than the usual 16 bytes per entry for regular lists of
  Python int objects:
  :mod:`array` 模块提供了一个类似列表的 :class:`array` 对象,它仅仅是存储数据,更为紧凑。
  以下的示例演示了一个存储双字节无符号整数的数组(类型编码 ``"H"`` )而非存储
  16 字节 Python 整数对象的普通正规列表 ::
  >>> from array import array
  >>> a = array('H', [4000, 10, 700, 22222])
  >>> sum(a)
  26932
  >>> a[1:3]
  array('H', [10, 700])
  The :mod:`collections` module provides a :class:`deque()` object that is like a
  list with faster appends and pops from the left side but slower lookups in the
  middle. These objects are well suited for implementing queues and breadth first
  tree searches:
  :mod:`collections` 模块提供了类似列表的 :class:`deque()` 对象,它从左边添加(append)
  和弹出(pop)更快,但是在内部查询更慢。这些对象更适用于队列实现和广度
  优先的树搜索 ::
  >>> from collections import deque
  >>> d = deque(["task1", "task2", "task3"])
  >>> d.append("task4")
  >>> print "Handling", d.popleft()
  Handling task1
  unsearched = deque([starting_node])
  def breadth_first_search(unsearched):
  node = unsearched.popleft()
  for m in gen_moves(node):
  if is_goal(m):
  return m
  unsearched.append(m)
  In addition to alternative list implementations, the library also offers other
  tools such as the :mod:`bisect` module with functions for manipulating sorted
  lists:
  除了链表的替代实现,该库还提供了 :mod:`bisect` 这样的模块以操作存储链
  表 ::
  >>> import bisect
  >>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
  >>> bisect.insort(scores, (300, 'ruby'))
  >>> scores
  [(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
  The :mod:`heapq` module provides functions for implementing heaps based on
  regular lists. The lowest valued entry is always kept at position zero. This
  is useful for applications which repeatedly access the smallest element but do
  not want to run a full list sort:
  :mod:`heapq` 提供了基于正规链表的堆实现。最小的值总是保持在0点。这在希
  望循环访问最小元素但是不想执行完整堆排序的时候非常有用 ::
  >>> from heapq import heapify, heappop, heappush
  >>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
  >>> heapify(data)           # rearrange the list into heap order
  >>> heappush(data, -5)         # add a new entry
  >>> [heappop(data) for i in range(3)] # fetch the three smallest entries
  [-5, 0, 1]
  .. _tut-decimal-fp:
  Decimal Floating Point Arithmetic 十进制浮点数算法
  ==========================================================
  The :mod:`decimal` module offers a :class:`Decimal` datatype for decimal
  floating point arithmetic. Compared to the built-in :class:`float`
  implementation of binary floating point, the class is especially helpful for
  :mod:`decimal` 模块提供了一个 :mod:`Decimal` 数据类型用于浮点数计算。相比内置
  的二进制浮点数实现 :class:`float` ,这个类型有助于
  * financial applications and other uses which require exact decimal
  representation,
  金融应用和其它需要精确十进制表达的场合,
  * control over precision,
  控制精度,
  * control over rounding to meet legal or regulatory requirements,
  控制舍入以适应法律或者规定要求,
  * tracking of significant decimal places, or
  确保十进制数位精度,或者
  * applications where the user expects the results to match calculations done by
  hand.
  用户希望计算结果与手算相符的场合。
  For example, calculating a 5% tax on a 70 cent phone charge gives different
  results in decimal floating point and binary floating point. The difference
  becomes significant if the results are rounded to the nearest cent:
  例如,计算 70 分电话费的 5% 税计算,十进制浮点数和二进制浮点数计算结果
  的差别如下。如果在分值上舍入,这个差别就很重要了 ::
  >>> from decimal import *
  >>> x = Decimal('0.70') * Decimal('1.05')
  >>> x
  Decimal('0.7350')
  >>> x.quantize(Decimal('0.01')) # round to nearest cent
  Decimal('0.74')
  >>> round(.70 * 1.05, 2)     # same calculation with floats
  0.73
  The :class:`Decimal` result keeps a trailing zero, automatically inferring four
  place significance from multiplicands with two place significance. Decimal
  reproduces mathematics as done by hand and avoids issues that can arise when
  binary floating point cannot exactly represent decimal quantities.
  :class:`Decimal` 的结果总是保有结尾的 0,自动从两位精度延伸到4位。
  Decimal 重现了手工的数学运算,这就确保了二进制浮点数无法精确保有的数据
  精度。
  Exact representation enables the :class:`Decimal` class to perform modulo
  calculations and equality tests that are unsuitable for binary floating point:
  高精度使 :class:`Decimal` 可以执行二进制浮点数无法进行的模运算和等值测试。
  >>> Decimal('1.00') % Decimal('.10')
  Decimal('0.00')
  >>> 1.00 % 0.10
  0.09999999999999995
  >>> sum([Decimal('0.1')]*10) == Decimal('1.0')
  True
  >>> sum([0.1]*10) == 1.0
  False
  The :mod:`decimal` module provides arithmetic with as much precision as needed:
  :mod:`decimal` 提供了必须的高精度算法 ::
  >>> getcontext().prec = 36
  >>> Decimal(1) / Decimal(7)
  Decimal('0.142857142857142857142857142857142857')

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372317-1-1.html 上篇帖子: python下RSA加密解密以及跨平台问题 下篇帖子: 量化分析师的Python日记【第1天:谁来给我讲讲Python?】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表