[python3教程]第十章.标准库简介(Brief Tour of The Standard Library)

我打算从这篇开始尝试markdown编辑,以前竟然不知道这个好东西。。。。

10.1 Operating System Interface

os模块提供了一些与操作系统交互的模块:

>>>import os
>>>os.getcwd()     #返回当前工作的文件夹
'C:\\Python36'
>>>os.chdir('/server/accesslogs')     #更改当前文件夹
>>>os.system('mkdir today')
0

一定要使用import os这种格式,而不是from os import*这种格式。因为后者会让os模块中的同名函数覆盖我们需要使用的内建函数。
在使用大型的模块是,dir()help()这两个函数可以很好的帮找我们了解模块:

>>>import os
>>>dir(os)
<返回一个包含全部模块函数名的列表>
>>>help(os)
<返回一个由模块文档生成的模块操作说明书>

shutil模块为管理日常文件和文件夹提供了一些高级的接口:

>>>import shutil
>>>shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>>shutil.move('/build/accesslogs', 'installdir')
'installdir'

10.2 File Wildcards

glob模块提供了使用通配符搜索的功能:

>>>import glob
>>>glob.glob('*.py')    #*就是通配符,还记得马男里面的那个演员大姐就说自己是wildcard
['1.py', '2.py']
>>>glob.glob('

其实glob函数还有一个参数recursive,详细内容要看标准库glob.glob,当然搜索功能配合正则表达式体验更佳哦!现在引用的文档多是英文的,后期我会把他们也尽量翻译一下。

10.3 Command Line Arguments

通常的应用脚本都是需要使用命令行参数的,这些参数被保存在sys模块的argv列表中。下面我们看一个例子,我们新建一个脚本在运行他的时候在后面加上参数python 10.py one two three,脚本的内容如下:

import sys
print(sys.argv)

输出的结果如下:
这里写图片描述
第一个参数永远都是脚本的名字。argparse模块提供了更多灵活的管理argv参数的方法。

10.4 Error Output Redirection and Program Termination

其实这一节我看的不是很明白,我不太了解stdout重定向是什么意思有什么作用。。。。
sys模块有stdinstdoutstderr这几个特性,其中stderr的作用是即使stdout重定向了,它还是可以发出显而易见的警告和错误信息:

>>>sys.stderr.write('Warning,log file not found starting an new one\n')
Warning,log file not found starting an new one
47

我写了一个脚本实验了一下,我发现无论这个语句加在哪个位置,他都会在最后执行。可是关于stdinstdout我还是不了解,日后在其他地方学到了的话我会回来添加链接的~

10.5 String Pattern Matching

re模块提供了正则表达式工具来搜索字符串,在查找和操作上正则表达式都提供了简练而又有效的解决办法:

>>>import re
>>>re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>>re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

当只需要一些简单的功能的时候最好使用字符串的方法,因为他们可读性更好,而且更加易于修改:

'tea for too'.replace('too', 'two')
'tea for two'

正则表达式的内容我日后一定会添加的,这真是个很细心的规则,当初指定标准的估计是个姑娘~

10.6 Mathematics

math模块让我们可以使用底层的C函数,比如它的浮点数计算方法:

>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0

random模块提供了一些随机方法,但是世界上真的有随机数吗?谁知道那~

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random() # random float
0.17970987693706186
>>> random.randrange(6) # random integer chosen from range(6)
4

statistics模块可以计算数值型数据的一些属性(比如平均数,中位数或者差值之类的东西):

>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095

SciPy项目提供了更多的数学计算模块,有兴趣可以去下载。

10.7 Internet Access

有一些模块是为了链接互联网而设计的,比如urllib.requset用来取回URL的数据,smtplib用来发送email

>>> from urllib.request import urlopen
>>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
... for line in response:
... line = line.decode('utf-8') # Decoding the binary data to text.
... if 'EST' in line or 'EDT' in line: # look for Eastern Time
... print(line)
<BR>Nov. 25, 09:43:32 PM EST

这个代码我执行,读不会来这个网址的时间信息,大家实验的时候可以使用我们熟悉的网站看看都能读取回来什么,建议别读内容太丰富的页面。

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()

注意这个例子中本地电脑上必须先运行邮件服务,所以我使用的并不是本地的邮件服务而是网易的服务。大家可以了解一下:

import smtplib
host_name = 'smtp.163.com'
user_name = '****@163.com'
user_pass = '****'
receive = 'orangeany@163.com'
server = smtplib.SMTP()
server.connect(host_name, 25)
server.login(user_name, user_pass)
server.sendmail(user_name, receive, ' ')

这段代码执行之后orangeany@163.com这个邮箱会收到一个完全空的邮件,如果想要发送内容的话就要给sendmail函数第三个参数分配我们要发送的内容,这个要使用email模块大家感兴趣可以去看看~

10.8 Dates and Times

datetime模块提供了一些用来操作计算时间和日期的类。因为提供了时间和日期的计算,所以实现的重点在于有效率的输出格式和操作。这个模块也是支持时区提醒的:

>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

要了解详细的内容其实读文档是一个很好的主意,因为其他人的介绍可能侧重于他自己所常用的方面。

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

10.9 Data Compression

通常数据的压缩与解压都是用到这些模块:zlib,gzip,bz2,lzma,zipfile,tarfile
我们以zlib为例:

>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

我在数据结构与算法分析中看到过压缩算法,他们是按照数据的出现频数做出一个树,当数据中有高频出现的项时压缩的效果非常显著,但是较小的数据可能压缩并不能带来什么实惠。总之这是一种很有趣的想法,但是这本书我不建议大家看机械工业出版社的那个翻译版,有一部分的内容可能译者阐述的不是很清楚。

Preformance Measurement

解决同一个问题有不同的方式,不同的方式通常来说效率是不一样的。大多数人可能都对各种方式的效率非常感兴趣,所以python提供了一些能够直接显示效率的工具。
举个例子,交换两个数据的时候可以使用传统的方法,也可以使用元组的压缩解压方式来换。timeit模块可以迅速的展示出他们的效率:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

timeit这种小体量相比,profilepstats模块能够严谨的测算大段代码的效率。说实话这些内容我也是第一次接触感觉有点蒙圈啊!找时间一定要读一读文档看看他们都是干什么的。

10.11 Quality Control

为每个函数写测试,并且在开发进程中经常运行测试是一个保证代码质量的好方法。
doctest模块提供了一个工具,用来扫描一个模块并且把模块文档内的测试代码执行起来。测试的结构很简单就是把一次调用的代码粘贴进去并且写上他的结果。为用户提供这样一个例子对文档来说是一种提升,而且这能让doctest模块保证留在文档中的代码是正确的:

def average(values):
"""Computes the arithmetic mean of a list of numbers.
>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)

import doctest
doctest.testmod() # automatically validate the embedded tests

unittest模块并不像doctest模块这样简单操作,但是他能允许一套分在不同文件中的更复杂的测试:

import unittest
class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)
unittest.main()     # Calling from the command line invokes all tests

10.12 Batteries Included

python有一种“自带电池”的哲学思想,这在一些健壮性强功能强大的集合中体现的非常明显:

  • xmlrpc.clientxmlrpc.server模块能够通过简单的工作实现远程进程调用,尽管模块的名字如此,但是并不需要直接的XML知识或者是操作。
  • email集合是一个管理电子邮件信息的库,包括MIME和其他基于信息文档的RFC 2282。smtplib和poplib模块是实际用来收发邮件的,email模块与他们不同,email模块有一套用来创建或者编码复杂信息结构的工具,并且实现网络编码和头文件协议。
  • json集合为主流的数据交互格式提供了有力的支持,csv模块支持逗号分隔格式来读写文件,这种格式通常用于数据库和电子表格。XML的管理是由xml.etree.ElementTree、xml.dom、xml.sax这几个集合支持的。总而言之这些集合和模块极大地简化了python和其他工具的数据交互。
  • sqlite模块是对sqlite数据库功能的一个打包,它能提供一个持续的数据库并且用轻微不正式的SQL语法来实现更新和获取。
  • gettextlocalecodecs集合支持国际化标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值