基础-访问文件和网络
元组
元组与列表类似:AngkorWat = (13.4125, 103.866667)
具体元组的用法还不是特别清楚,有待进一步学习。
默认参数
定义函数时,可以将函数的传入参数设置默认值,当未传入参数时,使用默认参数;
def box(width, height, symbol='*'):
例子:
def box(width, height, symbol):
"""print a box made up of asterisks, or some other character.
width: width of box in characters, must be at least 2
height: height of box in lines, must be at least 2
symbol: a single character string used to draw the box edges
"""
print(symbol * width) # print top edge of box
# print sides of box
for _ in range(height-2):
print(symbol + " " * (width-2) + symbol)
print(symbol * width) # print bottom edge of box
运行结果:
>>> box(7, 5)
*******
* *
* *
* *
*******
>>> box(7, 5, '#')
#######
# #
# #
# #
#######
变量作用域
一个函数内定义的函数,仅在该函数内生效;
从文件读取
f = open('/my_path/my_file.txt', 'r')
#打开文件,r代表只读,可忽略,默认即为只读;需要写入是,加'w'
,会将已有内容冲掉;在已有文档中追加用'a'
即append;file_data = f.read()
#读取文件,赋值到变量中;- 向文件中写入内容:
f.write("WritingContent")
此方法会将已有内容冲掉; - 向文件追加内容:用
open('my_file.txt', 'a')
打开后,再用f.append("WritingContent")
追加内容,已有内容保持不变; f.close()
#关闭文件,文件一旦使用完,务必要关闭,否则会耗尽系统的句柄;
还可以使用with
,对文件操作完后,自动关闭;
with open('/my_path/my_file.txt','r') as f:
file_data = f.read()
f.read()
是一个字符一个字符的读取,下次读取是从上一次读取完的位置继续读取。括号中可以传一个参数,即本次读取多少位;
with open('G:/Projects/Python/test_file/read_file_with.txt') as ttest:
print(ttest.read(2)) #从头开始,读2位
print(ttest.read(5)) #从第三位(接上一次)开始读5位
print(ttest.read()) #读取剩余的内容
print(ttest.read()) #读不到内容了,因为已经读取完了
按行读取:corpus = open('这个位置放文件绝对路径', 'r').readlines()
系统会记录当前读取行的信息(索引),默认是0,即第一行。读取完当前行之后,索引自动+1。
如果想调整读取行数,可以使用seek
标准库
Python的库/模块 类似C语言中的.h头文件。写好的一组代码,可供其他代码直接引入调用。
导入模块
Python 标准库的各组成部分称为 modules
(模块)。许多模块都只是 Python 文件,与你已经使用和编写过的 Python 脚本类似。为了使用模块中的代码,我们必须将其 import
(导入)到交互式解释器或我们自己的 Python 脚本中。
导入模块的语法很简单: import package_name
。
>>> import math
将导入语句放在文件的顶部(每个导入语句占一行)。导入模块即可运行该文件中的代码。其中通常包含很多定义,一般不显示任何输出。运行代码将使模块的所有函数和对象类型可用。
例如,math
有一个 factorial
(阶乘)函数。(该函数会得出一个正整数与所有小于该正整数的整数乘积;因此 4 的阶乘是 24,因为 4×3×2×1 = 24) 我们已经使用 import math
导入 math
模块。现在,为了使用 factorial
函数,我们需调用它,以模块名称 math
开始,然后是一个点 (.
),最后是函数名 factorial()
。
>>> print(math.factorial(3))
6
Python 标准库为其每个模块提供良好的文档,任何时候使用模块时,先阅读相关页面不失为一个好策略。这里是 math
模块的文档链接。
可以在 Python 模块周刊 中了解新模块。
其它导入方法和命名
前面已使用 import module_name
导入了模块,并通过点符号获得该模块的所有函数和所有对象类。
下面还有一些其它方法:
- 从模块导入单个函数或类:
from module_name import object_name
- 导入一个模块并重新命名(通常取较短名称):
import module_name as different_name
- 从模块导入单个项目并重命名:
from module_name import object_name as different_name
- 一种不可使用的导入方法:
from module_name import *
,会导致后续代码查找混乱,无法搜索到是哪里导入了对应的方法;
模块、包和名称
某些 Python 标准库中有很多模块!为了更好地管理代码,它们被分解成包(package)中的子模块(sub-module)。一个包只是一个包含子模块的模块。用常见的点符号指定子模块。
例如,os
模块(用于处理文件系统,对每个操作系统都起作用)具有一个子模块 os.path
,该子模块专用于处理路径名。子模块由包名称指定,与子模块名称用点号隔开。
你可以使用以下代码导入子模块 os.path
>>> import os.path
然后可以按常见方式使用子模块中的对象:
>>> os.path.isdir('my_path')
False
但是,该导入语法将只适用于子模块 —— 你不能以此种方式从模块导入函数。
>>> import os.path.isdir
ImportError: No module named 'os.path.isdir'; 'os.path' is not a package
如果想使用 os 模块的其他部分,你可以导入 os
,这样就可以访问 os.path
中的所有内容。
有时候使用模块时,命名可能会出现混乱。例如,模块可能以其中一个重要的类或函数命名。在此种情况下,需要仔细考虑导入语句:
>>> from datetime import datetime
从 datetime
模块导入 datetime
类。请注意,在此之后,使用 datetime
将表示 datetime
类,而不是模块。
第三方库
第三方包管理器
与大多数语言相比,Python 具有大型标准库。事实上,人们说 Python “自带电池”,这么说的原因是因为 Python 带有适当开展工作所需的库。但是,标准库并不具有你想要的一切,标准库不支持某些太专业化的任务。但好在独立开发人员编写了成千上万个第三方库。你可以浏览 PyPi 排名中最受欢迎的第三方库列表。
如果 Python 本身不包含这些包,那该如何获取呢?我们可以使用 pip 来安装库,Python 3 自带的一个包管理器。Python 2 用户也使用 pip,但是 Python 2 没有自带,所以必须单独安装。如果同时安装了 Python 2 和 Python 3,每个都具有 pip,可以使用命令 pip2 和 pip3 来进行区分。
pip 是 Python 的标准包管理器,但不是唯一管理器。一个常见选择是专门为数据科学家和类似用户设计的 Anaconda。我们将讲解 pip,因为其属于一般标准。
使用pip安装包
让我们使用 pip 来安装 pytz 库。为了确保我们使用的是与 Python 3 安装相关的 pip,我们将使用命令 pip3。pytz 是一个与时区相关的库,时区处理是一个非常复杂的任务。
我们可以使用 pip3
命令行安装 pytz
:
$ pip3 install pytz
该命令将下载并安装 pytz
,以便于我们将其导入程序。安装完成后,我们可以使用与从标准库导入相同的语法导入第三方包。我在这个示例中从标准库导入 pytz
和datetime
。标准的做法是将导入第三方库的语句,放在导入标准库的语句后面。
from datetime import datetime
import pytz
utc = pytz.utc # utc is Coordinated Universal Time
ist = pytz.timezone('Asia/Kolkata') #IST is Indian Standard Time
now = datetime.datetime.now(tz=utc) # this is the current time in UTC
ist_now = now.astimezone(ist) # this is the current time in IST.
有用的第三方包
整理后列表见:常用第三方包
requirements.txt
较大的 Python 程序可能依赖几十个第三方包。为了更容易共享这些程序,程序员通常会在一个名为 requirements.txt 的文件中列出项目的依赖项。这是一个 requirements.txt 文件的示例:
beautifulsoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1
文件的每一行都包含一个包的名称及其版本号。版本号在技术上是可选的,但通常应该包含在内。库可能在版本之间略有改变(或大幅改变),因此使用程序员编写程序时所使用的相同库版本非常重要。
大家可以使用 pip,通过以下命令一次安装项目的所有依赖项:
$ pip3 install -r requirements.txt
在线资源
如何搜索
以下是一些有用的网页搜索技巧:
- 尝试使用 "Python" 或正在使用的库的名称作为查询的第一个词。这会提示搜索引擎优先考虑与你所使用工具明确相关的结果。
- 可以多次尝试较好的搜索查询。如果第一次尝试未查找到有用的结果,请重试。
- 尝试使用初始搜索时,在页面上找到的关键词,以便于后续搜索时,将搜索引擎引导到更好的资源。
- 复制并粘贴错误消息,将其作为搜索关键词,这会找到错误解释和可能的错误原因。错误消息可能包括引用所编写代码的特定行号。搜索时,仅包括在此之前出现的部分错误消息。
- 如果找不到问题的答案,请自己询问!像 Stackoverflow 这样的社区具有某些礼节规定,如果想参与,就必须学习这些礼节,但不要让这些礼节影响大家对资源的使用。
搜索举例:
写代码时,你遇到以下错误信息。
UnboundLocalError: local variable 'egg_count' referenced before assignment
解释:"Python"
提示搜索引擎我们需要与 Python
相关的结果。"UnboundLocalError:"
是错误的名称,"local variable"
(局部变量)是未引用特定代码(egg_count
变量)的部分错误消息。
在线资源的层次结构
虽然关于编程的在线资源数不胜数,但并不是所有资源都是平等的。资源列表列出了可靠性的大致顺序。
- Python 教程 - 这部分官方文档涉及 Python 语法和标准库的相关研究。该文档采用各种示例,并且使用比主文档更少的技术语言编写。确保大家阅读 Python3 的文档版本!
- Python 语言和库引用 - 相对于教程,语言引用和库引用采用了更多的技术性语言,但这才是最终的真理之源。随着越来越熟悉 Python,大家应越来越多地开始利用这些资源。
- 第三方库文档 - 第三方库在自己的网站上发布文档,也经常在 https://readthedocs.org/ 上发布。大家可以通过其文档的质量判断第三方库的质量。如果开发人员没有时间编写好文档,那么他们可能也没有时间研究自己的库。
- 知名专家的网站和博客 - 之前的资源为主要资源,这意味着这些文档出自编写代码的相同人员之手。主要资源是最可靠的,次要来源也极具价值。次要来源的难点在于确定来源的可信度。像 Doug Hellmann 和 Eli Bendersky 都是非常优秀的开发人员。一个未知作者的博客可能极具价值,也可能是垃圾。
- Stackoverflow - 这个问答网站的访问量很大,所以有可能有人提问过(有人回答了)一个相关问题!然而,答案由志愿者提供,所以质量不一。在将其放入程序之前,请务必了解相关解决方案。如果答案没有任何解释,可疑性就很大。这是找到更多问题解决方案或发现替代搜索词的好地方。
- Bug 跟踪器 - 有时会遇到一个非常罕见或新的问题,而且 Stackoverflow 上也没有人解决过这个问题。例如,你可能会在 GitHub 的错误报告中引用自己的错误。这些错误报告可能会有帮助,但为了解决这个问题,可能还需要将之前的工作再重复一遍。
- Udacity 论坛。
- 其它网络论坛 - 有时候搜索可能会引用自 2004 年以来悄无生机的论坛,或类似的历史论坛。如果这些是解决问题的唯一资源,那应该重新考虑问题的解决方案。
其它在线资源整理
常用的标准模块
- csv:非常方便阅读和编写 csv 文件
- collections:常用数据类型的有用扩展,包括 OrderedDict、defaultdict 与 namedtuple
- random:生成伪随机数,随机打乱顺序,选择随机项
- string:更多的字符串功能。此模块还包含诸如 string.digits(一个包含所有有效数字字符的字符串)的有用字母集合。
- re:通过正则表达式匹配字符串模式
- math:一些标准的数学函数
- os:与操作系统交互
- os.path :操作路径名的 os 子模块
- sys:直接使用 Python 解释器
- json:很适合阅读和编写 json 文件(适合网络工作)
常用第三方包
- IPython - 一个更好的交互式 Python 解释器
- requests - 提供制作 Web 请求的简单方法,用于访问 Web API。
- Flask - 用于制作 Web 应用程序和 API 的轻量级框架。
- Django - 制作 Web 应用程序的特色框架。Django 特别适用于设计复杂、内容繁重的 Web 应用程序。
- Beautiful Soup - 用于解析 HTML 并从中提取信息。尤其适用于网络抓取。
- pytest - 扩展 Python 的内置断言(assertion)和 unittest 模块。
- PyYAML - 用于阅读和编写 YAML 文件。
- NumPy - 使用 Python 进行科学计算的基础包,除了其他功能之外,其还包含强大的 N 维数组对象和有用的线性代数功能。
- pandas - 一个包含高表现力、数据结构和数据分析工具的库。尤其是:pandas 提供了 DataFrame 数据结构!
- matplotlib - 一个 2D 绘图库,用于在交互式环境中生成各种硬拷贝格式的出版物质量图。
- ggplot - 另一个 2D 绘图库,基于 R 的 ggplot2 库。
- Pillow - Python 影像库使你的 Python 解释器新增图像处理功能。
- pyglet - 用于游戏开发的跨平台应用程序框架。
- Pygame - 用于编写游戏的 Python 模块集合。
- pytz - Python 中的世界时区定义
1