青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Welcome to 陳俊峰's ---BeetleHeaded Man Blog !

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  58 隨筆 :: 32 文章 :: 18 評論 :: 0 Trackbacks
Subsections


11. Brief Tour of the Standard Library - Part II

This second tour covers more advanced modules that support professional programming needs. These modules rarely occur in small scripts.


11.1 Output Formatting

The repr module provides an version of repr() for abbreviated displays of large or deeply nested containers:

																		    >>> import repr   
    >>> repr.repr(set('supercalifragilisticexpialidocious'))
    "set(['a', 'c', 'd', 'e', 'f', 'g', ...])"

				
				
				

The 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:

																		    >>> 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 textwrap module formats paragraphs of text to fit a given screen width:

																		    >>> 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 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:

																		    >>> 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("%s%.*f", (conv['currency_symbol'],
    ...	      conv['frac_digits'], x), grouping=True)
    '$1,234,567.80'

				
				
				


11.2 Templating

The string module includes a versatile 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.

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 "$":

																		>>> 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 substitute method raises a 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 safe_substitute method may be more appropriate -- it will leave placeholders unchanged if data is missing:

																		>>> 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 '%s --> %s' % (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.


11.3 Working with Binary Data Record Layouts

The struct module provides pack() and unpack() functions for working with variable length binary record formats. The following example shows how to loop through header information in a ZIP file (with pack codes "H" and "L" representing two and four byte unsigned numbers respectively):

																		    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('LLLHH', 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

				
				
				


11.4 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.

The following code shows how the high level threading module can run tasks in background while the main program continues to run:

																		    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 Queue module to feed that thread with requests from other threads. Applications using Queue objects for inter-thread communication and coordination are easier to design, more readable, and more reliable.


11.5 Logging

The logging module offers a full featured and flexible logging system. At its simplest, log messages are sent to a file or to 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: DEBUG, INFO, WARNING, ERROR, and 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.


11.6 Weak References

Python does automatic memory management (reference counting for most objects and garbage collection to eliminate cycles). The memory is freed shortly after the last reference to it has been eliminated.

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 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:

																		    >>> 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 "<pyshell#108>", line 1, in -toplevel-
        d['primary']                # entry was automatically removed
      File "C:/PY24/lib/weakref.py", line 46, in __getitem__
        o = self.data[key]()
    KeyError: 'primary'

				
				
				


11.7 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 array module provides an array() object that is like a list that stores only homogenous data but 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:

																		    >>> from array import array
    >>> a = array('H', [4000, 10, 700, 22222])
    >>> sum(a)
    26932
    >>> a[1:3]
    array('H', [10, 700])

				
				
				

The collections module provides a 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:

																		    >>> 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 bisect module with functions for manipulating sorted lists:

																		    >>> 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 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:

																		    >>> 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]

				
				
				


11.8 Decimal Floating Point Arithmetic

The decimal module offers a Decimal datatype for decimal floating point arithmetic. Compared to the built-in float implementation of binary floating point, the new class is especially helpful for 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 for 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:

																		>>> from decimal import *       
>>> Decimal('0.70') * Decimal('1.05')
Decimal("0.7350")
>>> .70 * 1.05
0.73499999999999999

				
				
				

The 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.

Exact representation enables the Decimal class to perform modulo calculations and equality tests that are unsuitable for binary floating point:

																		>>> 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 decimal module provides arithmetic with as much precision as needed:

																		>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857142857")

				
				
				
posted on 2006-04-13 19:45 Jeff-Chen 閱讀(410) 評論(0)  編輯 收藏 引用 所屬分類: Python
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品卡一卡二卡三| 欧美日韩国产123区| 国语自产在线不卡| 久久天天躁狠狠躁夜夜av| 久久精品欧美日韩| 亚洲人成网站精品片在线观看| 欧美成年视频| 欧美日韩和欧美的一区二区| 日韩写真视频在线观看| 在线亚洲国产精品网站| 国产一区二区三区在线观看网站| 久久免费视频这里只有精品| 久久尤物电影视频在线观看| 999亚洲国产精| 午夜精品国产更新| 亚洲激情视频在线| 亚洲制服丝袜在线| 亚洲人成在线播放网站岛国| 亚洲私人影院| 亚洲第一在线综合网站| 日韩视频免费观看高清完整版| 国产日产欧美a一级在线| 亚洲第一级黄色片| 欧美三级不卡| 美女啪啪无遮挡免费久久网站| 欧美日本网站| 欧美.日韩.国产.一区.二区| 欧美日韩一区二| 免费看黄裸体一级大秀欧美| 欧美视频中文一区二区三区在线观看 | 国产欧美一区二区三区沐欲| 欧美国产日产韩国视频| 国产精品美女久久久久aⅴ国产馆| 噜噜噜躁狠狠躁狠狠精品视频| 欧美三级日本三级少妇99| 裸体丰满少妇做受久久99精品| 欧美午夜不卡| 亚洲国产精品一区二区第四页av | 久久久精品一区| 亚洲免费在线观看视频| 欧美国产亚洲另类动漫| 久久这里只有| 国产欧美一区二区三区另类精品| 亚洲精品一级| 91久久线看在观草草青青| 先锋影音国产一区| 性欧美超级视频| 欧美日韩四区| 亚洲国产精品电影在线观看| 激情丁香综合| 欧美在线不卡| 久久不射网站| 国产女主播在线一区二区| 中日韩高清电影网| 亚洲一区bb| 欧美三区在线观看| 一区二区黄色| 亚洲特黄一级片| 欧美日韩在线一区| 99在线精品视频在线观看| 妖精成人www高清在线观看| 欧美不卡在线视频| 亚洲福利一区| 日韩一级成人av| 欧美精品三级在线观看| 亚洲精品久久久久久久久久久久久| 亚洲人成网在线播放| 欧美激情一区二区三区蜜桃视频| 亚洲国产日韩欧美在线动漫| 日韩午夜电影在线观看| 欧美日韩国产在线播放网站| 日韩亚洲精品电影| 亚洲在线观看视频| 国产精品一区视频| 欧美中文在线免费| 欧美国产日本| 一区二区三区毛片| 欧美午夜精品久久久久久久| 亚洲影视中文字幕| 久久综合综合久久综合| 91久久线看在观草草青青| 欧美日韩不卡在线| 亚洲男人的天堂在线aⅴ视频| 久久久国产精品一区二区中文| 黄色在线一区| 欧美日产一区二区三区在线观看| 国产精品99久久久久久白浆小说| 欧美一区二区在线| 在线成人h网| 欧美日韩免费在线观看| 午夜伦欧美伦电影理论片| 欧美成人精品一区| 亚洲一品av免费观看| 国产主播精品在线| 欧美激情一区二区三区在线| 午夜精品久久久久久久 | 亚洲一区二区三区乱码aⅴ蜜桃女| 国产日韩欧美视频| 欧美刺激午夜性久久久久久久| 一区二区三区高清| 欧美xx视频| 性伦欧美刺激片在线观看| 亚洲激情在线播放| 国产区日韩欧美| 欧美精品尤物在线| 久久精品视频免费| 一区二区国产精品| 亚洲国产天堂久久国产91| 久久精品国产999大香线蕉| 一本色道久久精品| 樱桃国产成人精品视频| 国产精品美女黄网| 欧美精品在欧美一区二区少妇| 久久精品国亚洲| 亚洲自拍三区| 99re热这里只有精品视频| 欧美成人资源| 久久精品二区三区| 午夜精品亚洲| 国产精品99久久久久久人| 亚洲精品1234| 欲色影视综合吧| 国产私拍一区| 国产精品美女主播| 欧美日韩一区视频| 欧美激情中文字幕一区二区| 老巨人导航500精品| 久久九九精品99国产精品| 午夜国产精品视频免费体验区| 一区二区三区高清| 亚洲深夜av| 一区二区三区精密机械公司| 日韩小视频在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美mv日韩mv亚洲| 麻豆精品精华液| 免费成人高清| 亚洲大胆av| 亚洲国产精品va在线看黑人动漫| 欧美激情五月| 国产精品久久久一区二区| 欧美色另类天堂2015| 欧美色图麻豆| 国产精品综合av一区二区国产馆| 国产精品每日更新| 国产亚洲欧美另类一区二区三区| 国产欧美韩日| 精品动漫av| 亚洲黄页视频免费观看| 亚洲精品国产品国语在线app| 亚洲精品免费电影| 一区二区三区国产盗摄| 亚洲一区二区三区中文字幕| 午夜久久美女| 久久久噜噜噜久久久| 欧美成人伊人久久综合网| 欧美激情一区三区| 99视频一区二区三区| 亚洲欧美另类中文字幕| 久久精品亚洲| 欧美精品午夜视频| 国产精品日韩欧美| 精品成人一区二区三区四区| 亚洲精品午夜精品| 亚洲一区免费看| 久久综合九色欧美综合狠狠| 最新中文字幕亚洲| 一区二区三区四区国产精品| 欧美亚洲自偷自偷| 欧美xx视频| 国产精品自拍在线| 亚洲国产日韩美| 午夜精品免费在线| 欧美 日韩 国产在线| 一区二区日韩| 久热re这里精品视频在线6| 欧美日在线观看| 在线日韩欧美视频| 亚洲欧美日韩一区二区三区在线观看 | 日韩一级成人av| 久久久爽爽爽美女图片| 亚洲精品免费观看| 久久久久综合| 国产精品一区二区你懂得 | 亚洲一区二区视频在线观看| 另类天堂视频在线观看| 99国产一区| 美女网站在线免费欧美精品| 国产精品青草综合久久久久99 | 欧美亚韩一区| 亚洲日本视频| 猛干欧美女孩| 欧美一级视频一区二区| 欧美天堂亚洲电影院在线播放| 在线观看视频欧美| 久久精品在线观看| 国产精品99久久久久久人| 欧美人与性动交α欧美精品济南到| 黄色亚洲免费| 久久九九热免费视频|