本笔记是我在学习过程中阅读过的内容,以及自己的总结,原作者内容请跟随链接跳转。
本章内容是”Hitchhiker’s Guide to Python”的中文翻译,来源于项目地址:https://github.com/Prodesire/Python-Guide-CN,我发现这个项目是源于 这个有趣的项目: HelloGitHub的推荐。
如果您问Python程序员最喜欢Python的什么,他们总会说是Python的高可读性。 事实上,高度的可读性是Python语言的设计核心。这基于这样的事实:代码的 阅读比编写更加频繁。
Python代码具有高可读性的其中一个原因是它的相对完整的代码风格指引和 “Pythonic” 的习语。
当一位富有经验的Python开发者(Pythonista)指出某段代码并不 “Pythonic”时, 通常意味着这些代码并没有遵循通用的指导方针,也没有用最佳的(最可读的)方式 来表达意图。
在某些边缘情况下,Python代码中并没有大家都认同的表达意图的最佳方式,但这些情况 都很少见。
- 一般概念
- 每行一个声明
- 函数参数
- 避免魔法方法
- 习语 (Idiom)
- 解包(unpacking)
- 创建一个被忽略的变量(如果您需要赋值(比如,在 解包(Unpacking) )但不需要这个变量,
请使用
__
,而不是_
) - 创建一个含N个列表的列表(用列表推导)
- 根据列表来创建字符串(
''.join(l)
) - Python事实上的代码风格指南(PEP8)
- 约定
- 访问字典元素(
x in d
) - 过滤列表(
filter()
) - 如果只是要遍历列表,请考虑使用迭代器
- 如果有其他变量引用原始列表,则修改它可能会有风险。但如果你真的想这样做, 你可以使用 切片赋值(slice assignment)
- 请记住,赋值永远不会创建新对象
- 创建一个新的列表对象并保留原始列表对象会更安全
- 使用
enumerate()
函数比手动维护计数有更好的可读性。而且, 它对迭代器进行了更好的优化 - 使用
with open
语法来读取文件会更好,因为它能确保您总是关闭文件 - 行的延续(一个更好的解决方案是在元素周围使用括号。左边以一个未闭合的括号开头, Python 解释器会把行的结尾和下一行连接起来直到遇到闭合的括号)
- 访问字典元素(
成为优秀Python编写者的秘诀是去阅读,理解和领会好的代码。
良好的代码通常遵循 代码风格 中的指南,尽可能向读者表述地简洁清楚。
以下是推荐阅读的Python项目。每个项目都是Python代码的典范。
Howdoi是代码搜寻工具,使用Python编写。
Flask是基于Werkzeug和Jinja2,使用Python的微框架。它能够快速启动,并且开发意图良好。
Diamond是Python的守护进程,它收集指标,并且将他们发布至Graphite或其它后端。 它能够收集CPU,内存,网络,I/O,负载和硬盘指标。除此,它拥有实现自定义收集器的API,该API几乎能 从任何资源中获取指标。
Werkzeug起初只是一个WSGI应用多种工具的集成,现在它已经变成非常重要的WSGI实用模型。 它包括强大的调试器,功能齐全的请求和响应对象,处理entity tags的HTTP工具,缓存控制标头, HTTP数据,cookie处理,文件上传,强大的URL路由系统和一些社区提供的插件模块。
Requests是Apache2许可的HTTP库,使用Python编写。
Tablib是无格式的表格数据集库,使用Python编写。
内容涵盖编码技巧、最佳实践与思维模式等方面,词条https://github.com/piglei/one-python-craftsman
%timeit func() # 考查操作的运行时间
map(func_obj, iter1, iter2) # 但是请尽量用生成器
map(lambda x:x+1, iter1, iter2) # lambda表达式
四天之内,Python使用水平达到数据科学家的水平。检查标准:给一个较大的、复杂的数据集,进行数据集处理。
代码风格:PEP8
- 使用空格而不是tab
- 缩进使用4个空格
- 第行最多79个字符
- 进行显示插入import,
from time import time
, 而不是from time import *
- 非public变量以
_
开头 - 类名用首字母大写
- 模块和脚本用短的、全小写的名称
- 函数和方法名用小写和
_
可以用linter来检查语法和风格错误,比如插件flake8。
- 字典推导式:
dict = {x: y for x in keys for y in values}
- 字典推导式:
dict = {x: values[x.index(x)] for x in keys}
- 解析文档要习惯性地用strip()来去掉空白(空格、换行符、tab等),即使看不到!
- 也可以用csv模块将csv文件加载进一个字典,它可以自动处理一些异常
import csv
with open(filename, 'rb') as f:
ff = csv.DictReader(f)
data = []
for line in ff:
data.append(line) # data是包含了以第一行为键,以其余每行为值的字典的list
数据应该返回为包含列表的列表(而不是字典)。你可以使用模块“reader” 方法获取此类格式的数据。另一个有用的方法是next(),可以用来获取迭代器中的下一行。 你只需更改parse_file 函数。
#!/usr/bin/env python
"""
Your task is to process the supplied file and use the csv module to extract data from it.
The data comes from NREL (National Renewable Energy Laboratory) website. Each file
contains information from one meteorological station, in particular - about amount of
solar and wind energy for each hour of day.
Note that the first line of the datafile is neither data entry, nor header. It is a line
describing the data source. You should extract the name of the station from it.
The data should be returned as a list of lists (not dictionaries).
You can use the csv modules "reader" method to get data in such format.
Another useful method is next() - to get the next line from the iterator.
You should only change the parse_file function.
"""
import csv
import os
DATADIR = ""
DATAFILE = "745090.csv"
def parse_file(datafile):
name = ""
data = []
with open(datafile,'rb') as f:
name = f.next()
name = name.split(',')[2]
ff = csv.reader(f)
for line in ff:
data.append(line)
# Do not change the line below
return (name, data)
def test():
datafile = os.path.join(DATADIR, DATAFILE)
name, data = parse_file(datafile)
assert name == "MOUNTAIN VIEW MOFFETT FLD NAS"
assert data[0][1] == "01:00"
assert data[2][0] == "01/01/2005"
assert data[2][5] == "2"
if __name__ == "__main__":
test()
代码 | 匹配内容 |
---|---|
\d | 任意一个数字 |
\w | 任意一个字母、数字或下划线 |
\s | 空白(空格、tab) |
\b | word的首尾 |
^ | 字符串首 |
& | 字符串尾 |
. | 除换行符的任意单个字符 |
代码 | 匹配内容 |
---|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | |
{n,} | |
{n, m} | |
满足其中任意一种规则就当成匹配成功,需要使用分枝条件:使用管道|把不同的规则分开, 这时候会从左到右地测试每个条件,如果满足了其中一个分枝,后面的规则就被忽略掉。
使用()来指定子表达式,可以指定这个子表达式的重复次数或者进行其它操作。
代码 | 匹配内容 |
---|---|
[^a] | 除a以外的任意一个字符 |
[^abdgr] | 除abdgr以外的任意一个字符 |
?在正则表达式中可能有两种含义,声明非贪心匹配或表示可选的分组
import re
s = 'ca.lled piiiig23.,sssj载我不是,霜期34,98魂牵梦萦 魂牵梦萦是;2.23..4;34.fasf:fsaf_fsd223'
pat = r'\d+\.?\d+?'
pat1 = re.compile(pat)
#matchs = re.match(pat, s)
#matchs = re.search(pat, s)
matchs = pat1.findall(s) #matchs = re.findall(pat, s)
#matchs = re.split(pat, s)
matchs = pat1.sub('REPLACED', s)
#print(matchs.group())
print(matchs)
s = '王思聪支付给李白30.10元33..0_fdsa, 2222,.0002'
ss = s.split('王思聪支付给李白')
import re
sss = re.findall(r'[\d+\.]+', s)
print(ss, sss)