Python FAQ 常见问题
python 官方文档
相关概念
交互式控制台: Python 相比静态语言最大的特点是有一个交互式控制台(REPL)(read-eval-print loop,读取、求值、输出的循环)
如何调用 python 解释器
- 直接使用 python 关键字进入终端设备(tty)
python -c command [arg] ...
: 将-c
后面的代码交给 python 解释器运行python -m module [arg] ...
: 将 python 中的部分模块按照指定的参数运行
查看函数和属性
内置方法,查看某个模块的属性和方法 dir(sys)
,查看方法的详情 help(sys)
python 下划线定义
双下划线(dunder)
_var
: 单前导下划线var_
: 单末尾下划线__var
: 双前导下划线__var__
: 双前导和末尾下划线_
: 单下划线
查看变量或者属性是否存在
SO-How do I check if a variable exists
# To check the existence of a local variable
if 'myVar' in locals():
# myVar exists.
# To check the existence of a global variable
if 'myVar' in globals():
# myVar exists.
# To check if an object has an attribute:
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
检测 python 版本
检测 Pyhton 版本,py2 还是 py3
import sys
if sys.version_info[0] < 3:
print('python version is 2')
else:
print('python version is 3)
PY3 = sys.version_info[0] == 3
if PY3:
<py3 part>
else:
<py2 part>
进制转换
- 将 10 进制的 20 转成获取 3 进制:
int('20', base=3)
结果是 6, 相当于20 / 10 * 3 = 6
安装第三方包
如果使用 zsh 安装第三方包,包名中有 []
的话要使用引号引用 pip install 'requests[security]'
数据类型
int
python3 中纯粹的 int 类型没有没有界限,但是机器的最大值是有界限的,可以通过 sys.maxsize
,如果是 python2 的话则是 sys.maxint
运算符
条件运算符
in
与not in
判断元素是否在序列里面is
与is not
判断是否同一个对象- 较为复杂的判断
a < b == c
,等同于(a < b) and (b == c)
and or not
连接判断条件,整体优先级小于比较运算符.优先级not > and > or
,所以A and not B or C
等同于(A and (not B)) or C
and or
又称为短路运算符,and 中只要有一个是 false 后面的就不会执行,or 中只要有一个是 true 后面的就不执行
序列
排序
遍历序列内容
- 遍历字典内容:
for k, v in d.items()
- 遍历序列:
for i in sequence
,sequence 包括 list 及 set - 带序号遍历序列:
for i, v in enumerate(sequence)
,sequence 包括 list 和 set - 同时遍历两个或以上的序列(相同索引号循环):
for s1, s2 in zip(sequence1, sequence2)
- 遍历嵌套列表:
l = [['10', '20'], ['30', '40', '50', '20', '20', '30', '20']]; [[float(y) for y in x] for x in l]
序列的比较
两个相同类型的序列才可以比较,比较的时候是将先比较两个序列的第一个元素,如果相等则比较两个序列的下一个元素.下面的全是 true
(1, 2, 3) < (1, 2, 4)
及[1, 2, 3] < [1, 2, 4]
(1, 2, 3, 4) < (1, 2, 4)
(1, 2) < (1, 2, -1)
(1, 2, 3) == (1.0, 2.0, 3.0)
运行命令行命令
python 运行 shell 或者 cmd 命令
- 通过
os.system
模块
import os
bash_commnad = 'ls -al'
os.system(bash_command)
- 推荐用法:通过
subprocess
模块,参考 Calling an external command in Python
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 处理命令的输出
for line in p.stdout.readlines():
print line,
retval = p.wait()
文件及文件夹
生成临时文件夹
import errno
import shutil
from tempfile import mkdtemp
from contextlib import contextmanager
@contextmanager
def TemporaryDirectory(suffix='', prefix=None, dir=None):
name = mkdtemp(suffix=suffix, prefix=prefix, dir=dir)
try:
yield name
finally:
try:
shutil.rmtree(name)
except OSError as e:
# ENOENT - no such file or directory
if e.errno != errno.ENOENT:
raise e
Python 使用临时文件存储内容
from tempfile import NamedTemporaryFile
tmpfile = NamedTemporaryFile()
# append
with open(tmpfile.name, 'a') as f:
f.write("test content")
# write
with open(tmpfile.name, 'w') as f:
f.write("context")
# read
with opne(tmpfile.name) as f:
for line in f:
# do something to f
获取文件行数
# 单行代码完成统计,内存较为友好
num_lines = sum(1 for line in open(file_path) if line.rstrip())
# 如果要做得更好,比如 open 完了之后 close 文件,如果文件不能打开报错等
try:
with open(file_path, 'r') as r:
num = sum(1 for _ in r)
execpt IOError:
raise IOError()
# 通过命令行调用 shell 完成,这个会比纯 python 快,但是牺牲了内存
import subprocess
def count_file_lines(file_path):
sp_output = subprocess.check_output(['wc', '-l', file_path])
return sp_output.split(' ')[0]
敏感信息
命令行获取用户密码
Make python enter password when running a csh script : 在需要输入密码的时候输入
import getpass
pswd = getpass.getpass('Password:')
常用工具
经常用来作为工具的代码块
启动简单的 HTTP 服务
启动简单的 HTTP 服务用于访问指定位置的资源
# python 2
python2 -m SimpleHTTPSerer
# python 3
python3 -m http.server
基础
- 函数参数传递: Python 所有的 变量 都可以理解是内存中一个对象的“引用”,参见 这里
可变对象和不可变对象
- “可更改”(mutable): strings, tuples, numbers
- “不可更改”(immutable): list, dict, set
# -- coding: utf-8 -- 在 python3 中并不需要
# -*- coding: utf-8 -*-
是 python2 时代的产物,python3 中默认已经是 UTF-8 编码了,所以并不需要, 详情 。使用 pre-commit
中 fix-encoding-pragma 可以对相关内容进行修改。但是更加好的方式是使用 pyupgrade 配合 pre-commit 使用。
参数类型 unicode
unicode 在 python2 中才有,到了 py3 中就统一成了 str 类型了
Python3 中 io.StringIO 和 open() 的不同
The difference is: open takes a file name (and some other arguments like mode or encoding), io.StringIO takes a plain string and both return file-like objects.
- Use open to read files ;
- Use StringIO when you need a file-like object and you want to pass the content of a string.
if x is not None 和 if x 的区别
if x is not None
应该是更加被推崇的写法,应该这个更加明确,为了判断参数是否为空, 参考
在循环中删除元素
del a[index]
和 a.remove(k)
是否在循环内外都是同一表现, for k in a
通过记住上一个 index 值来判断下一个值
In [1]: a = [1,2,3,4,5]
...: i = 0
...: for k in a:
...: del a[i]
...: print(k)
...: print(a)
...: i = i+1
...:
1
[2, 3, 4, 5]
3
[2, 4, 5]
5
[2, 4]
In [2]: a = [1,2,3,4,5]
...: for k in a:
...: a.remove(k)
...: print(k)
...: print(a)
...:
1
[2, 3, 4, 5]
3
[2, 4, 5]
5
[2, 4]
python 解析大 xml 的实现方式
在使用 python 进行一个日志分析工具的编写过程中,由于日志很大,大约为 30M。在读写操作的时候,遇到完全读取到内存中,导致 cpu 内存不停攀升,脚本无法继续运行的问题。有没有好的方法来处理这样的单个大的文件?
python 解析 XML 文件时,可以使用的办法有 minidom、ElementTree 和 SAX,其中 minidom 和 elementTree 都是同一种思路,即将 XML 文件作为一个 Tree,在解析之前,将所有节点读入内存,并保存它们之间的父子结构关系,使用这种方法来解析 XML 文件的优势在于可以简单地获取到节点之间的关系,可以快速地获取某个节点,最大的劣势就在于当文件很大时,解析的速度会成快速地降低,可以想象如果需要将几十 M 甚至上百 M 的数据读入内存并将节点组装成一棵树,需要极大的运算量和内存空间。
针对这点,XML 提供了另外一种解析思路,即基于事件驱动的机制(SAX)。解析时解析器会响应的点就在于消息,比如某个标签(如 <table>
)开始,和某个标签(如 </table>
) 结束,当事件发生时,解析器会调用我们预先编写好的程序段去响应。Python 的 SAX 机制包括解析器和事件处理器。解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的 XML 数据进行处理。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Python 装饰器
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论