sys模块中常用的属性和函数:
通过sys模块的argv属性可获取运行Python程序的命令行参数,argv属性值是一个列表,其列表元素和运行参数的关系如图:
因此,如果需要获取运行Python程序时传入的参数,可以通过argv[1]、argv[2]…来获取。
如果某个参数本身包含了空格,则应该将该参数用双引号("")括起来,否则,Python会把这个空格当成参数分隔符,而不是参数本身,列如:
python argv test.py ”Python Swift"
sys.path用于在程序运行时为Python动态修改模块加载路径:
import sys
# 动态添加g:\fk_ext路径作为模块加载路径
sys.path.append('g:\\fk_ext')
# 加载g:\fk_ext路径下的hello模块
import hello
os模块代表了程序所在的操作系统,主要用于获取程序运行所在操作系统的相关信息
import os
# 显示导入依赖模块的操作系统的名称
print(os.name)
# 获取PYTHONPATH环境变量的值
print(os.getenv('PYTHONPATH'))
# 返回当前系统的登录用户名
print(os.getlogin())
# 获取当前进程ID
print(os.getpid())
# 获取当前进程的父进程ID
print(os.getppid())
# 返回当前系统的CPU数量
print(os.cpu_count())
# 返回路径分隔符
print(os.sep)
# 返回当前系统的路径分隔符
print(os.pathsep)
# 返回当前系统的换行符
print(os.linesep)
# 返回适合作为加密使用的、最多3个字节组成的bytes
print(os.urandom(3))
在os模块下还包含各种进程管理函数,它们可以用于启动新进程、中止已有进程等:
random模块主要包含生成伪随机数的各种功能变量和函数
['Random', 'seed', 'random', 'uniform', 'randint', 'choice',
'sample', 'randrange', 'shuffle', 'normalvariate', 'lognormvariate',
'expovariate', 'vonmisesvariate', 'gammavariate', 'triangular',
'gauss', 'betavariate', 'paretovariate', 'weibullvariate',
'getstate', 'setstate', 'getrandbits', 'choices', 'SystemRandom']
time模块主要包含各种提供日期、时间功能的类和函数。该模块既提供了把日期、时间格式化为字符串的功能,也提供了从字符串恢复日期、时间的功能。
在time模块内提供了一个time.struct_time类,该类代表一个时间对象,它主要包含9个属性:
字段名 | 字段含义 | 值 |
---|---|---|
tm_year | 年 | 如2017、2018等 |
tm_mon | 月 | 范围1~12 |
tm_mday | 日 | 范围1~31 |
tm_hour | 时 | 范围0~23 |
tm_min | 分 | 范围0~59 |
tm_sec | 秒 | 范围0~59 |
tm_wday | 周 | 范围0~6 |
tm_yday | 一年内第几天 | 范围1~366 |
tm_isdst | 夏令时 | 0/1或-1 |
import time
# 将当前时间转换为时间字符串
print(time.asctime())
# 将指定时间转换时间字符串,时间元组的后面3个元素没有设置
print(time.asctime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # Mon Feb 4 11:08:23 2018
# 将以秒数为代表的时间转换为时间字符串
print(time.ctime(30)) # Thu Jan 1 08:00:30 1970
# 将以秒数为代表的时间转换为struct_time对象。
print(time.gmtime(30))
# 将当前时间转换为struct_time对象。
print(time.gmtime())
# 将以秒数为代表的时间转换为代表当前时间的struct_time对象
print(time.localtime(30))
# 将元组格式的时间转换为秒数代表的时间
print(time.mktime((2018, 2, 4, 11, 8, 23, 0, 0 ,0))) # 1517713703.0
# 返回性能计数器的值
print(time.perf_counter())
# 返回当前进程使用CPU的时间
print(time.process_time())
#time.sleep(10)
# 将当前时间转换为指定格式的字符串
print(time.strftime('%Y-%m-%d %H:%M:%S'))
st = '2018年3月20日'
# 将指定时间字符串恢复成struct_time对象。
print(time.strptime(st, '%Y年%m月%d日'))
# 返回从1970年1970年1月1日0点整到现在过了多少秒。
print(time.time())
# 返回本地时区的时间偏移,以秒为单位
print(time.timezone) # 在国内东八区输出-28800
time模块中的strftime()和strptime()两个函数互为逆函数,其中strftime()用于将struct_time对象或时间元组转换为时间字符串;而strptime()函数用于将时间字符串转换为struct_time对象。
JSON主要有如下两种数据结构:
创建对象object时,总以"{“开始,以”}"结束,对象的每个属性名和属性值之间以英文冒号(:)隔开,多个属性定义之间以英文逗号(,)隔开,语法格式如下:
object =
{
propertyName1:propertyValue1,
propertyName2:propertyValue2,
...
}
arr = [value1,value2 ...]
json模块提供了对JSON的支持,它既包含了将JSON字符串恢复成Python对象的函数,也提供了将Python对象转换成JSON字符串的函数
JSON类型 | Python类型 |
---|---|
对象(object) | 字典(dict) |
数组(array) | 列表(list) |
字符串(string) | 字符串(str) |
整数(number(int)) | 整数(int) |
实数(number(real)) | 浮点数(float) |
true | True |
false | False |
null | None |
json模块所包含的全部属性和函数如下:
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError',
'JSONEncoder']
json模块中常用的函数和类的功能如下:
import json
# 将Python对象转JSON字符串(元组会当成数组)
s = json.dumps(['yeeku', {'favorite': ('coding', None, 'game', 25)}])
print(s) # ["yeeku", {"favorite": ["coding", null, "game", 25]}]
# 简单的Python字符串转JSON
s2 = json.dumps("\"foo\bar")
print(s2) #"\"foo\bar"
# 简单的Python字符串转JSON
s3 = json.dumps('\\')
print(s3) #"\\"
# Python的dict对象转JSON,并对key排序
s4 = json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
print(s4) #{"a": 0, "b": 0, "c": 0}
# 将Python列表转JSON,
# 并指定JSON分隔符:逗号和冒号之后没有空格(默认有空格)
s5 = json.dumps([1, 2, 3, {'x': 5, 'y': 7}], separators=(',', ':'))
# 输出的JSON字符串中逗号和冒号之后没有空格
print(s5) # '[1,2,3,{"4":5,"6":7}]'
# 指定indent为4,意味着转换的JSON字符串有缩进
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
print(s6)
# 使用JSONEncoder的encode方法将Python转JSON
s7 = json.JSONEncoder().encode({"names": ("孙悟空", "齐天大圣")})
print(s7) # {"names": ["\u5b59\u609f\u7a7a", "\u9f50\u5929\u5927\u5723"]}
f = open('a.json', 'w')
# 使用dump()函数将转换得到JSON字符串输出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)
re模块所包含的全部属性和函数:
re模块中_sre.SRE_Match对象包含以下方法或属性:
Python支持的正则表达式旗标都使用该模块中的属性来代替:
正则表达式就是一个用于匹配字符串的模板,它可以匹配一批字符串,所以创建正则表达式就是创建一个特殊的字符串。
正则表达式所支持的合法字符
字符 | 解释 |
---|---|
x | 字符x |
\uhhhh | 十六进制值0xhhhh所表示的Unicode字符 |
\t | 制表符 |
\n | 新行符 |
\r | 回车符 |
\f | 换页符 |
\a | 报警符 |
\e | Escape符 |
\cx | x对应的控制符 |
正则表达式中的特殊字符
特殊字符 | 说明 |
---|---|
$ | 匹配一行的结尾,要匹配$字符本身,请使用\$ |
^ | 匹配一行的开头,要匹配字符本身,请使用\^ |
() | 标记子表达式的开始位置和结束位置,要匹配这些字符,请使用\(和\) |
[] | 用于确定中括号表达式的开始位置和结束位置,要匹配这些字符,请使用\[和\] |
{} | 用于标记前面子表达式的出现频度,要匹配这些字符,请使用\{和\} |
* | 指定前面子表达式可以出现0次或多次,要匹配字符本身,请使用\ |
+ | 指定前面子表达式可以出现一次或多次,要匹配+字符本身,请使用\+ |
? | 指定前面子表达式可以出现0次或一次,要匹配?字符本身,请使用\? |
. | 匹配除换行符\n之外的任意单个字符,要匹配.字符本身,请使用\. |
\ | 用于转义下一个字符,要匹配\字符,请使用\\ |
| | 指定在两项之间任选一项,要匹配|字符本身,请使用\| |
正则表达式中,通配符是可以匹配多个字符的特殊字符,称为“预定义字符”。
正则表达式所支持的预定义字符
预定义字符 | 说明 |
---|---|
. | 默认可匹配除换行符之外的任意字符 |
\d | 匹配0~9的所有数字 |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 |
\S | 匹配所有的非空白字符 |
\w | 匹配所有的单词字符,报警0~9的数字,26个英文字母和下画线 |
\W | 匹配所有的非单词字符 |
方括号表达式
方括号表达式 | 说明 |
---|---|
表示枚举 | 例如[abc],表示a、b、c其中任意一个字符 |
表示范围 | 例如[a-f],表示a~f范围内的任意字符 |
表示求否:^ | 例如[^abc],表示非a、b、c的任意字符 |
边界匹配符
边界匹配符 | 说明 |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词的边界,即只能匹配单词前后的空白 |
\B | 非单词的边界,即只能匹配不在单词前后的空白 |
\A | 只能匹配字符串的开头 |
\Z | 只能匹配字符串的结尾 |
正则表达式支持圆括号表达式,用于将多个表达式组成一个子表达式,在圆括号中可以使用或运算符(|),子表达式支持如下用法:
set集合有如下两个特征:
set集合是可变容器,程序可以改变容器中的元素;与set对应的还有frozenset集合,是set的不可变版本,它的元素时不可变的。
方法名 | 语法格式 | 功能 |
---|---|---|
add() | set.add() | 向set集合添加元素 |
clear() | set.clear() | 清空set集合中所有元素 |
copy() | set2 = set1.copy() | 拷贝 set1 集合给 set2 |
difference() | set3 = set1.difference(set2) | 将 set1 中有而 set2 没有的元素给 set3 |
difference_update() | set1.difference_update(set2) | 从 set1 中删除与 set2 相同的元素 |
discard() | set1.discard(elem) | 删除 set1 中的 elem 元素 |
intersection() | set3 = set1.intersection(set2) | 取 set1 和 set2 的交集给 set3 |
intersection_update() | set1.intersection_update(set2) | 取 set1和 set2 的交集,并更新给 set1 |
isdisjoint() | set1.isdisjoint(set2) | 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True |
issubset() | set1.issubset(set2) | 判断 set1 是否是 set2 的子集 |
issuperset() | set1.issuperset(set2) | 判断 set2 是否是 set1 的子集 |
pop() | a = set1.pop() | 取 set1 中一个元素,并赋值给 a |
remove() | set1.remove(elem) | 移除 set1 中的 elem 元素 |
symmetric_difference() | set3 = set1.symmetric_difference(set2) | 取 set1 和 set2 中互不相同的元素,给 set3 |
symmetric_difference_update() | set1.symmetric_difference_update(set2) | 取 set1 和 set2 中互不相同的元素,并更新给 set1 |
union() | set3 = set1.union(set2) | 取 set1 和 set2 的并集,赋给 set3 |
update() | set1.update(elem) | 添加列表或集合中的元素到 set1 |
栈是一种特殊的线性表,它只允许在一段进行插入、删除操作,这一段称为栈顶(top),另一端称为栈底(bottom)。从栈顶插入一个元素称为进栈,从栈顶删除一个元素称为出栈。
队列也是一种特殊的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
双端队列代表一种特殊的队列,可以在两端同时进行插入、删除操作。
Python直接把列表当作堆处理,提供heapq包中有一些函数,当程序用这些函数来操作列表时,表现出“堆”的行为。
ChainMap相当于把多个dict合并成一个大的dict,但实际上底层并未真正合并这些dict,ChainMap是一种“假”合并,但实际用起来又具有较好的效果。当多个dict中具有重复的key时,排在“链”前面的dict中key具有更高的优先级
Counter自动统计容器中各元素出现的次数。
Counter的本质是一个特殊的dict,只不过它的key都是其所包含的元素,而它的value则记录了该key出现的次数。因此,如果通过Counter并不存在的key访问value,将会输出0。
Counter还提供了如下常用的方法:
此外,对于Counter对象还有一些常用的操作,比如把Counter对象转换成set、list、dict等,还可对Counter执行加、减、交、并运算,对Counter进行求正、求负运算等。具体如下:
defaultdict是dict的子类,因此defaultdict可以当成dict来使用;与dict的区别在于:程序根据不存在的key来访问dict对应的value,则会引发KeyError异常,而defaultdict提供一个default_factory属性,该属性所指定的函数负责为不存在的key来生成value。
namedtuple()是一个工厂函数,使用该函数可以创建一个tuple类的子类,该子类可以为tuple的美俄元素都指定字段名,就可以根据字段名来访问namedtuple的各元素。语法格式如下:
namedtuple(typename,field_names,*,verbose=False,rename=False,module=None)
OrderedDict也是dict的子类,它可以“维护”添加key-value对的顺序。
由于OrderedDict是有序的,因此Python为之提供了2个方法:
在itertools模块中主要包含了一些用于生成迭代器的函数。