一、python位置信息
下面以MacOS为例
系统自带(2.7)
- home:
/System/Library/Frameworks/Python.framework/Versions/2.7
- 自带lib:
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
- 三方lib:
/Library/Python/2.7/site-packages
xcode命令行工具(3.7)
- home:
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7
- 自带lib:
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/
- 三方lib:
/Library/Python/3.7/site-packages
或者
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/site-packages
homebrew下载(3.8)
- home:
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8
- 自带lib:
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8
- 三方lib:
/usr/local/lib/python3.8/site-packages
二、python基础
命名和包
- 变量名、函数名、包名或者文件名(模块名)用下划线命名法。
- 类名使用大驼峰命名法。
- 包使用__init__.py来表示,
- PYTHONPATH自动包含执行文件所在的路径。例如执行
python /a/b/c.py
,PYTHONPATH会自动增加/a/b这个路径。
PEP
PEP的全称是Python Enhancement Proposals,比较常见的翻译是Python增强提案或Python改进建议书。PEP分成三类:
- I - Informational PEP
- P - Process PEP
- S - Standards Track PEP
下划线
_var:受保护属性或函数,不建议外部访问;同时无法通过from somemodule import *导入
__var:私有属性或函数,解释器会进行命名修饰(name mangling)
__var__:魔术属性或函数,是由python定义的,个人不要这样命名
行拼接
# 隐式行拼接
>>> a = ('1'+'2'+
... '3'+'4')
...
>>> a
'1234'
# 显示行拼接
>>> b = '1'+'2' + \
... '3'+'4'
>>> b
'1234'
requirements.txt
-
作用:管理python的依赖模块 (类比pom.xml)
-
格式:
alembic==1.0.10 appnope==0.1.0 astroid==2.2.5 ...
-
安装依赖:pip3 install -r requirements.txt
-
写入依赖:pip3 freeze > requirements.txt
yield
把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。 runoob
iterable v.s. iterator v.s. generator
stackoverflow: iterable v.s. iterator v.s. generator
一个iterator永远是一个iterable;for循环可迭代的是iterable,它会自动应用iter函数;调用生成器函数可以返回generator;generator是一个iterator
Generator --is–> Iterator --is–> Iterable
- 实现
__iter__
魔术方法的类实例化后是一个iterable对象,对该对象调用iter
函数可获得iterator - 实现
__next__
魔术方法的类实例化后是一个iterator对象,对该对象调用next
函数可进行迭代 - 包含
yield
关键词的函数或方法调用后可以返回一个generator,对该对象调用next
函数或者调用该对象的send
方法可以进行迭代
json
-
中文乱码
import json json.dumps(dic, ensure_ascii=False)
-
格式化
import json json.dumps(dic, indent=2)
字符串处理
字符串前缀
-
f(format):自动替换变量
name = 'hch' age = 18 print(f'My name is {name}, {age} years old.')
-
r(raw):所有字符都是字面含义,不转义
print(r'\n')
-
b(bytes):字符串转为字节,只能包含ASCII字符
print(b'abc'.decode('utf-8')) # print(b'中') # SyntaxError: bytes can only contain ASCII literal characters.
-
u(unicode):python3默认为Unicode,可以忽略
print(u'中')
字符串去除空白符
- strip()同时去掉左右两边的空格
- lstrip()去掉左边的空格
- rstrip()去掉右边的空格
字符串包含
- in操作符
- find()/rfind()是否返回-1
- index()/rindex()是否抛出ValueError异常
- count()是否>0
字符串格式化
-
%操作符
print('%s is %d in digital, %x in hex, %o in octal' % ('eleven', 11, 11, 11))
-
format(),性能最差
print("My name is {} and i'm {} years old.".format(name, age))
-
f字符串前缀(变量插值),性能最好
print(f"My name is {name} and i'm {age} years old.")
输出对齐
- format()
print('{0:^20s}:{1:s}'.format(k, str(v))) # 填充与格式化::[填充字符][对齐方式 < ^ >][宽度][进制/精度/类型]
- ljust()/rjust()
print(k.ljust(w), ':', v) # just第二个参数可以指定填充字符,默认为空白符
系统相关
-
时间
import time t = time.time() print(t) #原始时间数据 print(int(t)) #秒级时间戳 print(int(round(t * 1000))) #毫秒级时间戳 print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 格式化时间
-
执行系统命令
import subprocess # cwd指定执行命令的所在路径 p=subprocess.Popen('scrapy crawl knowledge_base_spider --logfile test.log'.split(),cwd='./mobile_game') # pid为执行进程的ID号,poll方法可以轮询该进程是否结束(未结束返回None,否则返回return code) print(p.pid, p.poll()) # 杀死进程 p.kill() # 发送中断信号 p.send_signal(2) # 等待进程结束返回return code p.wait()
-
获取当前进程id
import os os.getpid() # 16895 type(os.getpid()) # <class 'int'>
-
获取执行脚本路径
import os # 脚本路径 print(__file__) # 脚本所在目录 print(os.path.dirname(__file__)) # 脚本所在上上级目录 print(os.path.abspath(os.path.join(__file__, '../..')))