GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing python.github.io — 11. مروری کوتاه بر کتابخانهی استاندارد — بخش دوم 11. مروری کوتاه بر کتابخانهی استاندارد — بخش دوم¶این بخش دوم از مرور، ماژولهای پیشرفتهتری را معرفی میکند که نیازهای برنامهنویسی حرفهای را پوشش میدهند. این ماژولها بهندرت در اسکریپتهای کوچک استفاده میشوند. 11.1. قالببندی خروجی¶ماژول >>> import reprlib >>> reprlib.repr(set('supercalifragilisticexpialidocious')) "{'a', 'c', 'd', 'e', 'f', 'g', ...}" ماژول >>> import pprint >>> t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta', ... 'yellow'], 'blue']]] ... >>> pprint.pprint(t, width=30) [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta', 'yellow'], 'blue']]] ماژول >>> 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. ماژول >>> 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_string("%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' 11.2. قالبهای متنی¶ماژول در این قالب، نام جاینگهدارها با استفاده از >>> 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.' متد >>> 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 میتوانند جداکنندهی سفارشی خود را تعریف کنند. برای مثال، یک ابزار تغییر نام گروهی پروندههای عکس ممکن است از علامت درصد برای جاینگهدارهایی مانند تاریخ جاری، شمارهی ترتیب تصویر یا قالب پرونده استفاده کند: >>> import time, os.path >>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg'] >>> class BatchRename(Template): ... delimiter = '%' ... >>> fmt = 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 کاربرد دیگر قالبها، جدا کردن منطق برنامه از جزئیات قالبهای مختلف خروجی است. این کار امکان جایگزینی قالبهای سفارشی برای پروندههای XML، گزارشهای متنی ساده و گزارشهای وب HTML را فراهم میکند. 11.3. کار با ساختار رکوردهای دادهی دودویی¶ماژول import struct with open('myfile.zip', 'rb') as f: data = f.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 11.4. چندنخی¶چندنخی روشی برای جدا کردن وظایفی است که بهصورت ترتیبی به یکدیگر وابسته نیستند. از نخها میتوان برای افزایش پاسخگویی برنامههایی استفاده کرد که همزمان با اجرای وظایف دیگر در پسزمینه، ورودی کاربر را نیز دریافت میکنند. یکی دیگر از کاربردهای رایج آن، اجرای عملیات ورودی/خروجی بهصورت موازی با محاسبات در نخ دیگر است. کد زیر نشان میدهد که چگونه ماژول سطحبالای import threading, zipfile class AsyncZip(threading.Thread): def __init__(self, infile, outfile): super().__init__() self.infile = infile self.outfile = outfile def run(self): with zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED) as f: f.write(self.infile) 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.') مهمترین چالش در برنامههای چندنخی، هماهنگسازی نخهایی است که دادهها یا منابع دیگری را با یکدیگر به اشتراک میگذارند. به همین منظور، ماژول threading مجموعهای از سازوکارهای همگامسازی، از جمله قفلها، رویدادها، متغیرهای شرطی و سمافورها را فراهم میکند. با وجود قدرت این ابزارها، حتی خطاهای کوچک در طراحی میتوانند مشکلاتی ایجاد کنند که بازتولید آنها دشوار باشد. بنابراین، روش ترجیحی برای هماهنگی وظایف این است که تمام دسترسیها به یک منبع در یک نخ متمرکز شوند و سپس از ماژول 11.5. گزارشگیری¶ماژول 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') خروجی زیر تولید میشود: WARNING:root:Warning:config file server.conf not found ERROR:root:Error occurred CRITICAL:root:Critical error -- shutting down بهطور پیشفرض، پیامهای اطلاعرسانی و اشکالزدایی نمایش داده نمیشوند و خروجی به خطای استاندارد ارسال میشود. گزینههای دیگر برای خروجی شامل ارسال پیامها از طریق ایمیل، دیتاگرامها، سوکتها یا یک سرور HTTP است. همچنین میتوان با استفاده از فیلترها، پیامها را بر اساس سطح اهمیت آنها هدایت کرد: سامانهی گزارشگیری را میتوان مستقیماً از داخل پایتون پیکربندی کرد یا تنظیمات آن را از یک پرونده پیکربندی قابل ویرایش توسط کاربر بارگذاری نمود تا بدون تغییر برنامه، رفتار گزارشگیر سفارشیسازی شود. 11.6. ارجاعهای ضعیف¶پایتون مدیریت حافظه را بهصورت خودکار انجام میدهد (برای بیشتر اشیا با استفاده از شمارش ارجاعها و زبالهروبی (جمعآوری زباله) برای حذف چرخهها). حافظه اندکی پس از حذف آخرین ارجاع به یک شی آزاد میشود. این روش برای بیشتر برنامهها مناسب است، اما گاهی لازم است اشیا فقط تا زمانی دنبال شوند که توسط چیز دیگری در حال استفاده باشند. مشکل اینجاست که صرفِ دنبال کردن یک شی، خود یک ارجاع ایجاد میکند و باعث میشود آن شی هرگز آزاد نشود. ماژول >>> 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:/python315/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' 11.7. ابزارهایی برای کار با فهرستها¶بسیاری از نیازهای مربوط به ساختارهای داده را میتوان با استفاده از نوع توکار list برآورده کرد. با این حال، گاهی به پیادهسازیهای جایگزینی نیاز است که توازن متفاوتی میان کارایی و عملکرد ارائه میدهند. ماژول >>> from array import array >>> a = array('H', [4000, 10, 700, 22222]) >>> sum(a) 26932 >>> a[1:3] array('H', [10, 700]) ماژول >>> 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) علاوه بر پیادهسازیهای جایگزین برای فهرستها، کتابخانهی استاندارد ابزارهای دیگری نیز ارائه میدهد؛ برای مثال، ماژول >>> 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')] ماژول >>> 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. محاسبات اعشاری با ممیز شناور دهدهی¶ماژول
برای مثال، محاسبهی مالیات ۵٪ برای هزینهی ۷۰ سنتی یک تماس تلفنی، در محاسبات اعشاری و محاسبات دودویی با ممیز شناور نتایج متفاوتی ایجاد میکند. این تفاوت زمانی که نتایج به نزدیکترین سنت گرد شوند، اهمیت پیدا میکند: >>> from decimal import * >>> round(Decimal('0.70') * Decimal('1.05'), 2) Decimal('0.74') >>> round(.70 * 1.05, 2) 0.73 نتیجهی نمایش دقیق مقادیر به کلاس >>> Decimal('1.00') % Decimal('.10') Decimal('0.00') >>> 1.00 % 0.10 0.09999999999999995 >>> sum([Decimal('0.1')]*10) == Decimal('1.0') True >>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0 False ماژول >>> getcontext().prec = 36 >>> Decimal(1) / Decimal(7) Decimal('0.142857142857142857142857142857142857')
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |