该编写什么样的注释
- 编写注释的主要目的是阐述代码要做什么,以及是如何做的。
- 你总是可以通过研究代码来确定各个部分的工作原理,但通过编写注释,以清晰的自然语言对解决方案进行概述,可节省很多时间。
- 编写有意义的注释。如果不确定是否要编写注释,就问问自己,找到合理的解决方案前,是否考虑了多个解决方案。如果答案是肯定的,就编写注释对你的解决方案进行说明吧。
- 相比回过头去再添加注释,删除多余的注释要容易得多。
Python 之禅
过于强调灵活性会导致大型项目难以维护:要通过研究代码搞清楚当时解决复杂问题的人是怎么想的,既困难又麻烦,还会耗费大量的时间。经验丰富的程序员倡导尽可能避繁就简。 Python社区的理念都包含在Tim Peters撰写的“Python之禅”中。通过如下方式获取即可:
>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. # 编程是要解决问题的,设计良好、高效而漂亮的解决方案都会让程序员心生敬意。 Simple is better than complex. # 如果有两个解决方案,一个简单,一个复杂,但都行之有效,就选择简单的解决方案吧。这样,你编写的代码将更容易维护,你或他人以后改进这些代码时也会更容易。 Complex is better than complicated. # 现实是复杂的,有时候可能没有简单的解决方案。在这种情况下,就选择最简单可行的解决方案。 Readability counts. # 即便是复杂的代码,也要让它易于理解。开发的项目涉及复杂代码时,一定要为这些代码编写有益的注释。 Now is better than never. # 不要企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步改进,还是转而去编写新代码。 ... 复制代码
函数编写指南
- 应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。
- 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它。
- 给形参指定默认值时,等号两边不要有空格:
def function_name(parameter_0, parameter_1='default value')
- 对于函数调用中的关键字实参,也应遵循这种约定:
function_name(value_0, parameter_1='value')
- 如果形参很多,导致函数定义的长度超过了79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
- 所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。
类编码风格
- 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
- 对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
- 可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
- 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。在包含多条import语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。
重构
将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。重构让代码更清晰、更易于理解、更容易扩展。
项目部分重点摘录
游戏项目:外星人入侵
规划项目:
开发大型项目时,做好规划后再动手编写项目很重要。规划可确保你不偏离轨道,从而提高项目成功的可能性。
依赖库:Pygame
在Pygame中,颜色是以RGB值指定的。这种颜色由红色、绿色和蓝色值组成,其中每个值的可能取值范围都为0~255。颜色值(255, 0, 0)表示红色, (0, 255, 0)表示绿色,而(0, 0, 255)表示蓝色。通过组合不同的RGB值,可创建1600万种颜色。
编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。这样,我们就能传递一个设置对象,而不是众多不同的设置。
在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使其更容易扩展。
一开始将代码编写得尽可能简单,并在项目越来越复杂时进行重构。
研究既有代码,确定实现新功能前是否要进行重构。
数据可视化项目
依赖库:
matplotlib
:它是一个数学绘图库,我们将使用它来制作简单的图表,如折线图和散点图。Pygal
:它专注于生成适合在数字设备上显示的图表。通过使用Pygal, 可在用户与图表交互时突出元素以及调整其大小,还可轻松地调整整个图表的尺寸,使其适合在微型智能手表或巨型显示器上显示。
matplotlib
- 折线图:
plt.plot(input_values, squares, linewidth=5)
- 散点图:
plt.scatter(x_values, y_values, s=100)
- 使用颜色映射:
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor='none', s=40)
,颜色映射(colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。 - 自动保存图表:
plt.savefig('squares_plot.png', bbox_inches='tight')
,其中:第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可省略这个实参。 - 隐藏坐标轴:
plt.axes().get_xaxis().set_visible(False)
- 设置绘图窗口的尺寸:
plt.figure(dpi=128, figsize=(10, 6))
,其中:形参figsize
指定一个元组,向matplotlib指出绘图窗口的尺寸,单位为英寸。如果你知道自己的系统的分辨率,可使用形参dpi
向figure()传递该分辨率,以有效地利用可用的屏幕空间。 - 给图表区域着色:
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
- 绘制斜的日期标签:
fig.autofmt_xdate()
,以免它们彼此重叠。
pygal
使用 Python 可视化包Pygal来生成可缩放的矢量图形文件。
如果你打算以在线方式使用图表,请考虑使用Pygal来生成它们,这样它们在任何设备上显示时都会很美观。
- 绘制直方图:
hist = pygal.Bar()
Pygal使用的国别码存储在模块i18n(internationalization的缩写)中。字典COUNTRIES
包含的键和值分别为两个字母的国别码和国家名。
Pygal提供了图表类型Worldmap
,可帮助你制作呈现各国数据的世界地图。
datetime
字符串转日期对象示例:
from datetime import datetime first_date = datetime.strptime('2014-7-1', '%Y-%m-%d') print(first_date) 复制代码
模块datetime中设置日期和时间格式的实参:
%A
星期的名称,如Monday%B
月份名,如January%m
用数字表示的月份( 01~12)%d
用数字表示月份中的一天( 01~31)%Y
四位的年份,如2015%y
两位的年份,如15%H
24小时制的小时数( 00~23)%I
12小时制的小时数( 01~12)%p
am或pm%M
分钟数( 00~59)%S
秒数( 00~61)
两种常见格式存储的数据:CSV和JSON
读取 CSV 格式数据:
import csv # 从文件中获取最高气温 filename = 'sitka_weather_07-2014.csv' with open(filename) as f: reader = csv.reader(f) header_row = next(reader) highs = [] for row in reader: highs.append(row[1]) print(highs) 复制代码
读取 JSON 格式数据:
import json # 将数据加载到一个列表中 filename = 'population_data.json' with open(filename) as f: pop_data = json.load(f) # 打印每个国家2010年的人口数量 for pop_dict in pop_data: if pop_dict['Year'] == '2010': country_name = pop_dict['Country Name'] population = int(float(pop_dict['Value'])) print(country_name + ": " + population) 复制代码
Python不能直接将包含小数点的字符串转换为整数,为消除这种错误,我们需要先将字符串转换为浮点数,再将浮点数转换为整数。
requests
接口请求示例:
import requests # 执行API调用并存储响应 url = 'https://api.github.com/search/repositories?q=language:python&sort=stars' r = requests.get(url) print("Status code:", r.status_code) # 将API响应存储在一个变量中 response_dict = r.json() # 处理结果 print(response_dict.keys()) 复制代码
WEB应用程序项目
制定规范:
完整的规范详细说明了项目的目标,阐述了项目的功能,并讨论了项目的外观和用户界面。与任何良好的项目规划和商业计划书一样,规范应突出重点,帮助避免项目偏离轨道。
对网站管理员隐藏有些敏感信息。例如, Django并不存储你输入的密码,而存储从该密码派生出来的一个字符串——散列值。每当你输入密码时, Django都计算其散列值,并将结果与存储的散列值进行比较。如果这两个散列值相同,就通过了身份验证。通过存储散列值,即便黑客获得了网站数据库的访问权,也只能获取其中存储的散列值,而无法获得密码。在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。
在大型项目中,通常有一个用于整个网站的父模板——base.html
,且网站的每个主要部分都有一个父模板。每个部分的父模板都继承base.html,而网站的每个网页都继承相应部分的父模板。这让你能够轻松地修改整个网站的外观、网站任何一部分的外观以及任何一个网页的外观。这种配置提供了一种效率极高的工作方式,让你乐意不断地去改进网站。
Django根据settings.py中设置SECRET_KEY的值来实现大量的安全协议。在这个项目中,我们提交到仓库的设置文件包含设置SECRET_KEY。对于生产网站,应更细致地处理设置SECRET_KEY。如果你创建的项目的用途很重要,务必研究如何更安全地处理设置SECRET_KEY。
附录重点摘录-寻求帮助
每个人学习编程时都会遇到困难,因此作为程序员,需要学习的最重要的技能之一是如何高效地摆脱困境。
第一步:判断形势。
明确回答三个问题
你必须能够明确地回答如下三个问题,才能够从他人那里获得帮助。
- 你想要做什么?(陈述足够详细,让Python社区的其他人员能够施以援手)
- 你已尝试哪些方式?(你的答案应提供足够多的细节,这样别人就不会建议你去重复已经尝试过的方式)
- 结果如何?(知道准确的错误消息对在线搜索解决方案或寻求帮助很有用)
有时候,通过回答这三个问题,你会发现遗漏了什么,从而无需再做其他的事情就能摆脱困境。
再试试
有时候,只需回过头去重新来一次,就足以解决很多问题。
歇一会儿
如果你很长时间内一直在试图解决同一个问题,那么休息一会儿实际上是你可采取的最佳战术。长时间从事一个任务时,你可能变得一根筋,脑子里想的都是一个解决方案。你对所做的假设往往会视而不见,而休息一会儿有助于你从不同的角度看问题。不用休息很长时间,只需让你能够摆脱当前的思维方式就行。如果你坐了很长时间,起来做做运动。溜达溜达或去外面待一会儿,也可以喝杯水,或者吃点清淡而健康的零食。
如果你心情沮丧,也许该将工作放到一边,整天都不考虑了。晚上睡个好觉后,你常常会发现问题并不是那么难解决。
第二步:在线搜索
良好的搜索技能和具体的关键字有助于你找到现有的资源,供你用来解决当前面临的问题。
搜索计算机显示的错误消息也极有帮助。
第三步:IRC
程序员可通过IRC( Internet Relay Chat)实时地交流。如果你被问题困住,那么在网上搜索也找不到答案,那么在相关的IRC频道( channel)中寻求帮助可能是最佳选择。出没在这些频道中的人大多彬彬有礼、乐于助人,在你能够详细地描述你想做什么、尝试了哪些方法以及这些方法的结果时尤其如此。
经验
- 要理解新的编程概念,最佳的方式是尝试在程序中使用它们。
- 作为新手,最值得养成的习惯之一是,在代码中编写清晰、简洁的注释。
- 有时候,使用临时变量会让代码更易读;而在其他情况下,这样做只会让代码无谓地变长。你首先应该考虑的是,编写清晰易懂且能完成所需功能的代码;等到审核代码时,再考虑采用更高效的方法。
- 一开始应让代码结构尽可能简单。先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移到独立的模块中。如果你喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中。先找出让你能够编写出可行代码的方式,再尝试让代码更为组织有序。
- 每个函数都执行单一而清晰的任务。