02-Python 模块

说一下你对 Python 中模块和包的理解。

每个 Python 文件就是一个模块,而保存这些文件的文件夹就是一个包,但是这个作为 Python 包的文件夹必须要有一个名为 __init__.py 的文件,否则无法导入这个包。

通常一个文件夹下还可以有子文件夹,这也就意味着一个包下还可以有子包,子包中的 __init__.py 并不是必须的。模块和包解决了 Python 中命名冲突的问题,不同的包下可以有同名的模块,不同的模块下可以有同名的变量、函数或类。

在 Python 中可以使用 importfrom ... import ... 来导入包和模块,在导入的时候还可以使用 as 关键字对包、模块、类、函数、变量等进行别名,从而彻底解决编程中尤其是多人协作团队开发时的命名冲突问题。

如何安装第三方模块

  1. pip 包管理器

  2. 源码下载,解压

    1
    2
    python setup.py build  
    python setup.py install

常用模块都有那些

模块名 介绍
sys 跟 Python 解释器相关的变量和函数,例如:sys.versionsys.exit()
os 和操作系统相关的功能,例如:os.listdir()os.remove()
re 和正则表达式相关的功能,例如:re.compile()re.search()
math 和数学运算相关的功能,例如:math.pimath.emath.cos
json 和序列化相关的功能,例如:json.dumpsjson.loads
random 产生随机数,例如:random.random()
logging 和日志系统相关的类和函数,例如:logging.Loggerlogging.Handler
time/datetime 和时间相关的函数,例如:time.timedatetime.datetime.now
json/pickle/shelve 实现对象序列化和反序列的模块,例如:json.loadsjson.dumps
hashlib 封装了多种哈希摘要算法的模块,例如:hashlib.md5hashlib.sha1
urllib 包含了和 URL 相关的子模块,例如:urllib.requesturllib.parse
itertools 提供各种迭代器的模块,例如:itertools.cycleitertools.product
functools 函数相关工具模块,例如:functools.partialfunctools.lru_cache
collections/heapq 封装了常用数据结构和算法的模块,例如:collections.deque
threading/multiprocessing 多线程/多进程相关类和函数的模块,例如:threading.Thread
concurrent.futures/asyncio 并发编程/异步编程相关的类和函数的模块,例如:ThreadPoolExecutor
base64 提供 BASE-64 编码相关函数的模块,例如:bas64.encode
csv 和读写CSV文件相关的模块,例如:csv.readercsv.writer
profile/cProfile/pstats 和代码性能剖析相关的模块,例如:cProfile.runpstats.Stats
unittest 和单元测试相关的模块,例如:unittest.TestCase
pymysql/mysqldb/dbutil 连接数据库
requests/beautifulsoup4(bs4) 构造url请求和解析请求的

re 模块

在 Python 中,使用正则表达式有两种方式:

  • 一种是直接调用 re 模块中的函数,传入正则表达式和需要处理的字符串。
  • 一种是先通过 re 模块的 compile 函数创建正则表达式对象,然后再通过对象调用方法并传入需要处理的字符串。
    如果一个正则表达式被频繁使用,推荐用 re.compile 函数创建正则表达式对象,这样会减少频繁编译同一个正则表达式所造成的开销

re.matchre.search 区别

  • re.match:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。
  • re.search:扫描整个字符串并返回第一个成功的匹配。

什么是正则的贪婪匹配

匹配一个字符串没有节制,能匹配多少就去匹配多少,直到没有匹配的为止。

logging

logging 模块的作用以及应用场景

logging 模块定义的函数和类为应用程序和库的开发实现了一个灵活的事件日志系统。

作用:可以了解程序运行情况,是否正常,在程序的出现故障快速定位出错地方及故障分析。

日志级别

  • DEBUG:详细的信息,通常只出现在诊断问题上。
  • INFO:确认一切按预期运行。
  • WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。
  • ERROR:更严重的问题,软件没能执行一些功能。
  • CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行。

os 和 sys 模块

  • os 模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。
    官方解释:

    • os: This module provides a portable way of using operating system dependent functionality.
    • 这个模块提供了一种方便的使用操作系统函数的方法。
  • sys 模块负责程序与 Python 解释器的交互,提供了一系列的函数和变量,用于操控 Python 的运行时环境。
    官方解释:

    • sys: This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter.
    • 这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。

os 常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
os.remove()     删除文件
os.rename() 重命名文件
os.walk() 生成目录树下的所有文件名
os.chdir() 改变目录
os.mkdir/makedirs() 创建目录/多层目录
os.rmdir/removedirs() 删除目录/多层目录
os.listdir() 列出指定目录的文件
os.getcwd() 取得当前工作目录
os.chmod() 改变目录权限
os.path.basename() 去掉目录路径,返回文件名
os.path.dirname() 去掉文件名,返回目录路径
os.path.join() 将分离的各部分组合成一个路径名
os.path.split() 返回( dirname(), basename())元组
os.path.splitext() 返回 (filename, extension) 元组
os.path.getatime/ctime/mtime 分别返回最近访问、创建、修改时间
os.path.getsize() 返回文件大小
os.path.exists() 是否存在
os.path.isabs() 是否为绝对路径
os.path.isdir() 是否为目录
os.path.isfile() 是否为文件

sys 常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sys.argv        命令行参数List,第一个元素是程序本身路径  
sys.modules.keys返回所有已经导入的模块列表
sys.exc_info 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback 当前处理的异常详细信息
sys.exit(n) 退出程序,正常退出时 exit(0)
sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.maxunicode 最大的Unicode值
sys.modules 返回系统导入的模块字段,key是模块名,value是模块
sys.path 返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout 标准输出
sys.stdin 标准输入
sys.stderr 错误输出
sys.exc_clear 用来清除当前线程所出现的当前的或最近的错误信息
sys.exec_prefix 返回平台独立的python文件安装的位置
sys.byteorder 本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'
sys.copyright 记录python版权相关的东西
sys.api_version 解释器的C的API版本

random

如何使用 random 模块生成随机数、实现随机乱序和随机抽样

1
2
3
4
5
6
7
random.random()      可以生成 [0.0, 1.0) 之间的随机浮点数。
random.uniform(a, b) 可以生成 [a, b] 或 [b, a] 之间的随机浮点数。
random.randint(a, b) 可以生成 [a, b] 或 [b, a] 之间的随机整数。
random.shuffle(x) 可以实现对序列 x 的原地随机乱序。
random.choice(seq) 可以从非空序列中取出一个随机元素。
random.choices(population, weights=None, *, cum_weights=None, k=1) 可以从总体中随机抽取(有放回抽样)出容量为`k`的样本并返回样本的列表,可以通过参数指定个体的权重,如果没有指定权重,个体被选中的概率均等。
random.sample(population, k) 可以从总体中随机抽取(无放回抽样)出容量为`k`的样本并返回样本的列表。

扩展random 模块提供的函数除了生成均匀分布的随机数外,还可以生成其他分布的随机数,例如:

1
2
3
random.gauss(mu, sigma)             可以生成高斯分布(正态分布)的随机数;
random.paretovariate(alpha) 会生成帕累托分布的随机数;
random.gammavariate(alpha, beta) 会生成伽马分布的随机数。

json

json 序列化时,可以处理的数据类型有哪些,如何定制支持 datetime 类型

可序列化数据类型:字典、列表、数字、字符串、元组;如果是元组,自动转成列表(再转回去的话也是列表)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 自定义时间序列化转换器
import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super(ComplexEncoder,self).default(obj)
d = { 'name':'alex','data':datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}

json序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办

1
2
3
import json
a=json.dumps({"xxx":"你好"},ensure_ascii=False)
print(a) # {"xxx": "你好"}

简述 requests 模块的作用及基本使用

  • 作用:使用 requests 可以模拟浏览器的请求。
  • 常用参数:url、headers、cookies、data、json、params、proxy
  • 常用返回值:content、iter_content、text、encoding=”utf-8”、cookie.get_dict()、json、code

简述 beautifulsoup 模块的作用及基本使用

BeautifulSoup 用于从 HTML 或 XML 文件中提取、过滤想要的数据形式。

  • 常用方法:find、find_all、text、attrs、get
  • 解析:html.parser 或者 lxml(需要下载安装)

DBUtils 模块的作用

程序使用 MySQL 连接时有两种情况:

  1. 为每个线程创建一个连接,连接不可控,需要控制线程数。
  2. 创建指定数量的连接在连接池,当线程访问的时候去取,不够了线程排队,直到有连接释放(推荐)。

两种写法:

  1. 用静态方法装饰器,通过直接执行类的方法来连接使用数据库。
  2. 通过实例化对象,通过对象来调用方法执行语句。
  3. https://www.cnblogs.com/ArmoredTitan/p/Flask.html

简述 seleninu 模块的作用及基本使用?

Selenium 是一个用于 Web 应用程序测试的工具,他的测试直接运行在浏览器上,模拟真实用户,按照代码做出点击、输入、打开等操作。

爬虫中使用他是为了解决 requests 无法解决 javascript 动态问题。

简述 asynio 模块的作用和应用场景

asyncio 是 Python 3.4 版本引入的标准库,直接内置了对异步 IO 的支持。

asyncio 的异步操作,需要在 coroutine 中通过 yield from 完成。

简述 gevent 模块的作用和应用场景

Gevent 是一个第三方库,可以轻松通过 gevent 实现并发同步或异步编程。

在 gevent 中用到的主要模式是 Greenlet, 它是以 C 扩展模块形式接入 Python 的轻量级协程。

Greenlet 全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

twisted 框架的使用和应用

Twisted 是一个事件驱动型的网络模型。

事件驱动模型编程是一种范式,这里程序的执行流由外部决定。

特点是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理。


02-Python 模块
https://flepeng.github.io/interview-20-开发语言类-21-Python-02-Python-模块/
作者
Lepeng
发布于
2020年8月8日
许可协议