Python FAQ 常见问题

发布于 2024-08-12 09:21:04 字数 8571 浏览 12 评论 0

python 官方文档

Python Documentation contents

相关概念

交互式控制台: 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

运算符

条件运算符

  • innot in 判断元素是否在序列里面
  • isis 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)
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-commitfix-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 技术交流群。

扫码二维码加入Web技术交流群

上一篇:

下一篇:

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
24 人气
更多

推荐作者

安静被遗忘

文章 0 评论 0

喔爱吃橙子

文章 0 评论 0

草莓味的萝莉

文章 0 评论 0

梦里兽

文章 0 评论 0

mb_83J3Cyxa

文章 0 评论 0

时间海

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文