phthon

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。

Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。

像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。



谁适合阅读本教程?

本教程适合想从零开始学习 Python 编程语言的开发人员。当然本教程也会对一些模块进行深入,让你更好的了解 Python 的应用。



学习本教程前你需要了解

在继续本教程之前,你应该了解一些基本的计算机编程术语。如果你学习过 PHP,ASP 等编程语言,将有助于你更快的了解 Python 编程。

注意本教程中所有代码均在 Python 2 编译器中编译完成,与 Python 3 编译器存在语法不兼容现象,如有需要推荐学者在 Python 官网下载 Python 2 编译器。

执行 Python 程序

对于大多数程序语言,第一个入门编程代码便是"Hello World!",以下代码为使用 Python 输出"Hello World!":

实例(Python 2.0+)

#!/usr/bin/python
print "Hello, World!";

运行实例 »

Python 3.0+版本已经把 print 作为一个内置函数,正确输出"Hello World!"代码如下:

实例(Python 3.0+)

#!/usr/bin/python
print("Hello, World!");

运行实例 »

现在开始学习 Python!

Python IDE(集成开发环境)介绍

Python 3.X版本的教程



phthon

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。

Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。

像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。



谁适合阅读本教程?

本教程适合想从零开始学习 Python 编程语言的开发人员。当然本教程也会对一些模块进行深入,让你更好的了解 Python 的应用。



学习本教程前你需要了解

在继续本教程之前,你应该了解一些基本的计算机编程术语。如果你学习过 PHP,ASP 等编程语言,将有助于你更快的了解 Python 编程。

注意本教程中所有代码均在 Python 2 编译器中编译完成,与 Python 3 编译器存在语法不兼容现象,如有需要推荐学者在 Python 官网下载 Python 2 编译器。

执行 Python 程序

对于大多数程序语言,第一个入门编程代码便是"Hello World!",以下代码为使用 Python 输出"Hello World!":

实例(Python 2.0+)

#!/usr/bin/python
print "Hello, World!";

运行实例 »

Python 3.0+版本已经把 print 作为一个内置函数,正确输出"Hello World!"代码如下:

实例(Python 3.0+)

#!/usr/bin/python
print("Hello, World!");

运行实例 »

现在开始学习 Python!

Python IDE(集成开发环境)介绍

Python 3.X版本的教程



Python 简介

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

  • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于 PHP 和 Perl 语言。

  • Python 是交互式语言: 这意味着,您可以在一个 Python 提示符,直接使用互动的形式执行你写的程序。

  • Python 是面向对象语言: 这意味着 Python 支持面向对象的风格或代码封装在对象的编程技术。

  • Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到web服务器再到游戏,python都能胜任。


Python发展历史

Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。

Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。

像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。

现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。

python团队决定在2020年的时候停止python2版本的维护,python2.7.18是其最后一个版本。


Python特点

  • 1.易于学习:Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
  • 2.易于阅读:Python 代码定义的更清晰。

  • 3.易于维护:Python 的成功在于它的源代码是相当容易维护的。

  • 4.一个广泛的标准库:Python 的最大的优势之一是丰富的库,跨平台的,在 UNIX,Windows 和 Macintosh 兼容很好。

  • 5.互动模式:互动模式的支持,您可以从终端输入并获得结果的语言,互动的测试和调试代码片断。

  • 6.便携式:Python 可以运行在多种硬件平台和所有平台上都具有相同的接口。

  • 7.可扩展:可以添加低层次的模块到 Python 解释器。这些模块使程序员可以添加或定制自己的工具,更有效。

  • 8.数据库:Python 提供所有主要的商业数据库的接口。

  • 9.GUI编程:Python 支持 GUI 可以创建和移植到许多系统调用。

  • 10.可扩展性:相比 shell 脚本,Python 提供了一个更好的结构,且支持大型程序。

Python 环境搭建

本章节我们将向大家介绍如何在本地搭建 Python 开发环境。

Python 可应用于多平台包括 Linux 和 Mac OS X,这些系统已经自带Python 支持,不需要再配置安装了。

Windows 下直接下载最新版的 Python 2.7.9,安装的时候注意选择


你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装 Python 以及 Python 的安装版本。

  • Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)
  • Win 9x/NT/2000
  • Macintosh (Intel, PPC, 68K)
  • OS/2
  • DOS (多个 DOS 版本)
  • PalmOS
  • Nokia 移动手机
  • Windows CE
  • Acorn/RISC OS
  • BeOS
  • Amiga
  • VMS/OpenVMS
  • QNX
  • VxWorks
  • Psion
  • Python 同样可以移植到 Java 和 .NET 虚拟机上。


Python下载

Python 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到:

Python官网:http://www.python.org/

你可以在以下链接中下载 Python 的文档,你可以下载 HTML、PDF 和 PostScript 等格式的文档。

Python文档下载地址:www.python.org/doc/



Python安装

Python 已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。

您需要下载适用于您使用平台的二进制代码,然后安装 Python。

如果您平台的二进制代码是不可用的,你需要使用C编译器手动编译源代码。

编译的源代码,功能上有更多的选择性, 为 Python 安装提供了更多的灵活性。

以下为不同平台上安装 Python 的方法:

Unix & Linux 平台安装 Python:

以下为在 Unix & Linux 平台上安装 Python 的简单步骤:

  • 打开 WEB 浏览器访问http://www.python.org/download/
  • 选择适用于 Unix/Linux 的源码压缩包。
  • 下载及解压压缩包。
  • 如果你需要自定义一些选项修改Modules/Setup
  • 执行 ./configure ​脚本
  • make
  • make install

执行以上操作后,Python 会安装在​ /usr/local/bin​ 目录中,Python 库安装在​/usr/local/lib/pythonXX​,XX 为你使用的 Python 的版本号。

Window 平台安装 Python:

以下为在 Window 平台上安装 Python 的简单步骤:

  • 打开 WEB 浏览器访问http://www.python.org/download/
  • 在下载列表中选择 Window 平台安装包,包格式为:​python-XYZ.msi ​文件 , XYZ 为你要安装的版本号。
  • 要使用安装程序 ​python-XYZ.msi,​ Windows 系统必须支持 Microsoft Installer 2.0 搭配使用。只要保存安装文件到本地计算机,然后运行它,看看你的机器支持 MSI。Windows XP和更高版本已经有 MSI,很多老机器也可以安装 MSI。
  • 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。

MAC 平台安装 Python:

最近的 Mac 系统都自带有 Python 环境,但是自带的 Python 版本为旧版本,你可以通过链接http://www.python.org/download/mac/ 查看 MAC 上 Python 的新版功能介绍。

MAC 上完整的 Python 安装教程你可以查看:

http://www.cwi.nl/~jack/macpython.html

环境变量配置

程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中。

path(路径)存储在环境变量中,这是由操作系统维护的一个命名的字符串。这些变量包含可用的命令行解释器和其他程序的信息。

Unix 或 Windows 中路径变量为 ​PATH​(UNIX 区分大小写,Windows 不区分大小写)。

在 Mac OS 中,安装程序过程中改变了 Python 的安装路径。如果你需要在其他目录引用Python,你必须在 ​path ​中添加 Python 目录。

在 Unix/Linux 设置环境变量

  • 在 csh shell: 输入
    setenv PATH "$PATH:/usr/local/bin/python"
    , 按下"Enter"。
  • 在 bash shell (Linux): 输入
    export PATH="$PATH:/usr/local/bin/python" 
    ,按下"Enter"。
  • 在 sh 或者 ksh shell: 输入
    PATH="$PATH:/usr/local/bin/python" 
    , 按下"Enter"。

注意: /usr/local/bin/python​ 是 Python 的安装目录。

在 Windows 设置环境变量

在环境变量中添加 Python 目录:

path=%path%;C:Python 
按下"Enter"。

注意: ​​C:Python​ ​是 Python 的安装目录。

也可以通过以下方式设置:

  • 右键点击"计算机",然后点击"属性"
  • 然后点击"高级系统设置"
  • 选择"系统变量"窗口下面的​Path​,双击即可!
  • 然后在​Path​行,添加 Python 安装路径即可(我的 ​D:Python32​),所以在后面,添加该路径即可。 ps:记住,路径直接用分号";"隔开!
  • 最后设置成功以后,在 cmd 命令行,输入命令​python​,就可以有相关显示。

python



Python 环境变量

下面几个重要的环境变量,它应用于 Python:

变量名描述
​PYTHONPATH​PYTHONPATH 是 Python 搜索路径,默认我们 import 的模块都会从 PYTHONPATH 里面寻找。
PYTHONSTARTUPPython 启动后,先寻找 PYTHONSTARTUP 环境变量,然后执行此文件中变量指定的执行代码。
PYTHONCASEOK加入 PYTHONCASEOK 的环境变量, 就会使 Python 导入模块的时候不区分大小写.
PYTHONHOME 另一种模块搜索路径。它通常内嵌于的 PYTHONSTARTUP 或 PYTHONPATH 目录中,使得两个模块库更容易切换。


运行Python

有三种方式可以运行 Python:

1、交互式解释器:

你可以通过命令行窗口进入 Python 并在交互式解释器中开始编写 Python 代码。

你可以在 Unix,DOS 或任何其他提供了命令行或者 shell 的系统进行 Python 编码工作。

$python # Unix/Linux
或者
python% # Unix/Linux
或者
C:>python # Windows/DOS

以下为 Python 命令行参数:

选项描述
-d在解析时显示调试信息
-O生成优化代码 ( .pyo 文件 )
-S启动时不引入查找 Python 路径的位置
-v输出 Python 版本号
-X从 1.6 版本之后基于内建的异常(仅仅用于字符串)已过时。
-c cmd执行 Python 脚本,并将运行结果作为 cmd 字符串。
file在给定的 Python文件执行  Python 脚本。

2、命令行脚本

在你的应用程序中通过引入解释器可以在命令行中执行 Python 脚本,如下所示:

$python script.py # Unix/Linux
或者
python% script.py # Unix/Linux
或者
C:>python script.py # Windows/DOS

注意:在执行脚本时,请检查脚本是否有可执行权限。

3、集成开发环境(IDE:Integrated Development Environment)

您可以使用图形用户界面(GUI)环境来编写及运行 Python 代码。以下推荐各个平台上使用的 IDE:

  • Unix: IDLE 是 UNIX 上最早的 Python IDE 。
  • Windows: PythonWin 是一个 Python 集成开发环境,在许多方面都比 IDLE 优秀
  • Macintosh: Python 的 Mac 可以使用 IDLE IDE,你可以在网站上下载对应 MAC 的 IDLE 。

继续下一章之前,请确保您的环境已搭建成功。如果你不能够建立正确的环境,那么你就可以从您的系统管理员的帮助。

在以后的章节中给出的例子已在 Centos(Linux)下 Python2.7.13 版本测试通过。


在 Cloud Studio 中运行 Python 程序

 Python 是跨平台的,它可以运行在 Windows、Mac 和各种 Linux/Unix 系统上。在 Windows 上写 Python 程序,放到 Linux 上也是能够运行的。要开始学习 Python 编程,首先就得把 Python 安装到你的电脑里。安装后,你会得到 Python 解释器(就是负责运行 Python 程序的),一个命令行交互环境,还有一个简单的集成开发环境。

您也可以使用 Coding Cloud Studio 这款在线云端开发工具。它提供了原生的在线 Linux 命令交互终端环境,Python 运行解释器,在线开发文本编辑器,你可以直接在工作站中创建 Python 文件并在 Cloud Studio 中运行你写的 Python 程序。然后你可以略过本节余下的安装 Python 运行环境以及集成开发环境等部分。

Python 环境搭建

如果遇到问题,您可以查看 Coding帮助文档


Python 中文编码

前面章节中我们已经学会了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题。

Python 文件中如果未指定编码,在执行过程会出现报错:

#!/usr/bin/pythonprint "你好,世界";

以上程序执行输出结果为:

  File "test.py", line 2SyntaxError: Non-ASCII character 'xe4' in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

以上出错信息显示了我们为指定编码,解决方法为只要在文件开头加入​ # -*- coding: UTF-8 -*- ​或者 ​#coding=utf-8​ 就行了。

#!/usr/bin/python# -*- coding: UTF-8 -*-print "你好,世界";

输出结果为:

你好,世界

所以如果大家在学习过程中,代码中包含中文,就需要在头部指定编码。

注意:Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

注意:如果你使用编辑器,同时需要设置好编辑器的编码,如 Pycharm 设置步骤:

  • 进入 file > Settings,在输入框搜索 encoding
  • 找到 Editor > File encodings,将 IDE Encoding 和 Project Encoding 设置为utf-8。

Python 中文编码



Python 基础语法

Python 语言与 Perl,C 和 Java 等语言有许多相似之处。但是,也存在一些差异。

在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。


用一张图概况 Python 学习



第一个 Python程序

交互式编程

交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。

linux 上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下:

$ pythonPython 2.4.3 (#1, Nov 11 2010, 13:34:43)[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

Window 上在安装 Python 时已经安装了默认的交互式编程客户端,提示窗口如下:

python27

在 Python 提示符中输入以下文本信息,然后按 Enter 键查看运行效果:

>>> print "Hello, Python!";

在 Python 2.7.13 版本中,以上事例输出结果如下:

Hello, Python!

如果您运行的是新版本的 Python,那么你就需要在 print 语句中使用括号如:

>>>  print ("Hello, Python!");

脚本式编程

通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕。当脚本执行完成后,解释器不再有效。

让我们写一个简单的 Python 脚本程序。所有 Python 文件将以 .py 为扩展名。将以下的源代码拷贝至 test.py 文件中。

print "Hello, Python!";

这里,假设你已经设置了 Python 解释器 PATH 变量。使用以下命令运行程序:

$ python test.py

输出结果:

Hello, Python!

让我们尝试另一种方式来执行 Python 脚本。修改 test.py 文件,如下所示:

#!/usr/bin/pythonprint "Hello, Python!";

这里,假定您的 Python 解释器在 /usr/bin 目录中,使用以下命令执行脚本:

$ chmod +x test.py     # 脚本文件添加可执行权限$./test.py

输出结果:

Hello, Python!

Python2.x 中使用 Python3.x 的 print 函数

如果 Python2.x 版本想使用使用 Python3.x 的 print 函数,可以导入 __future__ 包,该包禁用 Python2.x 的 print 语句,采用 Python3.x 的 print 函数:

python2方式打印:
#coding=utf-8list =["a", "b", "c"]print list    # python2.x 的 print 语句
导入 __future__ 包后使用python2方式打印: 
#coding=utf-8from __future__ import print_function  # 导入 __future__ 包list =["a", "b", "c"]print list    # python2.x 的 print 语句
会报错:

 File "<stdin>", line 1

print list

         ^

SyntaxError: invalid syntax

原因是因为python3的print与python2的不同,python3的print应该使用如下方式:

#coding=utf-8from __future__ import print_function  # 导入 __future__ 包list =["a", "b", "c"]print (list)    # python2.x 的 print 语句

Python标识符

在 Python 里,标识符由字母、数字、下划线组成。

在 Python 中,所有标识符可以包括字母、数字以及下划线(_),但不能以数字开头。

Python 中的标识符是区分大小写的。

以下划线开头的标识符是有特殊意义的。以单下划线开头(​_foo​)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"​from xxx import *​"而导入;

以双下划线开头的(​__foo​)代表类的私有成员;以双下划线开头和结尾的(​__foo__​)代表python 里特殊方法专用的标识,如​__init__()​代表类的构造函数。

Python 可以同一行显示多条语句,方法是用分号 ; 分开,如:

>>> print 'hello';print 'Python';helloPython
但这并不是一种好的编程习惯,这样的代码是比较难以阅读的,而且python以缩进区分代码块,以换行代表语句结束,使用分号来进行强制的语句结束是不合理的。

Python 保留字符

下面的列表显示了在 Python 中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名称。

所有 Python 的关键字只包含小写字母。

andexecnot
assertfinallyor
breakforpass
classfromprint
continueglobalraise
defifreturn
delimporttry
elifinwhile
elseiswith
exceptlambdayield

行和缩进

学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号({})包裹,而是以缩进来区分代码块。常见的代码块出现在函数、循环以及逻辑判断等地方。Python 最具特色的就是用缩进来写代码块。

缩进的空白数量是可变的,但是所有同一级别的代码块语句必须包含相同的缩进空白数量,这个必须严格执行。如下所示:

if True:    print "True"else:  print "False"

以下代码将会执行错误(if前面有一个空格):

#!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py if True:    print "Answer"    print "True"else:    print "Answer"    # 没有严格缩进,在执行时报错  print "False"

执行以上代码,会出现如下错误提醒:

$ python test.py    File "test.py", line 5    if True:    ^IndentationError: unexpected indent

IndentationError: unexpected indent​ 错误是 Python 编译器是在告诉你"Hi,老兄,你的文件里格式不对了,可能是 tab 和空格没对齐的问题",所有 Python 对格式要求非常严格。

 python的的最外层代码不能带有空格或缩进!!!

如果是 ​IndentationError: unindent does not match any outer indentation level错误表明,你使用的缩进方式不一致,有的是 tab 键缩进,有的是空格缩进,改为一致即可。

因此,在 Python 的代码块中必须使用相同数目的行首缩进空格数。

建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用。

 在PEP8中规定了python一次缩进最好是四格。另外,有些代码编辑器会帮助你进行代码对齐,因为就如上述的代码展示一样,有时候多打了一个空格实际上也不是很明显。

最后,虽然并没有强制规定没每一级的代码块缩进的空格数一定要固定四格,就像第一个缩进示例一样。但是这样的缩进会破坏整体代码的美观,影响代码的阅读。



多行语句

Python 语句中一般以换行作为语句的结束符。

但是我们可以使用斜杠( ​​)将一行的语句分为多行显示,如下所示:

total = item_one +          item_two +         item_three  

语句中包含​[]​,​ {} ​或 ​()​ 括号就不需要使用多行连接符。如下实例:

days = ['Monday', 'Tuesday', 'Wednesday',        'Thursday', 'Friday']

Python 引号

Python 使用单引号(​' ​),双引号(​" ​),三引号(​''' """​) 来表示字符串,引号的开始与结束必须是相同类型的。

其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,一般用在代码文件的特定地点,被当做多行注释使用。

#coding=utf-8word = 'word'sentence = "这是一个句子"paragraph = """这是一个段落包含了多个语句"""

Python注释

Python中单行注释采用 ​​开头。

#!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py# 第一个注释print "Hello, Python!";  # 第二个注释

输出结果:

Hello, Python!

注释可以在语句或表达式行末:

name = "Madisetti" # 这是一个注释

Python 中多行注释使用三个单引号(​'''​)或三个双引号(​"""​)。

#!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py'''这是多行注释,使用单引号。这是多行注释,使用单引号。这是多行注释,使用单引号。'''"""这是多行注释,使用双引号。这是多行注释,使用双引号。这是多行注释,使用双引号。"""

Python 空行

函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

记住:空行也是程序代码的一部分。

 在PEP8中规定,函数块之间需要空两行。


等待用户输入

下面的程序执行后就会等待用户输入,按回车键后就会退出:

#!/usr/bin/python# -*- coding: UTF-8 -*-raw_input("按下 enter 键退出,其他任意键显示...
")#本代码在在线工具展现效果不佳,建议使用自己的python环境

以上代码中 ,​ ​ 实现换行。一旦用户按下 enter(回车) 键退出,其它键显示。


同一行显示多条语句

#!/usr/bin/pythonimport sys; x = '51coolma'; sys.stdout.write(x + '
')

执行以上代码,输入结果为:

$ python test.py51coolma
不推荐使用这样的代码书写方式

Print 输出

print ​默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 ,

#!/usr/bin/python# -*- coding: UTF-8 -*-x="a"y="b"# 换行输出print xprint yprint '---------'# 不换行输出print x,print y,# 不换行输出print x,y

以上实例执行结果如下:

ab---------a b a b

多个语句构成代码组

缩进相同的一组语句构成一个代码块,我们称之代码组。

像 ​if​、​while​、​def ​和 ​class​ 这样的复合语句,首行以关键字开始,以冒号(​ :​ )结束,该行之后的一行或多行代码构成代码组。

我们将首行及后面的代码组称为一个子句(clause)。

如下实例:

if expression :    suite elif expression :     suite  else :     suite 

命令行参数

很多程序可以执行一些操作来查看一些基本信息,Python 可以使用 -h 参数查看各参数帮助信息:

$ python -h usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -c cmd : program passed in as string (terminates option list) -d     : debug output from parser (also PYTHONDEBUG=x) -E     : ignore environment variables (such as PYTHONPATH) -h     : print this help message and exit  [ etc. ] 

我们在使用脚本形式执行 Python 时,可以接收命令行输入的参数,具体使用可以参照  Python 命令行参数


Python 变量类型

变量是存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。

基于变量的数据类型,解释器会分配指定大小的内存,并决定什么数据可以被存储在内存中。

因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。


变量赋值

Python 中的变量不需要声明,变量的赋值操作既是变量声明的过程也是变量定义的过程。

每个变量都在内存中创建,包括变量的标识,名称和数据这些信息。

每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

等号(=)用来给变量赋值。

等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

#coding=utf-8#!/usr/bin/python counter = 100 # 赋值整型变量miles = 1000.0 # 浮点型name = "John" # 字符串 print counterprint milesprint name

以上实例中,100,1000.0 和"John"分别赋值给 counter,miles,name 变量。

执行以上程序会输出如下结果:

 100 1000.0 John

多个变量赋值

Python 允许你同时为多个变量赋值。例如:

 a = b = c = 1

以上实例,创建一个整型对象,值为 1,三个变量被分配到相同的内存空间上。

您也可以为多个对象指定多个变量。例如:

a, b, c = 1, 2, "john" 

以上实例,两个整型对象1和2的分配给变量a和b,字符串对象"john"分配给变量 c。


标准数据类型

在内存中存储的数据可以有多种类型。

例如,年龄作为一个数值存储,地址是字符存储。

Python 有一些标准类型用于定义操作上,他们定义了相应数据类型的存储方法。

Python 有五个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

Python 数字

数字数据类型用于存储数值。

他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。

当你指定一个值时,Number 对象就会被创建:

var1 = 1var2 = 10 

您也可以使用 ​del ​语句删除一些对象引用。

del ​语句的语法是:

 del var1[,var2[,var3[....,varN]]]] 

您可以通过使用 ​del​ 语句删除单个或多个对象。例如:

 del var del var_a, var_b 

Python 支持四种不同的数值类型:

  • int(有符号整型)
  • long(长整型[也可以代表八进制和十六进制])
  • float(浮点型)
  • complex(复数)
实例

一些数值类型的实例:

intlongfloatcomplex
1051924361L0.03.14j
100-0x19323L15.2045.j
-7860122L-21.99.322e-36j
0800xDEFABCECBDAECBFBAEl32.3+e18.876j
-0490535633629843L-90.-.6545+0J
-0x260-052318172735L-32.54e1003e+26J
0x69-4721885298529L70.2-E124.53e-7j
  • 长整型也可以使用小写"l",但是还是建议您使用大写"L",避免与数字"1"混淆。Python 使用"L"来显示长整型。
  • Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj ,或者complex(a,b)表示, 复数的实部 a 和虚部 b 都是浮点型

Python 字符串

字符串或串 (String) 是由数字、字母、下划线组成的一串字符。

一般记为 :

s="a1a2···an"(n>=0)

它是编程语言中表示文本的数据类型。

python 的字串列表有 2 种取值顺序:

  • 从左到右索引默认 0 开始的,最大范围是字符串长度少 1
  • 从右到左索引默认 -1 开始的,最大范围是字符串开头

如果你的实要取得一段子串的话,可以用到​变量[头下标:尾下标]​,就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

比如:

 s = 'ilovepython' 

s[1:5] 的结果是 love。

当使用以冒号分隔的字符串,Python 返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。

上面的结果包含了 s[1] 的值 l,而取到的最大范围不包括上边界,就是 s[5 ]的值 p。

加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:

#coding=utf-8#!/usr/bin/pythonstr = 'Hello World!' print str # 输出完整字符串print str[0] # 输出字符串中的第一个字符print str[2:5] # 输出字符串中第三个至第五个之间的字符串print str[2:] # 输出从第三个字符开始的字符串print str * 2 # 输出字符串两次print str + "TEST" # 输出连接的字符串 

以上实例输出结果:

 Hello World! H llo llo World! Hello World!Hello World! Hello World!TEST

Python 列表

List(列表) 是 Python 中使用最频繁的数据类型。

列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(也就是嵌套)。

列表用​[ ]​标识。是 Python 最通用的复合数据类型。看这段代码就明白。

列表中的值得分割也可以用到​变量[头下标:尾下标]​,就可以截取相应的列表,从左到右索引默认 0 开始的,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。

加号(+)是列表连接运算符,星号(*)是重复操作。如下实例:

#coding=utf-8#!/usr/bin/python list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john'] print list # 输出完整列表print list[0] # 输出列表的第一个元素print list[1:3] # 输出第二个至第三个的元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素print tinylist * 2 # 输出列表两次print list + tinylist # 打印组合的列表

以上实例输出结果:

 ['abcd', 786, 2.23, 'john', 70.2] abcd [786, 2.23] [2.23, 'john', 70.2] [123, 'john', 123, 'john'] ['abcd', 786, 2.23, 'john', 70.2, 123, 'john']

Python 元组

元组是另一个数据类型,类似于 List(列表)。

元组用"()"标识。内部元素用逗号隔开。但是元素不能二次赋值,相当于只读列表。

#coding=utf-8#!/usr/bin/python tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )tinytuple = (123, 'john') print tuple # 输出完整元组print tuple[0] # 输出元组的第一个元素print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素print tinytuple * 2 # 输出元组两次print tuple + tinytuple # 打印组合的元组

以上实例输出结果:

 ('abcd', 786, 2.23, 'john', 70.2) abcd (786, 2.23) (2.23, 'john', 70.2) (123, 'john', 123, 'john') ('abcd', 786, 2.23, 'john', 70.2, 123, 'john')

以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:

#!/usr/bin/python# -*- coding: UTF-8 -*- tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]tuple[2] = 1000    # 元组中是非法应用list[2] = 1000     # 列表中是合法应用

会报错:​TypeError: 'tuple' object does not support item assignment


Python 字典

字典 (dictionary) 是除列表以外 Python 之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典用"{ }"标识。字典由索引 (key) 和它对应的值 value 组成。

#coding=utf-8#!/usr/bin/python dict = {}dict['one'] = "This is one"dict[2] = "This is two"tinydict = {'name': 'john','code':6734, 'dept': 'sales'}  print dict['one'] # 输出键为'one' 的值print dict[2] # 输出键为 2 的值print tinydict # 输出完整的字典print tinydict.keys() # 输出所有键print tinydict.values() # 输出所有值

输出结果为:

This is oneThis is two{'dept': 'sales', 'code': 6734, 'name': 'john'}['dept', 'code', 'name']['sales', 6734, 'john']

Python 数据类型转换

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。

函数描述

int(x [,base])

将 x 转换为一个整数

long(x [,base] )

将 x 转换为一个长整数

float(x)

将 x 转换到一个浮点数

complex(real [,imag])

创建一个复数

str(x)

将对象 x 转换为字符串

repr(x)

将对象 x 转换为表达式字符串

eval(str)

用来计算在字符串中的有效 Python 表达式,并返回一个对象

tuple(s)

将序列 s 转换为一个元组

list(s)

将序列 s 转换为一个列表

set(s)

转换为可变集合

dict(d)

创建一个字典。d 必须是一个序列  (key,value) 元组。

frozenset(s)

转换为不可变集合

chr(x)

将一个整数转换为一个字符

unichr(x)

将一个整数转换为 Unicode 字符

ord(x)

将一个字符转换为它的整数值

hex(x)

将一个整数转换为一个十六进制字符串

oct(x)

将一个整数转换为一个八进制字符串


Python 运算符


什么是运算符?

本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子中,4和5被称为操作数,"+"号为运算符。

Python语言支持以下类型的运算符:

接下来让我们一个个来学习Python的运算符。


Python算术运算符

以下假设变量a为10,变量b为20:

运算符描述实例
+加 - 两个对象相加a + b 输出结果 30
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200
/除 - x除以yb / a 输出结果 2
%取模 - 返回除法的余数b % a 输出结果 0
**幂 - 返回x的y次幂a**b 为10的20次方, 输出结果 100000000000000000000
//取整除 - 返回商的整数部分9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

以下实例演示了Python所有算术运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0c = a + bprint "1 - c 的值为:", cc = a - bprint "2 - c 的值为:", c c = a * bprint "3 - c 的值为:", c c = a / bprint "4 - c 的值为:", c c = a % bprint "5 - c 的值为:", c# 修改变量 a 、b 、ca = 2b = 3c = a**b print "6 - c 的值为:", ca = 10b = 5c = a//b print "7 - c 的值为:", c

以上实例输出结果:

1 - c 的值为: 31

2 - c 的值为: 11

3 - c 的值为: 210

4 - c 的值为: 2

5 - c 的值为: 1

6 - c 的值为: 8

7 - c 的值为: 2

注意:Python2.x 里,整数除整数,只能得出整数。如果要得到小数部分,把其中一个数改成浮点数即可。

>>> 1/20>>> 1.0/20.5>>> 1/float(2)0.5

Python比较运算符

以下假设变量a为10,变量b为20:

运算符描述实例
==等于 - 比较对象是否相等(a == b) 返回 False。
!=不等于 - 比较两个对象是否不相等(a != b) 返回 true.
<>不等于 - 比较两个对象是否不相等(a <> b) 返回 true。这个运算符类似 != 。
>大于 - 返回x是否大于y(a > b) 返回 False。
<小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。(a < b) 返回 true。
>=大于等于 - 返回x是否大于等于y。(a >= b) 返回 False。
<=小于等于 - 返回x是否小于等于y。(a <= b) 返回 true。

以下实例演示了Python所有比较运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0if ( a == b ):   print "1 - a 等于 b"else:   print "1 - a 不等于 b"if ( a != b ):   print "2 - a 不等于 b"else:   print "2 - a 等于 b"if ( a <> b ):   print "3 - a 不等于 b"else:   print "3 - a 等于 b"if ( a < b ):   print "4 - a 小于 b" else:   print "4 - a 大于等于 b"if ( a > b ):   print "5 - a 大于 b"else:   print "5 - a 小于等于 b"# 修改变量 a 和 b 的值a = 5;b = 20;if ( a <= b ):   print "6 - a 小于等于 b"else:   print "6 - a 大于  b"if ( b >= a ):   print "7 - b 大于等于 a"else:   print "7 - b 小于 a"

以上实例输出结果:

1 - a 不等于 b

2 - a 不等于 b

3 - a 不等于 b

4 - a 大于等于 b

5 - a 大于 b

6 - a 小于等于 b

7 - b 大于等于 a

Python赋值运算符

以下假设变量a为10,变量b为20:

运算符描述实例
=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
+=加法赋值运算符c += a 等效于 c = c + a
-=减法赋值运算符c -= a 等效于 c = c - a
*=乘法赋值运算符c *= a 等效于 c = c * a
/=除法赋值运算符c /= a 等效于 c = c / a
%=取模赋值运算符c %= a 等效于 c = c % a
**=幂赋值运算符c **= a 等效于 c = c ** a
//=取整除赋值运算符c //= a 等效于 c = c // a

以下实例演示了Python所有赋值运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0c = a + bprint "1 - c 的值为:", cc += aprint "2 - c 的值为:", c c *= aprint "3 - c 的值为:", c c /= a print "4 - c 的值为:", c c = 2c %= aprint "5 - c 的值为:", cc **= aprint "6 - c 的值为:", cc //= aprint "7 - c 的值为:", c

以上实例输出结果:

 1 - c 的值为: 31

2 - c 的值为: 52

3 - c 的值为: 1092

4 - c 的值为: 52

5 - c 的值为: 2

6 - c 的值为: 2097152

7 - c 的值为: 99864

Python位运算符

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

运算符描述实例
&按位与运算符(a & b) 输出结果 12 ,二进制解释: 0000 1100
|按位或运算符(a | b) 输出结果 61 ,二进制解释: 0011 1101
^按位异或运算符(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~按位取反运算符(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<<左移动运算符a << 2 输出结果 240 ,二进制解释: 1111 0000
>>右移动运算符a >> 2 输出结果 15 ,二进制解释: 0000 1111

以下实例演示了Python所有位运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 60            # 60 = 0011 1100 b = 13            # 13 = 0000 1101 c = 0c = a & b;        # 12 = 0000 1100print "1 - c 的值为:", cc = a | b;        # 61 = 0011 1101 print "2 - c 的值为:", cc = a ^ b;        # 49 = 0011 0001print "3 - c 的值为:", cc = ~a;           # -61 = 1100 0011print "4 - c 的值为:", cc = a << 2;       # 240 = 1111 0000print "5 - c 的值为:", cc = a >> 2;       # 15 = 0000 1111print "6 - c 的值为:", c

以上实例输出结果:

1 - c 的值为: 12

2 - c 的值为: 61

3 - c 的值为: 49

4 - c 的值为: -61

5 - c 的值为: 240

6 - c 的值为: 15


Python逻辑运算符

Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

运算符逻辑表达式描述实例
andx and y布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。(a and b) 返回 20。
orx or y布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。
notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

以上实例输出结果:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 10b = 20if ( a and b ):   print "1 - 变量 a 和 b 都为 true"else:   print "1 - 变量 a 和 b 有一个不为 true"if ( a or b ):   print "2 - 变量 a 和 b 都为 true,或其中一个变量为 true"else:   print "2 - 变量 a 和 b 都不为 true"# 修改变量 a 的值a = 0if ( a and b ):   print "3 - 变量 a 和 b 都为 true"else:   print "3 - 变量 a 和 b 有一个不为 true"if ( a or b ):   print "4 - 变量 a 和 b 都为 true,或其中一个变量为 true"else:   print "4 - 变量 a 和 b 都不为 true"if not( a and b ):   print "5 - 变量 a 和 b 都为 false,或其中一个变量为 false"else:   print "5 - 变量 a 和 b 都为 true"

以上实例输出结果:

 1 - 变量 a 和 b 都为 true

2 - 变量 a 和 b 都为 true,或其中一个变量为 true

3 - 变量 a 和 b 有一个不为 true

4 - 变量 a 和 b 都为 true,或其中一个变量为 true

5 - 变量 a 和 b 都为 false,或其中一个变量为 false


Python成员运算符

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

运算符描述实例
in如果在指定的序列中找到值返回True,否则返回False。x 在 y序列中 , 如果x在y序列中返回True。
not in如果在指定的序列中没有找到值返回True,否则返回False。x 不在 y序列中 , 如果x不在y序列中返回True。

以下实例演示了Python所有成员运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 10b = 20list = [1, 2, 3, 4, 5 ];if ( a in list ):   print "1 - 变量 a 在给定的列表中 list 中"else:   print "1 - 变量 a 不在给定的列表中 list 中"if ( b not in list ):   print "2 - 变量 b 不在给定的列表中 list 中"else:   print "2 - 变量 b 在给定的列表中 list 中"# 修改变量 a 的值a = 2if ( a in list ):   print "3 - 变量 a 在给定的列表中 list 中"else:   print "3 - 变量 a 不在给定的列表中 list 中"

以上实例输出结果:

1 - 变量 a 不在给定的列表中 list 中

2 - 变量 b 不在给定的列表中 list 中

3 - 变量 a 在给定的列表中 list 中


Python身份运算符

身份运算符用于比较两个对象的存储单元

运算符描述实例
isis是判断两个标识符是不是引用自一个对象x is y, 如果 id(x) 等于 id(y) , is 返回结果 1
is notis not是判断两个标识符是不是引用自不同对象x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1

以下实例演示了Python所有身份运算符的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 20b = 20if ( a is b ):   print "1 - a 和 b 有相同的标识"else:   print "1 - a 和 b 没有相同的标识"if ( id(a) == id(b) ):   print "2 - a 和 b 有相同的标识"else:   print "2 - a 和 b 没有相同的标识"# 修改变量 b 的值b = 30if ( a is b ):   print "3 - a 和 b 有相同的标识"else:   print "3 - a 和 b 没有相同的标识"if ( a is not b ):   print "4 - a 和 b 没有相同的标识"else:   print "4 - a 和 b 有相同的标识"

以上实例输出结果:

1 - a 和 b 有相同的标识

2 - a 和 b 有相同的标识

3 - a 和 b 没有相同的标识

4 - a 和 b 没有相同的标识


Python运算符优先级

以下表格列出了从最高到最低优先级的所有运算符:

运算符描述
**指数 (最高优先级)
~ + -按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //乘,除,取模和取整除
+ -加法减法
>> <<右移,左移运算符
&位 'AND'
^ |位运算符
<= < > >=比较运算符
<> == !=等于运算符
= %= /= //= -= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not or and逻辑运算符

以下实例演示了Python所有运算符优先级的操作:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = 20b = 10c = 15d = 5e = 0e = (a + b) * c / d       #( 30 * 15 ) / 5print "(a + b) * c / d 运算结果为:",  ee = ((a + b) * c) / d     # (30 * 15 ) / 5print "((a + b) * c) / d 运算结果为:",  ee = (a + b) * (c / d);    # (30) * (15/5)print "(a + b) * (c / d) 运算结果为:",  ee = a + (b * c) / d;      #  20 + (150/5)print "a + (b * c) / d 运算结果为:",  e

​以上实例输出结果:​

(a + b) * c / d 运算结果为: 90

((a + b) * c) / d 运算结果为: 90

(a + b) * (c / d) 运算结果为: 90

a + (b * c) / d 运算结果为: 50


Python 条件语句

Python条件语句是通过一条或多条语句的执行结果(​True​或者​False​)来决定执行的代码块。

可以通过下图来简单了解条件语句的执行过程:

Python 条件语句

Python程序语言指定任何非0和非空(​null​)值为​true​,0 或者 ​null​为​false​。

Python 编程中​ if ​语句用于控制程序的执行,基本形式为:

if 判断条件:    执行语句……else:    执行语句……

其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。

else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句,具体例子如下:

# coding=utf8# 例1:if 基本用法flag = Falsename = 'luren'if name == 'python':         # 判断变量否为'python'    flag = True          # 条件成立时设置标志为真    print 'welcome boss'    # 并输出欢迎信息else:    print name              # 条件不成立时输出变量名称

输出结果为:

>>> luren         # 输出结果

if ​语句的判断条件可以用​>​(大于)、​=​(大于等于)、​<=​(小于等于)来表示其关系。

当判断条件为多个值时,可以使用以下形式:

if 判断条件1:    执行语句1……elif 判断条件2:    执行语句2……elif 判断条件3:    执行语句3……else:    执行语句4……

实例如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 例2:elif用法 num = 5     if num == 3:            # 判断num的值    print 'boss'        elif num == 2:    print 'user'elif num == 1:    print 'worker'elif num < 0:           # 值小于零时输出    print 'error'else:    print 'roadman'     # 条件均不成立时输出

输出结果为:

>>> roadman     # 输出结果

由于 python 并不支持 ​switch ​语句,所以多个条件判断,只能用 ​elif​ 来实现,如果判断需要多个条件需同时判断时,可以使用 ​or ​(或),表示两个条件有一个成立时判断条件成功;使用 ​and ​(与)时,表示只有两个条件同时成立的情况下,判断条件才成功。

#!/usr/bin/python# -*- coding: UTF-8 -*-# 例3:if语句多个条件num = 9if num >= 0 and num <= 10:    # 判断值是否在0~10之间    print 'hello'num = 10if num < 0 or num > 10:    # 判断值是否在小于0或大于10    print 'hello'else:    print 'undefine'num = 8# 判断值是否在0~5或者10~15之间if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):        print 'hello'else:    print 'undefine'

运行结果为:

hello

undefine

undefine

当if有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 ​and ​和 ​or ​的优先级低于​>​(大于)、​<​(小于)等判断符号,即大于和小于在没有括号的情况下会比与或要优先判断。

简单的语句组

你也可以在同一行的位置上使用if条件判断语句,如下实例:

#!/usr/bin/python # -*- coding: UTF-8 -*- var = 100 if ( var  == 100 ) : print "变量 var 的值为100" print "Good bye!" 

以上代码执行输出结果如下:

变量 var 的值为100

Good bye!


Python 循环语句

本章节将向大家介绍 Python 的循环语句,程序在一般情况下是按顺序执行的。

编程语言提供了各种控制结构,允许更复杂的执行路径。

循环语句允许我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式:

loop_architecture

Python 提供了 ​for ​循环和 ​while ​循环(在 Python 中没有 do..while 循环):

循环类型描述
while 循环在给定的判断条件为 True 时执行循环体,否则退出循环体。
for 循环重复执行语句
嵌套循环你可以在 while 循环体中嵌套 for 循环


循环控制语句

循环控制语句可以更改语句执行的顺序。Python 支持以下循环控制语句:

控制语句描述
break 语句在语句块执行过程中终止循环,并且跳出整个循环
continue 语句在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。
pass 语句pass 是空语句,是为了保持程序结构的完整性。


Python 编程中 ​while​ 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:

while 判断条件(condition):    执行语句(statements)……

执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(​null​)的值均为​True​。

当判断条件为假 ​False ​时,循环结束。

执行流程图如下:


Gif 演示 Python while 语句执行过程



实例

#!/usr/bin/pythoncount = 0while count < 9:    print 'The count is:', count    count = count + 1print "Good bye!"

以上代码执行输出结果:

The count is: 0

The count is: 1

The count is: 2

The count is: 3

The count is: 4

The count is: 5

The count is: 6

The count is: 7

The count is: 8

Good bye!

while ​语句时还有另外两个重要的命令 ​continue​,​break ​来跳过循环,​continue​ 用于跳过该次循环,​break ​则是用于退出循环,此外"判断条件"还可以是个常量,表示循环必定成立,具体用法如下:

# coding=utf-8#continue 和 break 用法 i = 1while i < 10:       i += 1    if i%2 > 0:     # 非双数时跳过输出        continue    print i         # 输出双数2、4、6、8、10 i = 1while 1:            # 循环条件为1必定成立    print i         # 输出1~10    i += 1    if i > 10:     # 当i大于10时跳出循环        break

运行结果为:

2

4

6

8

10

1

2

3

4

5

6

7

8

9

10


无限循环

如果条件判断语句永远为 ​True​,循环将会无限的执行下去,如下实例:

实例

#!/usr/bin/python# -*- coding: UTF-8 -*- var = 1while var == 1:  # 该条件永远为true,循环将无限执行下去   num = raw_input("Enter a number  :")   print "You entered: ", num print "Good bye!"#该代码在在线代码测试展现效果不好,建议在本地环境运行

以上实例输出结果:

Enter a number  :20

You entered:  20

Enter a number  :29

You entered:  29

Enter a number  :3

You entered:  3

Enter a number between :Traceback (most recent call last):

  File "test.py", line 5, in <module>

    num = raw_input("Enter a number :")

KeyboardInterrupt

注意:以上的无限循环你可以使用 CTRL+C 来中断循环。


循环使用 else 语句

在 Python 中,​while … els​e 在循环条件为 ​False ​时执行 ​else ​语句块:

实例

#!/usr/bin/python count = 0while count < 5:   print count, " is  less than 5"   count = count + 1else:   print count, " is not less than 5"

以上实例输出结果为:

 0 is less than 5

1 is less than 5

2 is less than 5

3 is less than 5

4 is less than 5

5 is not less than 5


简单语句组

类似 ​if ​语句的语法,如果你的 ​while ​循环体中只有一条语句,你可以将该语句与 ​while ​写在同一行中, 如下所示:

实例

#!/usr/bin/python flag = 1 while (flag): print 'Given flag is really true!' print "Good bye!"

"注意:以上的无限循环你可以使用 CTRL+C 来中断循环。


应用实例

Pyhton 去除字符串首尾的空格:

# coding=utf-8#一个简单的使用while去除字符串前后空格的代码str = '   W3cschool     '#打印没有处理前的字符串print str#使用循环除去字符串前的空格while str[:1] == ' ':    str = str[1:]#使用循环除去字符串后的空格while str[-1:] == ' ':    str = str[:-1]#打印处理后的结果print str


Python for 循环语句

Python ​for ​循环可以遍历任何序列的项目,如一个列表或者一个字符串。

语法:

for ​循环的语法格式如下:

for iterating_var in sequence:    statements(s)

流程图:

Python 循环嵌套

Python 语言允许在一个循环体里面嵌入另一个循环。

Python for 循环嵌套语法:

for iterating_var in sequence:   for iterating_var in sequence:      statements(s)   statements(s)

Python while 循环嵌套语法:

while expression:   while expression:      statement(s)   statement(s)

你可以在循环体内嵌入其他的循环体,如在 ​while ​循环中可以嵌入 ​for​ 循环, 同样的,你也可以在 ​for​ 循环中嵌入 while 循环。

实例:

以下实例使用了嵌套循环输出 2~100 之间的素数:

#!/usr/bin/python# -*- coding: UTF-8 -*-i = 2while(i < 100):   j = 2   while(j <= (i/j)):      if not(i%j): break      j = j + 1   if (j > i/j) :       print "{} 是素数".format(i)   i = i + 1print "Good bye!"

以上实例输出结果:

2 是素数

3 是素数

5 是素数

7 是素数

11 是素数

13 是素数

17 是素数

19 是素数

23 是素数

29 是素数

31 是素数

37 是素数

41 是素数

43 是素数

47 是素数

53 是素数

59 是素数

61 是素数

67 是素数

71 是素数

73 是素数

79 是素数

83 是素数

89 是素数

97 是素数

Good bye!


更多实例

实例一:使用循环嵌套来获取 100 以内的质数

#!/usr/bin/python# -*- coding: UTF-8 -*-num=[];i=2for i in range(2,100):   j=2   for j in range(2,i):      if(i%j==0):         break   else:      num.append(i)print num

运行结果:

 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

实例二:使用嵌套循环实现*字塔的实现

#!/usr/bin/python# -*- coding: UTF-8 -*-#*字塔i=1#j=1while i<=9:   if i<=5:      print "*"*i   elif i<=9 :      j=i-2*(i-5)      print "*"*j    i+=1else :   print ""

运行结果:

*

**

***

****

*****

****

***

**

*


Python break 语句

Python 的​break ​语句,与C语言类似,可以用来跳出 ​for ​或 ​while ​循环。

break ​语句用来终止循环语句,即循环条件没有 False 条件或者序列还没被完全递归完,也会停止执行循环语句。

break ​语句用在 ​while ​和 ​for ​循环中。

如果您使用嵌套循环,​break​ 语句将停止执行最深层的循环,并开始执行下一行代码。

Python语言 break 语句语法:

break

流程图:

cpp_break_statement

实例:

#!/usr/bin/python# -*- coding: UTF-8 -*- for letter in 'Python':     # 第一个实例   if letter == 'h':      break   print '当期字母 :', letter  var = 10                    # 第二个实例while var > 0:                 print '当期变量值 :', var   var = var -1   if var == 5:   # 当变量 var 等于 5 时退出循环      break print "Good bye!"

以上实例执行结果:

 当期字母 : P

当期字母 : y

当期字母 : t

当期变量值 : 10

当期变量值 : 9

当期变量值 : 8

当期变量值 : 7

当期变量值 : 6

Good bye!


Python continue 语句

Python ​continue ​语句跳出本次循环,而 ​break ​跳出整个循环。

continue ​语句用来告诉 Python 跳过当前循环的剩余语句,然后继续进行下一轮循环。

continue ​语句用在 ​while ​和 ​for​循环中。

 continue和break都是作用在其代码块的(也就是跟他缩进相同的代码块),而且遇到它们后在对应语句后的代码都不执行。不同的是,continue只跳过单次循环,而break结束这个循环。

举个例子,有一个循环十次的循环,其中有个条件判定,当执行到第五次的时候执行​break​或者​continue​语句。如果是执行​continue​语句,当执行到第五次的时候结束这次循环进入第六次循环,也就是所这个循环执行了9次。如果执行的是​break​语句的话,当执行到第五次循环的时候结束这次循环(也就是说不再继续循环了),结果是这个循环循环了5次。

Python 语言 continue 语句语法格式如下:

continue

流程图:

cpp_continue_statement

实例:

#!/usr/bin/python# -*- coding: UTF-8 -*-for letter in 'Python':     # 第一个实例   if letter == 'h':      continue   print '当前字母 :', lettervar = 10                    # 第二个实例while var > 0:                 var = var -1   if var == 5:      continue   print '当前变量值 :', varprint "Good bye!"

以上实例执行结果:

当前字母 : P

当前字母 : y

当前字母 : t

当前字母 : o

当前字母 : n

当前变量值 : 9

当前变量值 : 8

当前变量值 : 7

当前变量值 : 6

当前变量值 : 4

当前变量值 : 3

当前变量值 : 2

当前变量值 : 1

当前变量值 : 0

Good bye!

实例:

可以使用 Python 的 ​continue ​语句跳过某些循环,只打印 0-10 之间的奇数:

#!/usr/bin/python# -*- coding: UTF-8 -*-n = 0while n < 10:    n = n + 1    if n % 2 == 0:      # 如果n是偶数,执行continue语句        continue        # continue语句会直接继续下一轮循环,后续的print()语句不会执行    print(n)

运行结果:

1

3

5

7

9


Python pass 语句

Python ​pass ​是空语句,是为了保持程序结构的完整性。

pass ​不做任何事情,一般用做占位语句。

Python 语言 pass 语句语法格式如下:

pass

实例:

# -*- coding: UTF-8 -*- #!/usr/bin/python# 输出 Python 的每个字母for letter in 'Python':   if letter == 'h':      pass      print '这是 pass 块'   print '当前字母 :', letterprint "Good bye!"

以上实例执行结果:

当前字母 : P

当前字母 : y

当前字母 : t

这是 pass 块

当前字母 : h

当前字母 : o

当前字母 : n

Good bye!


Python 数字

Python 数字数据类型用于存储数值。

数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。

以下实例在变量赋值时数字对象将被创建:

var1 = 1var2 = 10

您也可以使用 ​del ​语句删除一些数字对象引用。

del ​语句的语法是:

del var1[,var2[,var3[....,varN]]]]

您可以通过使用 del 语句删除单个或多个对象,例如:

del vardel var_a, var_b

Python 支持四种不同的数值类型:

  • 整型 (int) - 通常被称为是整型或整数,是正或负整数,不带小数点。
  • 长整型 (long int) - 无限大小的整数,整数最后带一个大写或小写的L。(实际上还是有范围的)
  • 浮点型( float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
  • 复数 ( complex) - 复数的虚部以字母J 或 j结尾 。如:2+3i
intlongfloatcomplex
1051924361L0.03.14j
100-0x19323L15.2045.j
-7860122L-21.99.322e-36j
0800xDEFABCECBDAECBFBAEl32.3+e18.876j
-0490535633629843L-90.-.6545+0J
-0x260-052318172735L-32.54e1003e+26J
0x69-4721885298529L70.2-E124.53e-7j
  • 长整型也可以使用小写"L",但是还是建议您使用大写"L",避免与数字"1"混淆。Python 使用"L"来显示长整型。
  • Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj, 或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型

Python数字类型转换

int(x [,base ])         将x转换为一个整数  long(x [,base ])        将x转换为一个长整数  float(x )               将x转换到一个浮点数  complex(real [,imag ])  创建一个复数  str(x )                 将对象 x 转换为字符串  repr(x )                将对象 x 转换为表达式字符串  eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象  tuple(s )               将序列 s 转换为一个元组  list(s )                将序列 s 转换为一个列表  chr(x )                 将一个整数转换为一个字符  unichr(x )              将一个整数转换为Unicode字符  ord(x )                 将一个字符转换为它的整数值  hex(x )                 将一个整数转换为一个十六进制字符串  oct(x )                 将一个整数转换为一个八进制字符串 


Python math 模块、cmath 模块

Python 中数学运算常用的函数基本都在 ​math ​模块、​cmath​ 模块中。

Python ​math ​模块提供了许多对浮点数的数学运算函数。

Python ​cmath ​模块包含了一些用于复数运算的函数。

cmath ​模块的函数跟 ​math ​模块函数基本一致,区别是 ​cmath ​模块支持复数运算,​math ​模块仅支持普通的数学运算。

要使用 ​math ​或 ​cmath ​函数必须先导入:

import math

查看 ​math ​包中的内容:

>>> import math>>> dir(math)['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']>>>

下文会介绍各个函数的具体应用。

查看 ​cmath ​包中的内容:

>>> import cmath>>> dir(cmath)['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']>>>

实例:

>>> import cmath>>> cmath.sqrt(-1)1j>>> cmath.sqrt(9)(3+0j)>>> cmath.sin(1)(0.8414709848078965+0j)>>> cmath.log10(100)(2+0j)>>>

Python数学函数

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如 abs(-10) 返回 10
ceil(x) 返回整型数字的上入整数(向上取整),如 math.ceil(4.1) 返回 5
cmp(x, y)比较函数;如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x) 返回 e 的 x 次幂 (ex), 如 math.exp(1) 返回2.718281828459045
fabs(x)返回浮点型数字的绝对值,如 math.fabs(-10) 返回10.0
floor(x) 返回浮点型数字的下舍整数,如 math.floor(4.9)返回 4
log(x) 如 math.log(math.e) 返回 1.0, math.log(100,10) 返回2.0
log10(x) 返回以 10 为基数的x的对数,如 math.log10(100) 返回 2.0
max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回 x 的整数部分与小数部分,两部分的数值符号与 x 相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x [,n])返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。
sqrt(x) 返回数字 x 的平方根,数字可以为负数,返回类型为实数,如 math.sqrt(4) 返回 2+0j


Python随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python 包含以下常用随机数函数:

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从 0 到 9 中随机挑选一个整数。
randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为 1
random() 随机生成下一个实数,它在 [0,1) 围内。
seed([x]) 改变随机数生成器的种子 seed。如果你不了解其原理,你不必特别去设定 seed,Python 会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在 [x,y] 范围内。


Python三角函数

Python 包括以下三角函数:

函数描述
acos(x)返回 x 的反余弦弧度值。
asin(x)返回 x 的反正弦弧度值。
atan(x)返回 x 的反正切弧度值。
atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
cos(x)返回 x 的弧度的余弦值。
hypot(x, y)返回欧几里德范数 sqrt(x*x + y*y)。
sin(x)返回的 x 弧度的正弦值。
tan(x)返回 x 弧度的正切值。
degrees(x)将弧度转换为角度,如 degrees(math.pi/2) , 返回 90.0
radians(x)将角度转换为弧度


Python数学常量

常量描述
pi数学常量 pi(圆周率,一般以 π 来表示)
e数学常量 e,e 即自然常数(自然常数)。


Python 字符串

字符串是 Python 中最常用的数据类型之一。我们可以使用引号来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

var1 = 'Hello World!'var2 = "Python 51coolma"

Python访问字符串中的值

Python不支持单字符类型,单字符也在Python也是作为一个字符串使用。

Python访问子字符串,可以使用方括号来截取字符串,如下实例:

#!/usr/bin/pythonvar1 = 'Hello World!'var2 = "Python 51coolma"print "var1[0]: ", var1[0]print "var2[1:5]: ", var2[1:5]

以上实例执行结果:

var1[0]:  Hvar2[1:5]:  ytho

Python字符串更新

你可以对已存在的字符串进行修改,并赋值给另一个变量,如下实例:

#!/usr/bin/python# -*- coding: UTF-8 -*-var1 = 'Hello World!'print "更新字符串 :- ", var1[:6] + '51coolma!'

以上实例执行结果

更新字符串 :-  Hello 51coolma!


Python转义字符

在需要在字符中使用特殊字符时,Python 用反斜杠()转义字符。如下表:

转义字符描述
(在行尾时) 续行符
反斜杠符号
' 单引号
" 双引号
a 响铃
 退格 (Backspace)
e 转义
00
换行
v 纵向制表符
横向制表符
回车
f 换页
oyy 八进制数,yy 代表的字符,例如:o12 代表换行
xyy 十六进制数,yy 代表的字符,例如:x0a 代表换行
other 其它的字符以普通格式输出

Python字符串运算符

下表实例变量a值为字符串"Hello",b 变量值为"Python":

操作符描述实例
+字符串连接a + b 输出结果: HelloPython
*重复输出字符串a * 2 输出结果:HelloHello
[]通过索引获取字符串中字符a[1] 输出结果 e
[ : ]截取字符串中的一部分a[1:4] 输出结果 ell
in成员运算符 - 如果字符串中包含给定的字符返回 TrueH in a 输出结果 1
not in成员运算符 - 如果字符串中不包含给定的字符返回 TrueM not in a 输出结果 1
r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母"r"(可以大小写)以外,与普通字符串有着几乎完全相同的语法。print r' ' prints 和 print R' ' prints
%格式字符串请看下一章节

实例如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-a = "Hello"b = "Python"print "a + b 输出结果:", a + b print "a * 2 输出结果:", a * 2 print "a[1] 输出结果:", a[1] print "a[1:4] 输出结果:", a[1:4] if( "H" in a):    print "H 在变量 a 中" else:    print "H 不在变量 a 中" if( "M" not in a) :    print "M 不在变量 a 中" else :    print "M 在变量 a 中"print r'
'print R'
'

以上程序执行结果为:

a + b 输出结果: HelloPython

a * 2 输出结果: HelloHello

a[1] 输出结果: e

a[1:4] 输出结果: ell

H 在变量 a 中

M 不在变量 a 中


Python字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 ​%s​ 的字符串中。

在 Python 中,字符串格式化使用与 C 中的 printf 函数一样的语法。

如下实例:

#!/usr/bin/pythonprint "My name is %s and weight is %d kg!" % ('Zara', 21) 

以上实例输出结果:

My name is Zara and weight is 21 kg!

Python 字符串格式化符号:

    符   号 描述
      %c 格式化字符及其 ASCII 码
      %s 格式化字符串
      %d 格式化整数
      %u 格式化无符号整型
      %o 格式化无符号八进制数
      %x 格式化无符号十六进制数
      %X 格式化无符号十六进制数(大写)
      %f 格式化浮点数字,可指定小数点后的精度
      %e 用科学计数法格式化浮点数
      %E 作用同 %e,用科学计数法格式化浮点数
      %g %f 和 %e 的简写
      %G %f 和 %E 的简写
      %p 用十六进制数格式化变量的地址

格式化操作符辅助指令:

符号功能
*定义宽度或者小数点精度
-用做左对齐
+在正数前面显示加号( + )
<sp>在正数前面显示空格
#在八进制数前面显示零 ('0'),在十六进制前面显示 '0x' 或者 '0X' (取决于用的是 'x' 还是 'X' )
0显示的数字前面填充 '0' 而不是默认的空格
%'%%' 输出一个单一的 '%'
(var)映射变量(字典参数)
m.n.m 是显示的最小总宽度, n 是小数点后的位数(如果可用的话)

Python三引号(triple quotes)

Python 中三引号可以将复杂的字符串进行复制:

Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。

 >>> hi = '''hi there'''>>> hi   # repr()'hi
there'>>> print hi  # str()hi there  

三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。

一个典型的用例是,当你需要一块HTML或者SQL时,这时用字符串组合,特殊字符串转义将会非常的繁琐。

 errHTML = '''<HTML><HEAD><TITLE>Friends CGI Demo</TITLE></HEAD><BODY><H3>ERROR</H3><B>%s</B><P><FORM><INPUT TYPE=button VALUE=Back ONCLICK="window.history.back()"></FORM></BODY></HTML>'''cursor.execute('''CREATE TABLE users (  login VARCHAR(8), uid INTEGER,prid INTEGER)''')

Unicode 字符串

Python 中定义一个 Unicode 字符串和定义一个普通字符串一样简单:

>>> u'Hello World !'u'Hello World !'

引号前小写的"u"表示这里创建的是一个 Unicode 字符串。如果你想加入一个特殊字符,可以使用 Python 的 Unicode-Escape 编码。如下例所示:

>>> u'Hellou0020World !'u'Hello World !'

被替换的 u0020 标识表示在给定位置插入编码值为 0x0020 的 Unicode 字符(空格符)。


Python的字符串内建函数

字符串方法是从 Python1.6 到 2.0 慢慢加进来的——它们也被加到了 Python 中。

这些方法实现了 string 模块的大部分方法,如下表所示列出了目前字符串内建支持的方法,所有的方法都包含了对 Unicode 的支持,有一些甚至是专门用于 Unicode 的。

方法 描述

string.capitalize()

把字符串的第一个字符大写

string.center(width)

返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

string.count(str, beg=0, end=len(string))

返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数

string.decode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'

string.encode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'

string.endswith(obj, beg=0, end=len(string))

检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.

string.expandtabs(tabsize=8)

把字符串 string 中的 tab 符号转为空格,默认的空格数 tabsize 是 8.

string.find(str, beg=0, end=len(string))

检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

string.index(str, beg=0, end=len(string))

跟 find() 方法一样,只不过如果 str 不在 string 中会报一个异常.

string.isalnum()

如果 string 至少有一个字符并且所有字符都是字母或数字则返

回 True,否则返回 False

string.isalpha()

如果 string 至少有一个字符并且所有字符都是字母则返回 True,

否则返回 False

string.isdecimal()

如果 string 只包含十进制数字则返回 True 否则返回 False.

string.isdigit()

如果 string 只包含数字则返回 True 否则返回 False.

string.islower()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

string.isnumeric()

如果 string 中只包含数字字符,则返回 True,否则返回 False

string.isspace()

如果 string 中只包含空格,则返回 True,否则返回 False.

string.istitle()

如果 string 是标题化的 (见 title()) 则返回 True,否则返回 False

string.isupper()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

string.join(seq)

Merges (concatenates)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

string.ljust(width)

返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

string.lower()

转换 string 中所有大写字符为小写.

string.lstrip()

截掉 string 左边的空格

string.maketrans(intab, outtab])

maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

max(str)

返回字符串 str 中最大的字母。

min(str)

返回字符串 str 中最小的字母。

string.partition(str)

有点像 find()和 split() 的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.

string.replace(str1, str2,  num=string.count(str1))

把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.

string.rfind(str, beg=0,end=len(string) )

类似于 find()函数,不过是从右边开始查找.

string.rindex( str, beg=0,end=len(string))

类似于 index(),不过是从右边开始.

string.rjust(width)

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

string.rpartition(str)

类似于 partition()函数,不过是从右边开始查找.

string.rstrip()

删除 string 字符串末尾的空格.

string.split(str="", num=string.count(str))

以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串

string.splitlines(num=string.count(' '))

按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.

string.startswith(obj, beg=0,end=len(string))

检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

string.strip([obj])

在 string 上执行 lstrip()和 rstrip()

string.swapcase()

翻转 string 中的大小写

string.title()

返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())

string.translate(str, del="")

根据 str 给出的表(包含 256 个字符)转换 string 的字符,

要过滤掉的字符放到 del 参数中

string.upper()

转换 string 中的小写字母为大写

string.zfill(width)

返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

string.isdecimal()

isdecimal() 方法检查字符串是否只包含十进制字符。这种方法只存在于 unicode 对象。


Python 列表(Lists)

序列是 Python 中最基本的数据结构。序列中的每个元素都分配一个数字用来表示它的位置,索引,第一个索引是 0,第二个索引是 1,依此类推。

Python有 6 个序列的内置类型,但最常见的是列表和元组。

序列都可以进行的操作包括索引,切片,加,乘,检查成员。

此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5 ];list3 = ["a", "b", "c", "d"];

与字符串的索引一样,列表索引从 0 开始。列表可以进行截取、组合等。


访问列表中的值

使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符,如下所示:

#!/usr/bin/pythonlist1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5, 6, 7 ];print "list1[0]: ", list1[0]print "list2[1:5]: ", list2[1:5]

以上实例输出结果:

list1[0]:  physicslist2[1:5]:  [2, 3, 4, 5]

更新列表

你可以对列表的数据项进行修改或更新,你也可以使用 append() 方法来添加列表项,如下所示:

#!/usr/bin/pythonlist = ['physics', 'chemistry', 1997, 2000];print "Value available at index 2 : "print list[2];list[2] = 2001;print "New value available at index 2 : "print list[2];

注意:我们会在接下来的章节讨论 append() 方法的使用

以上实例输出结果:

Value available at index 2 :1997New value available at index 2 :2001

删除列表元素

可以使用 del 语句来删除列表的的元素,如下实例:

#!/usr/bin/pythonlist1 = ['physics', 'chemistry', 1997, 2000];print list1;del list1[2];print "After deleting value at index 2 : "print list1;

以上实例输出结果:

['physics', 'chemistry', 1997, 2000]After deleting value at index 2 :['physics', 'chemistry', 2000]

注意:我们会在接下来的章节讨论 remove() 方法的使用


Python 列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

如下所示:

Python 表达式结果 描述
len([1, 2, 3])3长度
[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
['Hi!'] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']重复
3 in [1, 2, 3]True元素是否存在于列表中
for x in [1, 2, 3]: print x,1 2 3迭代

Python 列表截取

Python 的列表截取与字符串操作类型,如下所示:

L = ['spam', 'Spam', 'SPAM!']

操作:

Python 表达式结果 描述
L[2]'SPAM!'读取列表中第三个元素
L[-2]'Spam'读取列表中倒数第二个元素
L[1:]['Spam', 'SPAM!']从第二个元素开始截取列表

Python 列表函数&方法

Python 包含以下函数:

序号函数
1cmp(list1, list2)
比较两个列表的元素
2len(list)
列表元素个数
3max(list)
返回列表元素最大值
4min(list)
返回列表元素最小值
5list(seq)
将元组转换为列表

Python 包含以下方法:

序号方法
1list.append(obj)
在列表末尾添加新的对象
2list.count(obj)
统计某个元素在列表中出现的次数
3list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj)
将对象插入列表
6list.pop(obj=list[-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj)
移除列表中某个值的第一个匹配项
8list.reverse()
反向列表中元素
9list.sort([func])
对原列表进行排序

实例:

如果 Python 列表无法正常输出汉字,则可以采取以下的解决方法:

#encoding=utf-8import json#以下代码是用来保证在线环境中运行不报错的。import sys  # 导入sys库reload(sys)sys.setdefaultencoding('utf-8')  # 设置默认的编码字符集为utf-8,避免第14行的print在在线情况下报错#本地环境可以不需要这部分代码list_words = [ '你', '我', '他' ]print( list_words )                                        # 无法正常显示汉字print( str(list_words).decode( 'string_escape' ) )         # 正常显示汉字list_words_result = json.dumps( list_words, encoding='UTF-8', ensure_ascii=False )print( list_words_result )

以上实例输出结果:

['xe4xbdxa0', 'xe6x88x91', 'xe4xbbx96']['你', '我', '他']["你", "我", "他"]


Python 元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号,列表使用方括号。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

如下实例:

tup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5 );tup3 = "a", "b", "c", "d";

创建空元组

tup1 = ();

元组中只包含一个元素时,需要在元素后面添加逗号

tup1 = (50,);

元组与字符串类似,下标索引从0开始,可以进行截取,组合等。


访问元组

元组可以使用下标索引来访问元组中的值,如下实例:

#!/usr/bin/pythontup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5, 6, 7 );print "tup1[0]: ", tup1[0]print "tup2[1:5]: ", tup2[1:5]

以上实例输出结果:

tup1[0]:  physicstup2[1:5]:  (2, 3, 4, 5)

修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

#coding=utf-8#!/usr/bin/pythontup1 = (12, 34.56);tup2 = ('abc', 'xyz');# 以下修改元组元素操作是非法的。# tup1[0] = 100;# 创建一个新的元组tup3 = tup1 + tup2;print tup3;

以上实例输出结果:

(12, 34.56, 'abc', 'xyz')

删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

#!/usr/bin/pythontup = ('physics', 'chemistry', 1997, 2000);print tup;del tup;print "After deleting tup : "print tup;

以上实例元组被删除后,控制台会有异常信息输出,输出如下所示:

('physics', 'chemistry', 1997, 2000)After deleting tup :Traceback (most recent call last):  File "test.py", line 9, in <module>    print tup;NameError: name 'tup' is not defined

元组运算符

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式结果 描述
len((1, 2, 3))3计算元素个数
(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接
['Hi!'] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print x,1 2 3迭代

元组索引,截取

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元组:

L = ('spam', 'Spam', 'SPAM!')
Python 表达式结果 描述
L[2]'SPAM!'读取第三个元素
L[-2]'Spam'反向读取;读取倒数第二个元素
L[1:]('Spam', 'SPAM!')截取元素

无关闭分隔符

任意无符号的对象,以逗号隔开,默认为元组,如下实例:

#!/usr/bin/pythonprint 'abc', -4.24e93, 18+6.6j, 'xyz';x, y = 1, 2;print "Value of x , y : ", x,y;

以上实例运行结果:

abc -4.24e+93 (18+6.6j) xyzValue of x , y : 1 2

元组内置函数

Python 元组包含了以下内置函数

序号方法及描述
1cmp(tuple1, tuple2)
比较两个元组元素。
2len(tuple)
计算元组元素个数。
3max(tuple)
返回元组中元素最大值。
4min(tuple)
返回元组中元素最小值。
5tuple(seq)
将列表转换为元组。

Python 字典(Dictionary)

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值 (key=>value) 对用冒号(:)分割,每个对之间用逗号 (,) 分割,整个字典包括在花括号 ({}) 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必。

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

也可如此创建字典:

dict1 = { 'abc': 456 };dict2 = { 'abc': 123, 98.6: 37 };

访问字典里的值

把相应的键放入熟悉的方括号内,如下实例:

#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print "dict['Name']: ", dict['Name'];print "dict['Age']: ", dict['Age'];

以上实例输出结果:

dict['Name']:  Zaradict['Age']:  7

如果用字典里没有的键访问数据,会输出错误如下:

#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print "dict['Alice']: ", dict['Alice'];

以上实例输出结果:

dict['Zara']:Traceback (most recent call last):  File "test.py", line 4, in <module>    print "dict['Alice']: ", dict['Alice'];KeyError: 'Alice'

修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; dict['Age'] = 8; # update existing entrydict['School'] = "DPS School"; # Add new entry  print "dict['Age']: ", dict['Age'];print "dict['School']: ", dict['School'];

以上实例输出结果:

dict['Age']:  8dict['School']:  DPS School

删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用 del 命令,如下实例:

#coding=utf-8#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; del dict['Name']; # 删除键是'Name'的条目dict.clear();     # 清空词典所有条目del dict ;        # 删除词典 print "dict['Age']: ", dict['Age'];print "dict['School']: ", dict['School'];

但这会引发一个异常,因为用 del 后字典不再存在:

dict['Age']:Traceback (most recent call last):  File "test.py", line 8, in <module>    print "dict['Age']: ", dict['Age'];TypeError: 'type' object is unsubscriptable

注:del() 方法后面也会讨论。


字典键的特性

字典值可以没有限制地取任何 Python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,只会保存后一次赋值,如下实例:

#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}; print "dict['Name']: ", dict['Name'];

以上实例输出结果:

dict['Name']:  Manni

2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:

#!/usr/bin/python dict = {['Name']: 'Zara', 'Age': 7}; print "dict['Name']: ", dict['Name'];

以上实例输出结果:

Traceback (most recent call last):  File "test.py", line 3, in <module>    dict = {['Name']: 'Zara', 'Age': 7};TypeError: list objects are unhashable


字典内置函数&方法

Python字典包含了以下内置函数:

序号函数及描述
1cmp(dict1, dict2)
比较两个字典元素。
2len(dict)
计算字典元素个数,即键的总数。
3str(dict)
输出字典可打印的字符串表示。
4type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。

Python字典包含了以下内置方法:

序号函数及描述
1radiansdict.clear()
删除字典内所有元素
2radiansdict.copy()
返回一个字典的浅复制
3radiansdict.fromkeys()
创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
4radiansdict.get(key, default=None)
返回指定键的值,如果值不在字典中返回 default 值
5radiansdict.has_key(key)
如果键在字典 dict 里返回 True,否则返回 False
6radiansdict.items()
以列表返回可遍历的(键, 值) 元组数组
7radiansdict.keys()
以列表返回一个字典所有的键
8radiansdict.setdefault(key, default=None)
和 get() 类似, 但如果键不已经存在于字典中,将会添加键并将值设为 default
9radiansdict.update(dict2)
把字典 dict2 的键/值对更新到 dict 里
10radiansdict.values()
以列表返回字典中的所有值

实例:

使用Python编写字典程序:

  1. 用户添加单词和定义
  2. 查找这些单词
  3. 如果查不到,请让用户知道
  4. 循环

代码如下:

#coding:utf-8# 字典创建  while开关 字典添加   字典寻找dictionary = {}flag = 'a'pape = 'a'off = 'a'while flag == 'a' or 'c' :    flag = raw_input("添加或查找单词 ?(a/c)")    if flag == "a" :                             # 开启        word = raw_input("输入单词(key):")        defintion = raw_input("输入定义值(value):")        dictionary[str(word)] = str(defintion)  # 添加字典        print "添加成功!"        pape = raw_input("您是否要查找字典?(a/0)")   #read        if pape == 'a':            print dictionary        else :            continue    elif flag == 'c':        check_word = raw_input("要查找的单词:")  # 检索        for key in sorted(dictionary.keys()):            # yes            if str(check_word) == key:                print "该单词存在! " ,key, dictionary[key]                break            else:                                       # no                off = 'b'        if off == 'b':            print "抱歉,该值不存在!"    else:                               # 停止        print "error type"        break

 在线运行的展示效果不是很好,建议使用本地代码环境进行运行!

测试结果如下所示:

添加或查找单词 ?(a/c)a

输入单词(key):w3c

输入定义值(value):51coolma.cn

添加成功!

您是否要查找字典?(a/0)0

添加或查找单词 ?(a/c)c

要查找的单词:w3c

该单词存在!  w3c 51coolma.cn

添加或查找单词 ?(a/c)


Python 日期和时间

Python 能用很多方式处理日期和时间,转换日期格式是一个常见的功能。

Python 提供了 time 和 calendar 模块可以用于格式化日期和时间。

时间间隔是以秒为单位的浮点型小数。

每个时间戳都以自从 公元1970 年 1 月 1 日0:00到现在所经过的时间来表示。

Python 的 time 模块下有很多函数可以转换常见日期格式。如函数 time.time() 用于获取当前时间戳, 如下实例:

#!/usr/bin/python# -*- coding: UTF-8 -*-import time;  # 引入time模块ticks = time.time()print "当前时间戳为:", ticks

以上实例输出结果:

当前时间戳为: 1459994552.51

时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX 和Windows 只支持到 2038 年。


什么是时间元组?

很多 Python 函数用一个元组装起来的9组数字处理时间:

序号字段
04 位数年2008
11 到 12
21 到 31
3小时0 到 23
4分钟
50 到 61 (60或61 是闰秒)
6一周的第几日0 到 6 (0 是周一)
7一年的第几日1 到 366 (儒略历)
8夏令时-1, 0, 1, -1 是决定是否为夏令时的旗帜

上述也就是struct_time元组。这种结构具有如下属性:

序号属性
0tm_year2008
1tm_mon1 到 12
2tm_mday1 到 31
3tm_hour0 到 23
4tm_min0 到 59
5tm_sec0 到 61 (60 或 61 是闰秒)
6tm_wday0 到 6 (0 是周一)
7tm_yday1 到 366 (儒略历)
8tm_isdst-1, 0, 1, -1 是决定是否为夏令时的旗帜


获取当前时间

从返回浮点数的时间辍方式向时间元组转换,只要将浮点数传递给如 localtime 之类的函数。

#!/usr/bin/python# -*- coding: UTF-8 -*-import timelocaltime = time.localtime(time.time())print "本地时间为 :", localtime

以上实例输出结果:

本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)


获取格式化的时间

你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime():

#!/usr/bin/python# -*- coding: UTF-8 -*-import timelocaltime = time.asctime( time.localtime(time.time()) )print "本地时间为 :", localtime

以上实例输出结果:

本地时间为 : Thu Apr  7 10:05:21 2016

格式化日期

我们可以使用 time 模块的 strftime 方法来格式化日期,:

time.strftime(format[, t])

#!/usr/bin/python# -*- coding: UTF-8 -*-import time# 格式化成2016-03-20 11:45:39形式print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化成Sat Mar 28 22:24:24 2016形式print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) # 将格式字符串转换为时间戳a = "Sat Mar 28 22:24:24 2016"print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

以上实例输出结果:

2021-09-06 07:08:04Mon Sep 06 07:08:04 20211459203864.0


Python中时间日期格式化符号:

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(000-9999)

%m 月份(01-12)

%d 月内中的一天(0-31)

%H 24 小时制小时数(0-23)

%I 12 小时制小时数(01-12)

%M 分钟数(00=59)

%S 秒(00-59)

%a 本地简化星期名称

%A 本地完整星期名称

%b 本地简化的月份名称

%B 本地完整的月份名称

%c 本地相应的日期表示和时间表示

%j 年内的一天(001-366)

%p 本地 A.M. 或 P.M. 的等价符

%U 一年中的星期数(00-53)星期天为星期的开始

%w 星期(0-6),星期天为星期的开始

%W 一年中的星期数(00-53)星期一为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% % 号本身


获取某月日历

Calendar 模块有很广泛的方法用来处理年历和月历,例如打印某月的月历:

#!/usr/bin/python# -*- coding: UTF-8 -*-import calendarcal = calendar.month(2016, 1)print "以下输出2016年1月份的日历:"print cal;

以上实例输出结果:

以下输出2016年1月份的日历:    January 2016Mo Tu We Th Fr Sa Su             1  2  3 4  5  6  7  8  9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30 31

Time 模块

Time 模块包含了以下内置函数,既有时间处理相的,也有转换时间格式的:

序号函数及描述
1time.altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
2time.asctime([tupletime])
接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的 24 个字符的字符串。
3time.clock( )
用以浮点数计算的秒数返回当前的 CPU 时间。用来衡量不同程序的耗时,比 time.time() 更有用。
4time.ctime([secs])
作用相当于asctime(localtime(secs)),未给参数相当于asctime()
5time.gmtime([secs])
接收时间辍(1970 纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组 t。注:t.tm_isdst 始终为 0
6time.localtime([secs])
接收时间辍(1970 纪元后经过的浮点秒数)并返回当地时间下的时间元组 t(t.tm_isdst 可取 0 或 1,取决于当地当时是不是夏令时)。
7time.mktime(tupletime)
接受时间元组并返回时间辍(1970 纪元后经过的浮点秒数)。
8time.sleep(secs)
推迟调用线程的运行,secs 指秒数。
9time.strftime(fmt[,tupletime])
接收以时间元组,并返回以可读字符串表示的当地时间,格式由 fmt 决定。
10time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
根据 fmt 的格式把一个时间字符串解析为时间元组。
11time.time( )
返回当前时间的时间戳(1970 纪元后经过的浮点秒数)。
12time.tzset()
根据环境变量 TZ 重新初始化时间相关设置。

Time 模块包含了以下 2 个非常重要的属性:

序号属性及描述
1time.timezone
属性 time.timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
2time.tzname
属性 time.tzname 包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。


日历(Calendar)模块

此模块的函数都是日历相关的,例如打印某月的字符月历。

星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用 calendar.setfirstweekday() 函数。模块包含了以下内置函数:

序号函数及描述
1calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3 个月一行,间隔距离为 c。 每日宽度间隔为 w 字符。每行长度为 21* W+18+2* C。l 是每星期行数。
2calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。
3calendar.isleap(year)
是闰年返回 True,否则为 False。
4calendar.leapdays(y1,y2)
返回在 Y1,Y2 两年之间的闰年总数。
5calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为 w 字符。每行的长度为 7* w+6。l 是每星期的行数。
6calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
7calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从 1 到 12。
8calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w,l,c).
9calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.calendar(year,w,l,c)。
10calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到 6(星期日)。
11calendar.timegm(tupletime)
和 time.gmtime 相反:接受一个时间元组形式,返回该时刻的时间辍(1970 纪元后经过的浮点秒数)。
12calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(1 月) 到 12(12 月)。


其他相关模块和函数

在 Python 种,其他处理日期和时间的模块还有:


Python函数

函数是封装好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高程序的模块性,和代码的重复利用率。你已经知道 Python 提供了许多内建函数,比如 print()。但你也可以自己创建函数,这被叫做用户自定义函数。


定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • Return[expression] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。

语法

def functionname( parameters ):   "函数_文档字符串"   function_suite   return [expression]

默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。

实例

以下为一个简单的 Python 函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

def printme( str ):   "打印传入的字符串到标准显示设备上"   print str   return

函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 提示符执行。

如下实例调用了 printme() 函数:

#coding=utf-8#!/usr/bin/python # Function definition is heredef printme( str ):   "打印任何传入的字符串"   print str;   return; # Now you can call printme functionprintme("我要调用用户自定义函数!");printme("再次调用同一函数");

以上实例输出结果:

我要调用用户自定义函数!再次调用同一函数

参数传递

在 Python 中,类型属于对象,变量是没有类型的:

a=[1,2,3] a="51coolma"

以上代码中,[1,2,3] 是 list 类型,"51coolma"是 string 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 list 类型对象,也可以指向 是 string 类型对象。

可更改 (mutable) 与不可更改 (immutable) 对象

在 Python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list, dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身 la 没有动,只是其内部的一部分值被修改了。

Python 函数的参数传递:

  • 不可变类型:类似 c++的值传递,如 整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
  • 可变类型:类似 c++的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

 Python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

Python 传不可变对象实例

实例(Python 2.0+)

#!/usr/bin/python# -*- coding: UTF-8 -*- def ChangeInt( a ):    a = 10 b = 2ChangeInt(b)print b # 结果是 2

实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。

按值传递参数和按引用传递参数(传可变对象实例)

所有参数(自变量)在 Python 里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

#coding=utf-8#!/usr/bin/python # 可写函数说明def changeme( mylist ):   "修改传入的列表"   mylist.append([1,2,3,4]);   print "函数内取值: ", mylist   return # 调用changeme函数mylist = [10,20,30];changeme( mylist );print "函数外取值: ", mylist

传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

参数

以下是调用函数时可使用的正式参数类型:

  • 必备参数
  • 命名参数
  • 缺省参数
  • 不定长参数

必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:

#coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return; #调用printme函数printme();

以上实例输出结果:

Traceback (most recent call last):  File "test.py", line 11, in <module>    printme();TypeError: printme() takes exactly 1 argument (0 given)

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 printme() 调用时使用参数名:

#!/usr/bin/python# -*- coding: UTF-8 -*-#可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return;#调用printme函数printme( str = "My string");

以上实例输出结果:

My string

下例能将关键字参数顺序不重要展示得更清楚:

#!/usr/bin/python# -*- coding: UTF-8 -*-#可写函数说明def printinfo( name, age ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return;#调用printinfo函数printinfo( age=50, name="miki" );

以上实例输出结果:

Name:  miki

Age  50

命名参数

命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为 Python 解释器能够用参数名匹配参数值。用命名参数调用 printme() 函数:

#coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return; #调用printme函数printme( str = "My string");

以上实例输出结果:

My string

下例能将命名参数顺序不重要展示得更清楚:

#coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return; #调用printinfo函数printinfo( age=50, name="miki" );

以上实例输出结果:

Name:  mikiAge  50

缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的 age,如果 age 没有被传入:

#coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age = 35 ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return; #调用printinfo函数printinfo( age=50, name="miki" );printinfo( name="miki" );

以上实例输出结果:

Name:  mikiAge  50Name:  mikiAge  35

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):   "函数_文档字符串"   function_suite   return [expression]

加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:

#coding=utf-8#!/usr/bin/python # 可写函数说明def printinfo( arg1, *vartuple ):   "打印任何传入的参数"   print "输出: "   print arg1   for var in vartuple:      print var   return; # 调用printinfo 函数printinfo( 10 );printinfo( 70, 60, 50 );

以上实例输出结果:

输出:10输出:706050

匿名函数

python 使用 lambda 来创建匿名函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

lambda 函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

如下实例:

#coding=utf-8#!/usr/bin/python #可写函数说明sum = lambda arg1, arg2: arg1 + arg2; #调用sum函数print "Value of total : ", sum( 10, 20 )print "Value of total : ", sum( 20, 20 )

以上实例输出结果:

Value of total :  30Value of total :  40

return 语句

return 语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:

#coding=utf-8#!/usr/bin/python # 可写函数说明def sum( arg1, arg2 ):   # 返回2个参数的和."   total = arg1 + arg2   print "Inside the function : ", total   return total; # 调用sum函数total = sum( 10, 20 );print "Outside the function : ", total 

以上实例输出结果:

Inside the function :  30Outside the function :  30

变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

  • 全局变量
  • 局部变量

变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

#coding=utf-8#!/usr/bin/python total = 0; # This is global variable.# 可写函数说明def sum( arg1, arg2 ):   #返回2个参数的和."   total = arg1 + arg2; # total在这里是局部变量.   print "Inside the function local total : ", total   return total; #调用sum函数sum( 10, 20 );print "Outside the function global total : ", total 

以上实例输出结果:

Inside the function local total :  30Outside the function global total :  0


Python 模块

模块让你能够有逻辑地组织你的 Python 代码段。

把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。

模块也是 Python 对象,具有随机的名字属性用来绑定或引用。

简单地说,模块就是一个保存了 Python 代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。

例子

一个叫做 aname 的模块里的 Python 代码一般都能在一个叫 aname.py 的文件中找到。下例是个简单的模块 support.py。

def print_func( par ):   print "Hello : ", par   return

import 语句

想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

import module1[, module2[,... moduleN]

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 hello.py,需要把命令放在脚本的顶端:

#coding=utf-8#!/usr/bin/python # 导入模块import support # 现在可以调用模块里包含的函数了support.print_func("Zara")

以上实例输出结果:

Hello : Zara

一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。


From…import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:

from modname import name1[, name2[, ... nameN]]

例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:

from fib import fibonacci

这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将fib里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。


From…import* 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。


定位模块

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 当前目录
  • 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  • 如果都找不到,Python 会察看默认路径。UNIX下,默认路径一般为 /usr/local/lib/python/

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH 和由安装过程决定的默认目录。



PYTHONPATH变量

作为环境变量,PYTHONPATH 由装在一个列表里的许多目录组成。PYTHONPATH 的语法和 shell 变量PATH的一样。

在 Windows 系统,典型的 PYTHONPATH 如下:

set PYTHONPATH=c:python20lib;

在 UNIX 系统,典型的 PYTHONPATH 如下:

set PYTHONPATH=/usr/local/lib/python


命名空间和作用域

变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。

一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。

Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

因此,如果要给全局变量在一个函数里赋值,必须使用 global 语句。

global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

例如,我们在全局命名空间里定义一个变量 money。我们再在函数内给变量 money 赋值,然后 Python 会假定 money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句的注释就能解决这个问题。

#coding=utf-8#!/usr/bin/python Money = 2000def AddMoney():   # 想改正代码就取消以下注释:   # global Money   Money = Money + 1 print MoneyAddMoney()print Money


dir()函数

dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。

返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:

#coding=utf-8#!/usr/bin/python # 导入内置math模块import math content = dir(math) print content;

以上实例输出结果:

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。



globals() 和 locals() 函数

根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。

如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。

如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。

两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。



reload() 函数

当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:

reload(module_name)

在这里,module_name 要直接放模块的名字,而不是一个字符串形式。比如想重载 hello 模块,如下:

reload(hello)


Python 中的包

包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

考虑一个在 Phone 目录下的 pots.py 文件。这个文件有如下源代码:

#coding=utf-8#!/usr/bin/python def Pots():   print "I'm Pots Phone"

同样地,我们有另外两个保存了不同函数的文件:

  • Phone/Isdn.py 含有函数 Isdn()
  • Phone/G3.py 含有函数 G3()

现在,在 Phone 目录下创建 file __init__.py:

  • Phone/__init__.py

当你导入 Phone 时,为了能够使用所有函数,你需要在 __init__.py 里使用显式的导入语句,如下:

from Pots import Potsfrom Isdn import Isdnfrom G3 import G3

当你把这些代码添加到__init__.py之后,导入 Phone 包的时候这些类就全都是可用的了。

#coding=utf-8#!/usr/bin/python # Now import your Phone Package.import Phone Phone.Pots()Phone.Isdn()Phone.G3()

以上实例输出结果:

I'm Pots PhoneI'm 3G PhoneI'm ISDN Phone

如上,为了举例,我们只在每个文件里放置了一个函数,但其实你可以放置许多函数。你也可以在这些文件里定义 Python 的类,然后为这些类建一个包。

Python 文件 I/O

本章只讲述所有基本的的 I/O 函数,更多函数请参考 Python 标准文档。

 关于python文件读写和基本输入输出的代码,由于在线示例的限制并不能较好的展现出应有的运行结果,建议在本地环境下运行!

打印到屏幕

最简单的输出方法是用 print 语句,你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下:

#!/usr/bin/python print "Python is really a great language,", "isn't it?";

你的标准屏幕上会产生以下结果:

Python is really a great language, isn't it?

读取键盘输入

Python 提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:

  • raw_input
  • input

raw_input函数

raw_input([prompt]) 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):

#!/usr/bin/python# -*- coding: UTF-8 -*-  str = raw_input("请输入:");print "你输入的内容是: ", str

这将提示你输入任意字符串,然后在屏幕上显示相同的字符串。当我输入"Hello Python!",它的输出如下:

请输入:Hello Python!你输入的内容是:  Hello Python!

input函数

input([prompt]) 函数和 raw_input([prompt]) 函数基本可以互换,但是 input 会假设你的输入是一个有效的 Python 表达式,并返回运算结果。

#!/usr/bin/python str = input("Enter your input: ");print "Received input is : ", str

这会产生如下的对应着输入的结果:

Enter your input: [x*5 for x in range(2,10,2)]Recieved input is :  [10, 20, 30, 40]

打开和关闭文件

到现在为止,你已经可以向标准输入和输出进行读写。现在,来看看怎么读写实际的数据文件。

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。

open函数

你必须先用 Python 内置的 open() 函数打开一个文件,创建一个 file 对象,相关的辅助方法才可以调用它进行读写。

语法:

file object = open(file_name [, access_mode][, buffering])

各个参数的细节如下:

  • file_name:file_name 变量是一个包含了你要访问的文件名称的字符串值。
  • access_mode:access_mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • buffering: 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

不同模式打开文件的完全列表:

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

下图很好的总结了这几种模式:

Python 文件I/O

模式rr+ww+aa+
++++
+++++
创建++++
覆盖++
指针在开始++++
指针在结尾++


File 对象的属性

一个文件被打开后,你有一个 file 对象,你可以得到有关该文件的各种信息。

以下是和 file 对象相关的所有属性的列表:

属性描述
file.closed如果文件已被关闭返回 True,否则返回 False。
file.mode返回被打开文件的访问模式。
file.name返回文件的名称。
file.softspace如果用 print 输出后,必须跟一个空格符,则返回 False。否则返回 True。

如下实例:

#!/usr/bin/python# -*- coding: UTF-8 -*- # 打开一个文件fo = open("foo.txt", "wb")print "文件名: ", fo.nameprint "是否已关闭 : ", fo.closedprint "访问模式 : ", fo.modeprint "末尾是否强制加空格 : ", fo.softspace

以上实例输出结果:

文件名:  foo.txt是否已关闭 :  False访问模式 :  wb末尾是否强制加空格 :  0

Close()方法

File对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

语法:

fileObject.close();

例子:

#coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("foo.txt", "wb")print "文件名: ", fo.name # 关闭打开的文件fo.close()

以上实例输出结果:

文件名:  foo.txt

读写文件:

file 对象提供了一系列方法,能让我们的文件访问更轻松。来看看如何使用 read() 和 write() 方法来读取和写入文件。

write() 方法

write() 方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python 字符串可以是二进制数据,而不是仅仅是文字。

write() 方法不在字符串的结尾添加换行符 (' '):

语法:

fileObject.write(string);

在这里,被传递的参数是要写入到已打开文件的内容。

例子:

#coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "wb")fo.write( "Python is a great language.
Yeah its great!!
"); # 关闭打开的文件fo.close()#!/usr/bin/python

上述方法会创建 foo.txt 文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容:

Python is a great language.Yeah its great!!

read()方法

read() 方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python 字符串可以是二进制数据,而不是仅仅是文字。

语法:

fileObject.read([count]);

在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。

例子:

就用我们上面创建的文件 foo.txt。

#coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "r+")str = fo.read(10);print "读取的字符串是: ", str# 关闭打开的文件fo.close()

以上实例输出结果:

读取的字符串是:  Python is

文件位置:

tell() 方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后:

seek(offset [,from])方法改变当前文件的位置。Offset 变量表示要移动的字节数。From 变量指定开始移动字节的参考位置。

如果 from 被设为 0,这意味着将文件的开头作为移动字节的参考位置。如果设为 1,则使用当前的位置作为参考位置。如果它被设为 2,那么该文件的末尾将作为参考位置。

例子:

就用我们上面创建的文件 foo.txt。

#coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "r+")str = fo.read(10);print "读取的字符串是: ", str # 查找当前位置position = fo.tell();print "当前文件位置: ", position # 把指针再次重新定位到文件开头position = fo.seek(0, 0);str = fo.read(10);print "重新读取字符串: ", str# 关闭打开的文件fo.close()

以上实例输出结果:

读取的字符串是:  Python is当前文件位置:  10重新读取字符串:  Python is

重命名和删除文件

Python 的 os 模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。

要使用这个模块,你必须先导入它,然后可以调用相关的各种功能。

rename() 方法:

rename() 方法需要两个参数,当前的文件名和新文件名。

语法:

os.rename(current_file_name, new_file_name)

例子:

下例将重命名一个已经存在的文件 test1.txt。

#coding=utf-8#!/usr/bin/pythonimport os # 重命名文件test1.txt到test2.txt。os.rename( "test1.txt", "test2.txt" )

remove() 方法

你可以用 remove() 方法删除文件,需要提供要删除的文件名作为参数。

语法:

os.remove(file_name)

例子:

下例将删除一个已经存在的文件 test2.txt。

#coding=utf-8#!/usr/bin/pythonimport os # 删除一个已经存在的文件test2.txtos.remove("text2.txt")

Python 里的目录:

所有文件都包含在各个不同的目录下,不过 Python 也能轻松处理。os 模块有许多方法能帮你创建,删除和更改目录。

mkdir() 方法

可以使用 os 模块的 mkdir() 方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。

语法:

os.mkdir("newdir")

例子:

下例将在当前目录下创建一个新目录 test。

#coding=utf-8#!/usr/bin/pythonimport os # 创建目录testos.mkdir("test")

chdir() 方法

可以用 chdir() 方法来改变当前的目录。chdir() 方法需要的一个参数是你想设成当前目录的目录名称。

语法:

os.chdir("newdir")

例子:

下例将进入 "/home/newdir" 目录。

#coding=utf-8#!/usr/bin/pythonimport os # 将当前目录改为"/home/newdir"os.chdir("/home/newdir")

getcwd() 方法:

getcwd() 方法显示当前的工作目录。

语法:

os.getcwd()

例子:

下例给出当前目录:

#coding=utf-8#!/usr/bin/pythonimport os # 给出当前的目录os.getcwd()

rmdir()方法

rmdir() 方法删除目录,目录名称以参数传递。

在删除这个目录之前,它的所有内容应该先被清除。

语法:

os.rmdir('dirname')

例子:

以下是删除" /tmp/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。

#coding=utf-8#!/usr/bin/pythonimport os # 删除”/tmp/test”目录os.rmdir( "/tmp/test"  )

文件、目录相关的方法

三个重要的方法来源能对 Windows 和 Unix 操作系统上的文件及目录进行一个广泛且实用的处理及操控,如下:

  • File 对象方法: file 对象提供了操作文件的一系列方法。
  • OS 对象方法: 提供了处理文件及目录的一系列方法。


Python File(文件) 方法

 由于在线示例的限制,所有文件操作的方法都不能在线运行(运行会报错),建议在本地环境下运行相关代码

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

序号方法及描述
1

file.close()

关闭文件。关闭后文件不能再进行读写操作。

2

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

3

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如 os 模块的 read 方法等一些底层操作上。

4

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

5

file.next()

返回文件下一行。

6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

7

file.readline([size])

读取整行,包括 " " 字符。

8

file.readlines([sizehint])

读取所有行并返回列表,若给定 sizeint>0,返回总和大约为 sizeint 字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

9

file.seek(offset[, whence])

设置文件当前位置

10

file.tell()

返回文件当前位置。

11

file.truncate([size])

截取文件,截取的字节通过 size 指定,默认为当前文件位置。

12

file.write(str)

将字符串写入文件,返回的是写入的字符。

13

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。


Python 异常处理

Python 提供了两个非常重要的功能来处理 Python 程序在运行中出现的异常和错误。你可以使用该功能来调试 Python 程序。

  • 异常处理: 本站 Python 教程会具体介绍。
  • 断言 (Assertions): 本章 Python 教程会具体介绍。

Python 标准异常

异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器 (generator) 发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达 EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于 Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用 (Weak reference) 试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython 语法错误
IndentationError缩进错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型 (long) 的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为 (runtime behavior) 的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

什么是异常?

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

一般情况下,在 Python 无法正常处理程序时就会发生一个异常。

异常是 Python 对象,表示一个错误。

当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行。


异常处理

捕捉异常可以使用 try/except 语句。

try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。

如果你不想在异常发生时结束你的程序,只需在 try 里捕获它。

语法:

以下为简单的 try....except...else 的语法:

try:<语句>        #运行别的代码except <名字>:<语句>        #如果在try部份引发了'名字'异常except <名字>,<数据>:<语句>        #如果引发了'名字'异常,获得附加的数据else:<语句>        #如果没有异常发生

try 的工作原理是,当开始一个 try 语句后,Python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常。

  • 如果当 try 后的语句执行时发生异常,Python 就跳回到 try 并执行第一个匹配该异常的 except 子句,异常处理完毕,控制流就通过整个 try 语句(除非在处理异常时又引发新的异常)。
  • 如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的 try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
  • 如果在 try 子句执行时没有发生异常,Python 将执行 else 语句后的语句(如果有 else 的话),然后控制流通过整个 try 语句。

实例

下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,且并未发生异常:

#!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")except IOError:   print "Error: can't find file or read data"else:   print "Written content in the file successfully"   fh.close()

以上程序输出结果:

 Written content in the file successfully

实例

下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:

#!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")except IOError:   print "Error: can't find file or read data"else:   print "Written content in the file successfully"

以上程序输出结果:

Error: can't find file or read data

使用 except 而不带任何异常类型

你可以不带任何异常类型使用except,如下实例:

try:   You do your operations here;   ......................except:   If there is any exception, then execute this block.   ......................else:   If there is no exception then execute this block. 

以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。


使用 except 而带多种异常类型

你也可以使用相同的 except 语句来处理多个异常信息,如下所示:

try:   You do your operations here;   ......................except(Exception1[, Exception2[,...ExceptionN]]]):   If there is any exception from the given exception list,    then execute this block.   ......................else:   If there is no exception then execute this block.  

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

try:<语句>finally:<语句>    #退出try时总会执行raise

注意:你可以使用 except 语句或者 finally 语句,但是两者不能同时使用。else 语句也不能与 finally 语句同时使用

实例

#!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")finally:   print "Error: can't find file or read data"

如果打开的文件没有可写权限,输出如下所示:

Error: can't find file or read data

同样的例子也可以写成如下方式:

#!/usr/bin/pythontry:   fh = open("testfile", "w")   try:      fh.write("This is my test file for exception handling!!")   finally:      print "Going to close the file"      fh.close()except IOError:   print "Error: can't find file or read data"

当在 try 块中抛出一个异常,立即执行 finally 块代码。

finally 块中的所有语句执行后,异常被再次提出,并执行 except 块代码。

参数的内容不同于异常。


异常的参数

一个异常可以带上参数,可作为输出的异常信息参数。

你可以通过 except 语句来捕获异常的参数,如下所示:

try:   You do your operations here;   ......................except ExceptionType, Argument:   You can print value of Argument here...

变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。

元组通常包含错误字符串,错误数字,错误位置。

实例

以下为单个异常的实例:

#!/usr/bin/python# 定义函数def temp_convert(var):   try:      return int(var)   except ValueError, Argument:      print "The argument does not contain numbers
", Argument# 调用函数temp_convert("xyz");

以上程序执行结果如下:

The argument does not contain numbersinvalid literal for int() with base 10: 'xyz'

触发异常

我们可以使用 raise 语句自己触发异常

raise 语法格式如下:

raise [Exception [, args [, traceback]]]

语句中 Exception 是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。

最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

实例

一个异常可以是一个字符串,类或对象。 Python 的内核提供的异常,大多数都是实例化的类,这是一个类的实例的参数。

定义一个异常非常简单,如下所示:

def functionName( level ):    if level < 1:        raise Exception("Invalid level!", level)        # 触发异常后,后面的代码就不会再执行

注意:为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串。

例如我们捕获以上异常,"except"语句如下所示:

try:   Business Logic here...except "Invalid level!":   Exception handling here...else:   Rest of the code here...

用户自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自 Exception 类,通过直接或间接的方式。

以下为与 RuntimeError 相关的实例,实例中创建了一个类,基类为 RuntimeError,用于在异常触发时输出更多的信息。

在 try 语句块中,用户自定义的异常后执行 except 块语句,变量 e 是用于创建 Networkerror 类的实例。

class Networkerror(RuntimeError):   def __init__(self, arg):      self.args = arg

在你定义以上类后,你可以触发该异常,如下所示:

try:   raise Networkerror("Bad hostname")except Networkerror,e:   print e.args

异常处理代码执行说明:

#!/usr/bin/python# -*- coding: UTF-8 -*-#This is note foe exceptiontry:  code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息#except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理  code  #这里执行异常处理的相关代码,打印输出等else:  #如果没有异常则执行else  code  #try部分被正常执行后执行的代码finally:  code  #退出try语句块总会执行的程序#函数中做异常检测def try_exception(num):  try:    return int(num)  except ValueError,arg:    print arg,"is not a number"  else:    print "this is a number inputs"try_exception('xxx')#输出异常值Invalide literal for int() with base 10: 'xxx' is not a number


Python 面向对象

Python 从设计之初就已经是一门面向对象的语言,正因为如此,在 Python 中创建一个类和对象是很容易的。本章节我们将详细介绍 Python 的面向对象编程。

如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习 Python 的面向对象编程。

接下来我们先来简单的了解下面向对象的一些基本特征。


面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载。
  • 实例变量:定义在方法中的变量,只作用于当前实例的类。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例:Dog 是一个 Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

创建类

使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾,如下实例:

class ClassName:   '类的帮助信息'   #类文档字符串   class_suite  #类体

类的帮助信息可以通过 ClassName.__doc__查看。

class_suite 由类成员,方法,数据属性组成。

实例

以下是一个简单的 Python 类实例:

#coding=utf-8class Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salary
  • empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
  • 第一种方法 __init__() 方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
  • self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self 代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

class Test:    def prt(self):        print(self)        print(self.__class__)t = Test()t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x10d066878>__main__.Test

从执行结果可以很明显的看出,self代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 Python 关键字,我们把他换成 51coolma 也是可以正常执行的:

实例:

class Test:    def prt(51coolma):        print(51coolma)        print(51coolma.__class__)t = Test()t.prt()

以上实例执行结果为:

<__main__.Test instance at 0x10d066878>__main__.Test

创建实例对象

要创建一个类的实例,你可以使用类的名称,并通过__init__方法接受参数。

"创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)

访问属性

您可以使用点 (.) 来访问对象的属性。使用如下类的名称访问类变量:

emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

完整实例:

#coding=utf-8#!/usr/bin/pythonclass Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salary"创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

执行以上代码输出结果如下:

Name :  Zara ,Salary:  2000Name :  Manni ,Salary:  5000Total Employee 2

你可以添加,删除,修改类的属性,如下所示:

emp1.age = 7  # 添加一个 'age' 属性emp1.age = 8  # 修改 'age' 属性del emp1.age  # 删除 'age' 属性

你也可以使用以下函数的方式来访问属性:

  • getattr(obj, name[, default]) : 访问对象的属性。
  • hasattr(obj,name) : 检查是否存在一个属性。
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
  • delattr(obj, name) : 删除属性。
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。getattr(emp1, 'age')    # 返回 'age' 属性的值setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8delattr(empl, 'age')    # 删除属性 'age'

Python 内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块 mymod 中,那么 className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

Python 内置类属性调用实例如下:

#coding=utf-8#!/usr/bin/pythonclass Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salaryprint "Employee.__doc__:", Employee.__doc__print "Employee.__name__:", Employee.__name__print "Employee.__module__:", Employee.__module__print "Employee.__bases__:", Employee.__bases__print "Employee.__dict__:", Employee.__dict__

执行以上代码输出结果如下:

Employee.__doc__: 所有员工的基类Employee.__name__: EmployeeEmployee.__module__: __main__Employee.__bases__: ()Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': 'xe6x89x80xe6x9cx89xe5x91x98xe5xb7xa5xe7x9ax84xe5x9fxbaxe7xb1xbb', '__init__': <function __init__ at 0x10a939578>}

Python 对象销毁(垃圾回收)

同 Java 语言一样,Python 使用了引用计数这一简单技术来追踪内存中的对象。

在 Python 内部记录着所有使用中的对象各有多少引用。

一个内部跟踪变量,称为一个引用计数器。

当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为 0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

a = 40      # 创建对象  <40>b = a       # 增加引用, <40> 的计数c = [b]     # 增加引用.  <40> 的计数del a       # 减少引用 <40> 的计数b = 100     # 减少引用 <40> 的计数c[0] = -1   # 减少引用 <40> 的计数

垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

实例

析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:

#coding=utf-8#!/usr/bin/pythonclass Point:   def __init( self, x=0, y=0):      self.x = x      self.y = y   def __del__(self):      class_name = self.__class__.__name__      print class_name, "destroyed"pt1 = Point()pt2 = pt1pt3 = pt1print id(pt1), id(pt2), id(pt3) # 打印对象的iddel pt1del pt2del pt3

以上实例运行结果如下:

3083401324 3083401324 3083401324Point destroyed

注意:通常你需要在单独的文件中定义一个类,

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

在 Python 中继承中的一些特点:

  • 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
  • 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
  • 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

语法:

派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:

class SubClassName (ParentClass1[, ParentClass2, ...]):   'Optional class documentation string'   class_suite

实例:

#coding=utf-8#!/usr/bin/pythonclass Parent:        # 定义父类   parentAttr = 100   def __init__(self):      print "调用父类构造函数"   def parentMethod(self):      print '调用父类方法'   def setAttr(self, attr):      Parent.parentAttr = attr   def getAttr(self):      print "父类属性 :", Parent.parentAttrclass Child(Parent): # 定义子类   def __init__(self):      print "调用子类构造方法"   def childMethod(self):      print '调用子类方法 child method'c = Child()          # 实例化子类c.childMethod()      # 调用子类的方法c.parentMethod()     # 调用父类方法c.setAttr(200)       # 再次调用父类的方法c.getAttr()          # 再次调用父类的方法

以上代码执行结果如下:

调用子类构造方法调用子类方法 child method调用父类方法父类属性 : 200

你可以继承多个类

class A:        # 定义类 A.....class B:         # 定义类 B.....class C(A, B):   # 继承类 A 和 B.....

你可以使用 issubclass() 或者 isinstance() 方法来检测。

  • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
  • isinstance(obj, class) 布尔函数如果obj是Class类的实例对象或者是一个 class 子类的实例对象则返回 true。

方法重写

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:

实例:

#coding=utf-8#!/usr/bin/pythonclass Parent:        # 定义父类   def myMethod(self):      print '调用父类方法'class Child(Parent): # 定义子类   def myMethod(self):      print '调用子类方法'c = Child()          # 子类实例c.myMethod()         # 子类调用重写方法

执行以上代码输出结果如下:

调用子类方法

基础重载方法

下表列出了一些通用的功能,你可以在自己的类重写:

序号方法, 描述 & 简单的调用
1__init__ ( self [,args...] )
构造函数
简单的调用方法: obj = className(args)
2__del__( self )
析构方法, 删除一个对象
简单的调用方法 : dell obj
3__repr__( self )
转化为供解释器读取的形式
简单的调用方法 : repr(obj)
4__str__( self )
用于将值转化为适于人阅读的形式
简单的调用方法 : str(obj)
5__cmp__ ( self, x )
对象比较
简单的调用方法 : cmp(obj, x)

运算符重载

Python 同样支持运算符重载,实例如下:

#!/usr/bin/pythonclass Vector:   def __init__(self, a, b):      self.a = a      self.b = b   def __str__(self):      return 'Vector (%d, %d)' % (self.a, self.b)      def __add__(self,other):      return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2

以上代码执行结果如下所示:

Vector(7,8)

类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

类的方法

在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

实例

#coding=utf-8#!/usr/bin/pythonclass JustCounter:	__secretCount = 0  # 私有变量	publicCount = 0    # 公开变量	def count(self):		self.__secretCount += 1		self.publicCount += 1		print self.__secretCountcounter = JustCounter()counter.count()counter.count()print counter.publicCountprint counter.__secretCount  # 报错,实例不能访问私有变量

Python 通过改变名称来包含类名:

122Traceback (most recent call last):  File "test.py", line 17, in <module>    print counter.__secretCount  # 报错,实例不能访问私有变量AttributeError: JustCounter instance has no attribute '__secretCount'

Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码:

.........................print counter._JustCounter__secretCount

执行以上代码,执行结果如下:

1222

单下划线、双下划线、头尾双下划线说明:

  • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
  • __foo: 双下划线的表示的是私有类型 (private) 的变量, 只能是允许这个类本身进行访问了。

Python 正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自 1.5 版本起增加了 re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

本章节主要介绍 Python 中常用的正则表达式处理函数。


re.match 函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。

函数语法

re.match(pattern, string, flags=0)

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例:

#!/usr/bin/pythonimport reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:   print "matchObj.group() : ", matchObj.group()   print "matchObj.group(1) : ", matchObj.group(1)   print "matchObj.group(2) : ", matchObj.group(2)else:   print "No match!!"

以上实例执行结果如下:

matchObj.group() :  Cats are smarter than dogsmatchObj.group(1) :  CatsmatchObj.group(2) :  smarter

re.search方法

re.search 会在字符串内查找模式匹配,直到找到第一个匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功 re.search 方法返回一个匹配的对象,否则返回 None。

我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例:

#!/usr/bin/pythonimport reline = "Cats are smarter than dogs";searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:   print "searchObj.group() : ", searchObj.group()   print "searchObj.group(1) : ", searchObj.group(1)   print "searchObj.group(2) : ", searchObj.group(2)else:   print "Nothing found!!"

以上实例执行结果如下:

searchObj.group() :  Cats are smarter than dogssearchObj.group(1) :  CatssearchObj.group(2) :  smarter

re.match 与 re.search 的区别

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None;而 re.search 匹配整个字符串,直到找到一个匹配。

实例:

#!/usr/bin/pythonimport reline = "Cats are smarter than dogs";matchObj = re.match( r'dogs', line, re.M|re.I)if matchObj:   print "match --> matchObj.group() : ", matchObj.group()else:   print "No match!!"matchObj = re.search( r'dogs', line, re.M|re.I)if matchObj:   print "search --> matchObj.group() : ", matchObj.group()else:   print "No match!!"

以上实例运行结果如下:

No match!!search --> matchObj.group() :  dogs

检索和替换

Python 的 re 模块提供了 re.sub 用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, max=0)

返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。

可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

实例:

#!/usr/bin/python# -*- coding: UTF-8 -*- import re phone = "2004-959-559 # 这是一个国外电话号码" # 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone)print "电话号码是: ", num # 删除非数字(-)的字符串 num = re.sub(r'D', "", phone)print "电话号码是 : ", num

以上实例执行结果如下:

电话号码 :  2004-959-559电话号码 :  2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘以 2:

实例:

#!/usr/bin/python# -*- coding: UTF-8 -*- import re # 将匹配的数字乘以 2def double(matched):    value = int(matched.group('value'))    return str(value * 2) s = 'A23G4HFD567'print(re.sub('(?P<value>d+)', double, s))

执行输出结果为:

A46G8HFD1134

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

参数:

  • pattern : 一个字符串形式的正则表达式
  • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    1. re.I 忽略大小写
    2. re.L 表示特殊字符集 w, W, , B, s, S 依赖于当前环境
    3. re.M 多行模式
    4. re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
    5. re.U 表示特殊字符集 w, W, , B, d, D, s, S 依赖于 Unicode 字符属性数据库
    6. re.X 为了增加可读性,忽略空格和 # 后面的注释

实例

>>>import re>>> pattern = re.compile(r'd+')                    # 用于匹配至少一个数字>>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配>>> print mNone>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配>>> print mNone>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配>>> print m                                         # 返回一个 Match 对象<_sre.SRE_Match object at 0x10a42aac0>>>> m.group(0)   # 可省略 0'12'>>> m.start(0)   # 可省略 03>>> m.end(0)     # 可省略 05>>> m.span(0)    # 可省略 0(3, 5)

在上面,当匹配成功时返回一个 match 对象,其中:

  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
  • span([group]) 方法返回 (start(group), end(group))。

再看看一个例子:

>>>import re>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写>>> m = pattern.match('Hello World Wide Web')>>> print m                               # 匹配成功,返回一个 Match 对象<_sre.SRE_Match object at 0x10bea83e8>>>> m.group(0)                            # 返回匹配成功的整个子串'Hello World'>>> m.span(0)                             # 返回匹配成功的整个子串的索引(0, 11)>>> m.group(1)                            # 返回第一个分组匹配成功的子串'Hello'>>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引(0, 5)>>> m.group(2)                            # 返回第二个分组匹配成功的子串'World'>>> m.span(2)                             # 返回第二个分组匹配成功的子串(6, 11)>>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)('Hello', 'World')>>> m.group(3)                            # 不存在第三个分组Traceback (most recent call last):  File "<stdin>", line 1, in <module>IndexError: no such group

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

  • string : 待匹配的字符串。
  • pos : 可选参数,指定字符串的起始位置,默认为 0。
  • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

查找字符串中的所有数字:

# -*- coding:UTF8 -*- import re pattern = re.compile(r'd+')   # 查找数字result1 = pattern.findall('school 123 google 456')result2 = pattern.findall('sch88ool123google456', 0, 10) print(result1)print(result2)

输出结果:

['123', '456']['88', '12']

re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

参数:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

实例:

# -*- coding: UTF-8 -*- import re it = re.finditer(r"d+","12a32bc43jf3") for match in it:     print (match.group() )

输出结果:

12 32 43 3

re.split

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

参数:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

实例:

>>>import re>>> re.split('W+', '51coolma, 51coolma, 51coolma.')['51coolma', '51coolma', '51coolma', '']>>> re.split('(W+)', ' 51coolma, 51coolma, 51coolma.') ['', ' ', '51coolma', ', ', '51coolma', ', ', '51coolma', '.', '']>>> re.split('W+', ' 51coolma, 51coolma, 51coolma.', 1) ['', '51coolma, 51coolma, 51coolma.'] >>> re.split('a*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割['hello world']



正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别( locale-aware )匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据 Unicode 字符集解析字符。这个标志影响 w, W, , B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m' 或 'k'
[^...]不在[]中的字符:[^abc] 匹配除了 a,b,c 之外的字符。
re*匹配 0 个或多个的表达式。
re+匹配 1 个或多个的表达式。
re?匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式
re{ n}
re{ n,}精确匹配 n 个前面表达式。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b匹配 a 或 b
(re)G 匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (...), 但是不表示一个组
(?imx: re)在括号中使用 i, m, 或 x 可选标志
(?-imx: re)在括号中不使用 i, m, 或 x 可选标志
(?#...)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)匹配的独立模式,省去回溯。
w匹配字母数字
W匹配非字母数字
s匹配任意空白字符,等价于 [ f].
S匹配任意非空字符
d匹配任意数字,等价于 [0-9].
D匹配任意非数字
A匹配字符串开始
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
z匹配字符串结束
G匹配最后匹配完成的位置。
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
, , 等.匹配一个换行符。匹配一个制表符。等
1...9匹配第n个分组的子表达式。
10匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式实例

字符匹配

实例描述
python匹配 "python".

字符类

实例描述
[Pp]ython匹配 "Python" 或 "python"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于 [0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了 aeiou 字母以外的所有字符
[^0-9]匹配除了数字外的字符

特殊字符类

实例描述
.匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
d匹配一个数字字符。等价于 [0-9]。
D匹配一个非数字字符。等价于 [^0-9]。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
S匹配任何非空白字符。等价于 [^ f v]。
w匹配包括下划线的任何单词字符。等价于 '[A-Za-z0-9_]'。
W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。


python操作mysql数据库

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

你可以访问 Python数据库接口及API 查看详细的支持数据库列表。

不同的数据库你需要下载不同的 DB API 模块,例如你需要访问 Oracle 数据库和 Mysql 数据,你需要下载 Oracle 和 MySQL 数据库模块。

DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。

Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。

Python DB-API 使用流程:

  • 引入 API 模块。
  • 获取与数据库的连接。
  • 执行 SQL 语句和存储过程。
  • 关闭数据库连接。

什么是 MySQLdb?

MySQLdb 是用于 Python 链接 Mysql 数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。


如何安装 MySQLdb?

为了用 DB-API 编写 MySQL 脚本,必须确保已经安装了 MySQL。复制以下代码,并执行:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb

如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:

Traceback (most recent call last):  File "test.py", line 3, in <module>    import MySQLdbImportError: No module named MySQLdb

安装 MySQLdb,请访问 http://sourceforge.net/projects/mysql-python ,(Linux 平台可以访问:https://pypi.python.org/pypi/MySQL-python) 从这里可选择适合您的平台的安装包,分为预编译的二进制文件和源代码安装包。

如果您选择二进制文件发行版本的话,安装过程基本安装提示即可完成。如果从源代码进行安装的话,则需要切换到 MySQLdb 发行版本的顶级目录,并键入下列命令:

$ gunzip MySQL-python-1.2.2.tar.gz$ tar -xvf MySQL-python-1.2.2.tar$ cd MySQL-python-1.2.2$ python setup.py build$ python setup.py install

注意:请确保您有 root 权限来安装上述模块。


数据库连接

连接数据库前,请先确认以下事项:

  • 您已经创建了数据库 TESTDB.
  • 在 TESTDB 数据库中您已经创建了表 EMPLOYEE
  • EMPLOYEE 表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 连接数据库 TESTDB 使用的用户名为 "testuser" ,密码为 "test123",你可以可以自己设定或者直接使用 root 用户名及其密码,Mysql 数据库用户授权请使用 Grant 命令。
  • 在你的机子上已经安装了 Python MySQLdb 模块。
  • 如果您对 sql 语句不熟悉,可以访问我们的 SQL基础教程

实例:

以下实例链接 Mysql 的 TESTDB 数据库:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 使用execute方法执行SQL语句cursor.execute("SELECT VERSION()")# 使用 fetchone() 方法获取一条数据库。data = cursor.fetchone()print "Database version : %s " % data# 关闭数据库连接db.close()

执行以上脚本输出结果如下:

Database version : 5.0.45

创建数据库表

如果数据库连接存在我们可以使用 execute() 方法来为数据库创建表,如下所示创建表 EMPLOYEE:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 如果数据表已经存在使用 execute() 方法删除表。cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")# 创建数据表SQL语句sql = """CREATE TABLE EMPLOYEE (         FIRST_NAME  CHAR(20) NOT NULL,         LAST_NAME  CHAR(20),         AGE INT,           SEX CHAR(1),         INCOME FLOAT )"""cursor.execute(sql)# 关闭数据库连接db.close()

数据库插入操作

以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句sql = """INSERT INTO EMPLOYEE(FIRST_NAME,         LAST_NAME, AGE, SEX, INCOME)         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""try:   # 执行sql语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # Rollback in case there is any error   db.rollback()# 关闭数据库连接db.close()

以上例子也可以写成如下形式:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句sql = "INSERT INTO EMPLOYEE(FIRST_NAME,        LAST_NAME, AGE, SEX, INCOME)        VALUES ('%s', '%s', '%d', '%c', '%d' )" %        ('Mac', 'Mohan', 20, 'M', 2000)try:   # 执行sql语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭数据库连接db.close()

实例:

以下代码使用变量向 SQL 语句中传递参数:

..................................user_id = "test123"password = "password"con.execute('insert into Login values("%s", "%s")' %              (user_id, password))..................................

数据库查询操作

Python 查询 Mysql 使用 fetchone() 方法获取单条数据, 使用 fetchall() 方法获取多条数据。

  • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
  • fetchall(): 接收全部的返回结果行.
  • rowcount:  这是一个只读属性,并返回执行 execute() 方法后影响的行数。

实例:

查询 EMPLOYEE 表中 salary(工资)字段大于 1000 的所有数据:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 查询语句sql = "SELECT * FROM EMPLOYEE        WHERE INCOME > '%d'" % (1000)try:   # 执行SQL语句   cursor.execute(sql)   # 获取所有记录列表   results = cursor.fetchall()   for row in results:      fname = row[0]      lname = row[1]      age = row[2]      sex = row[3]      income = row[4]      # 打印结果      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" %              (fname, lname, age, sex, income )except:   print "Error: unable to fecth data"# 关闭数据库连接db.close()

以上脚本执行结果如下:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

数据库更新操作

更新操作用于更新数据表的的数据,以下实例将 TESTDB 表中的 SEX 字段全部修改为 'M',AGE 字段递增 1:

# encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 更新语句sql = "UPDATE EMPLOYEE SET AGE = AGE + 1        WHERE SEX = '%c'" % ('M')try:   # 执行SQL语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭数据库连接db.close()

删除操作

删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

#!/usr/bin/python# -*- coding: UTF-8 -*-import MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 删除语句sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)try:   # 执行SQL语句   cursor.execute(sql)   # 提交修改   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭连接db.close()

执行事务

事务机制可以确保数据一致性。

事务应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

实例:

# SQL删除记录语句sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)try:   # 执行SQL语句   cursor.execute(sql)   # 向数据库提交   db.commit()except:   # 发生错误时回滚   db.rollback()

对于支持事务的数据库, 在 Python 数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。

commit() 方法游标的所有更新操作,rollback() 方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。


错误处理

DB API 中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

异常描述
Warning当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是 Error 的子类。
DatabaseError和数据库有关的错误发生时触发。 必须是 Error 的子类。
DataError当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是 DatabaseError 的子类。
OperationalError指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是 DatabaseError 的子类。
IntegrityError完整性相关的错误,例如外键检查失败等。必须是 DatabaseError 子类。
InternalError数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是 DatabaseError 子类。
ProgrammingError程序错误,例如数据表(table)没找到或已存在、SQL 语句语法错误、 参数数量错误等等。必须是 DatabaseError 的子类。
NotSupportedError不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用 .rollback() 函数,然而数据库并不支持事务或者事务已关闭。 必须是  DatabaseError 的子类。

Python 网络编程

Python 提供了两个级别访问的网络服务。:

  • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。
  • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

什么是 Socket?

Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。


socket()函数

Python 中,我们用 socket()函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])

参数

  • family: 套接字家族可以使 AF_UNIX 或者 AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为 0.

Socket 对象(内建)方法

函数描述
服务器端套接字
s.bind()绑定地址(host,port)到套接字, 在 AF_INET 下, 以元组(host,port)的形式表示地址。
s.listen()开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以了。
s.accept()被动接受 TCP 客户端连接,(阻塞式)等待连接的到来
客户端套接字
s.connect()主动初始化 TCP 服务器连接,。一般 address 的格式为元组(hostname, port),如果连接出错,返回 socket.error 错误。
s.connect_ex()connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv()接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。
s.send()发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。
s.sendall()完整发送 TCP 数据,完整发送 TCP 数据。将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回 None,失败则抛出异常。
s.recvform()接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。
s.sendto()发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
s.close()关闭套接字
s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()返回套接字自己的地址。通常是一个元组 (ipaddr,port)
s.setsockopt(level,optname,value)设置给定套接字选项的值。
s.getsockopt(level,optname[.buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期,timeout 是一个浮点数,单位是秒。值为 None 表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 connect())
s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回 None。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)如果 flag 为 0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常。
s.makefile()创建一个与该套接字相关连的文件

简单实例

服务端

我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port (端口)

接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

完整代码如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:server.pyimport socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接while True:    c, addr = s.accept()     # 建立客户端连接。    print '连接地址:', addr    c.send('欢迎访问W3Cschool教程!')    c.close()                # 关闭连接

客户端

接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 12345。

socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端后期数据,记住,操作完成后需要关闭连接。

完整代码如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:client.pyimport socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口好s.connect((host, port))print s.recv(1024)s.close()  

现在我们打开连个终端,第一个终端执行 server.py 文件:

$ python server.py

第二个终端执行 client.py 文件:

$ python client.py 欢迎访问W3Cschool教程!

这是我们再打开第一个终端,就会看到有以下信息输出:

连接地址: ('192.168.0.118', 62461)

Python Internet 模块

以下列出了 Python 网络编程的一些重要模块:

协议功能用处端口号Python 模块
HTTP网页访问80httplib, urllib, xmlrpclib
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib

更多内容可以参阅官网的 Python Socket Library and Modules

Python 使用 SMTP 发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python 的 smtplib 提供了一种很方便的途径发送电子邮件。它对 smtp 协议进行了简单的封装。

Python 创建 SMTP 对象语法如下:

import smtplibsmtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: 51coolma.cn,这个是可选参数。
  • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为 25。
  • local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

实例

以下是一个使用 Python 发送邮件简单的实例:

#!/usr/bin/pythonimport smtplibsender = 'from@fromdomain.com'receivers = ['to@todomain.com']message = """From: From Person <from@fromdomain.com>To: To Person <to@todomain.com>Subject: SMTP e-mail testThis is a test e-mail message."""try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, receivers, message)            print "Successfully sent email"except SMTPException:   print "Error: unable to send email"

使用 Python 发送 HTML 格式的邮件

Python 发送 HTML 格式的邮件与发送纯文本消息的邮件不同之处就是将 MIMEText 中 _subtype 设置为 html。具体代码如下:

import smtplib  from email.mime.text import MIMEText  mailto_list=["YYY@YYY.com"] mail_host="smtp.XXX.com"  #设置服务器mail_user="XXX"    #用户名mail_pass="XXXX"   #口令 mail_postfix="XXX.com"  #发件箱的后缀  def send_mail(to_list,sub,content):  #to_list:收件人;sub:主题;content:邮件内容    me="hello"+"<"+mail_user+"@"+mail_postfix+">"   #这里的hello可以任意设置,收到信后,将按照设置显示    msg = MIMEText(content,_subtype='html',_charset='gb2312')    #创建一个实例,这里设置为html格式邮件    msg['Subject'] = sub    #设置主题    msg['From'] = me      msg['To'] = ";".join(to_list)      try:          s = smtplib.SMTP()          s.connect(mail_host)  #连接smtp服务器        s.login(mail_user,mail_pass)  #登陆服务器        s.sendmail(me, to_list, msg.as_string())  #发送邮件        s.close()          return True      except Exception, e:          print str(e)          return False  if __name__ == '__main__':      if send_mail(mailto_list,"hello","<a href='http://www.51coolma.cn/'>W3Cschool</a>"):          print "发送成功"      else:          print "发送失败"  

或者你也可以在消息体中指定 Content-type 为 text/html,如下实例:

#!/usr/bin/pythonimport smtplibmessage = """From: From Person <from@fromdomain.com>To: To Person <to@todomain.com>MIME-Version: 1.0Content-type: text/htmlSubject: SMTP HTML e-mail testThis is an e-mail message to be sent in HTML format<b>This is HTML message.</b><h1>This is headline.</h1>"""try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, receivers, message)            print "Successfully sent email"except SMTPException:   print "Error: unable to send email"

Python 发送带附件的邮件

发送带附件的邮件,首先要创建 MIMEMultipart() 实例,然后构造附件,如果有多个附件,可依次构造,最后利用 smtplib.smtp 发送。

from email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimport smtplib#创建一个带附件的实例msg = MIMEMultipart()#构造附件1att1 = MIMEText(open('d:123.rar', 'rb').read(), 'base64', 'gb2312')att1["Content-Type"] = 'application/octet-stream'att1["Content-Disposition"] = 'attachment; filename="123.doc"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(att1)#构造附件2att2 = MIMEText(open('d:123.txt', 'rb').read(), 'base64', 'gb2312')att2["Content-Type"] = 'application/octet-stream'att2["Content-Disposition"] = 'attachment; filename="123.txt"'msg.attach(att2)#加邮件头msg['to'] = 'YYY@YYY.com'msg['from'] = 'XXX@XXX.com'msg['subject'] = 'hello world'#发送邮件try:    server = smtplib.SMTP()    server.connect('smtp.XXX.com')    server.login('XXX','XXXXX')#XXX为用户名,XXXXX为密码    server.sendmail(msg['from'], msg['to'],msg.as_string())    server.quit()    print '发送成功'except Exception, e:      print str(e) 

以下实例指定了 Content-type header 为 multipart/mixed,并发送 /tmp/test.txt 文本文件:

#!/usr/bin/pythonimport smtplibimport base64filename = "/tmp/test.txt"# 读取文件内容并使用 base64 编码fo = open(filename, "rb")filecontent = fo.read()encodedcontent = base64.b64encode(filecontent)  # base64sender = 'webmaster@tutorialpoint.com'reciever = 'amrood.admin@gmail.com'marker = "AUNIQUEMARKER"body ="""This is a test email to send an attachement."""# 定义头部信息part1 = """From: From Person <me@fromdomain.net>To: To Person <amrood.admin@gmail.com>Subject: Sending AttachementMIME-Version: 1.0Content-Type: multipart/mixed; boundary=%s--%s""" % (marker, marker)# 定义消息动作part2 = """Content-Type: text/plainContent-Transfer-Encoding:8bit%s--%s""" % (body,marker)# 定义附近部分part3 = """Content-Type: multipart/mixed; name="%s"Content-Transfer-Encoding:base64Content-Disposition: attachment; filename=%s%s--%s--""" %(filename, filename, encodedcontent, marker)message = part1 + part2 + part3try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, reciever, message)   print "Successfully sent email"except Exception:   print "Error: unable to send email"

Python 多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组 CPU 寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。
  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

开始学习 Python 线程

Python 中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用 thread 模块中的 start_new_thread() 函数来产生新线程。语法如下:

thread.start_new_thread ( function, args[, kwargs] )

参数说明:

  • function - 线程函数。
  • args - 传递给线程函数的参数,他必须是个 tuple 类型。
  • kwargs - 可选参数。

实例:

#!/usr/bin/python# -*- coding: UTF-8 -*-import threadimport time# 为线程定义一个函数def print_time( threadName, delay):   count = 0   while count < 5:      time.sleep(delay)      count += 1      print "%s: %s" % ( threadName, time.ctime(time.time()) )# 创建两个线程try:   thread.start_new_thread( print_time, ("Thread-1", 2, ) )   thread.start_new_thread( print_time, ("Thread-2", 4, ) )except:   print "Error: unable to start thread"while 1:   pass

执行以上程序输出结果如下:

Thread-1: Thu Jan 22 15:42:17 2009Thread-1: Thu Jan 22 15:42:19 2009Thread-2: Thu Jan 22 15:42:19 2009Thread-1: Thu Jan 22 15:42:21 2009Thread-2: Thu Jan 22 15:42:23 2009Thread-1: Thu Jan 22 15:42:23 2009Thread-1: Thu Jan 22 15:42:25 2009Thread-2: Thu Jan 22 15:42:27 2009Thread-2: Thu Jan 22 15:42:31 2009Thread-2: Thu Jan 22 15:42:35 2009

线程的结束一般依靠线程函数的自然结束;也可以在线程函数中调用 thread.exit(),他抛出 SystemExit exception,达到退出线程的目的。


线程模块

Python 通过两个标准库 thread 和 threading 提供对线程的支持。thread 提供了低级别的、原始的线程以及一个简单的锁。

thread 模块提供的其他方法:

  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的 list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与 len(threading.enumerate()) 有相同的结果。

除了使用方法外,线程模块同样提供了 Thread 类来处理线程,Thread 类提供了以下方法:

  • run():  用以表示线程活动的方法。
  • start(): 启动线程活动。

  • join([time]):  等待至线程中止。这阻塞调用线程直至线程的 join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
  • isAlive():  返回线程是否活动的。
  • getName():  返回线程名。
  • setName():  设置线程名。

使用 Threading 模块创建线程

使用 Threading 模块创建线程,直接从 threading.Thread 继承,然后重写 __init__ 方法和 run() 方法:

#coding=utf-8#!/usr/bin/pythonimport threadingimport timeexitFlag = 0class myThread (threading.Thread):   #继承父类threading.Thread    def __init__(self, threadID, name, counter):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.counter = counter    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数         print "Starting " + self.name        print_time(self.name, self.counter, 5)        print "Exiting " + self.namedef print_time(threadName, delay, counter):    while counter:        if exitFlag:            thread.exit()        time.sleep(delay)        print "%s: %s" % (threadName, time.ctime(time.time()))        counter -= 1# 创建新线程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 开启线程thread1.start()thread2.start()print "Exiting Main Thread"

以上程序执行结果如下;

Starting Thread-1Starting Thread-2Exiting Main ThreadThread-1: Thu Mar 21 09:10:03 2013Thread-1: Thu Mar 21 09:10:04 2013Thread-2: Thu Mar 21 09:10:04 2013Thread-1: Thu Mar 21 09:10:05 2013Thread-1: Thu Mar 21 09:10:06 2013Thread-2: Thu Mar 21 09:10:06 2013Thread-1: Thu Mar 21 09:10:07 2013Exiting Thread-1Thread-2: Thu Mar 21 09:10:08 2013Thread-2: Thu Mar 21 09:10:10 2013Thread-2: Thu Mar 21 09:10:12 2013Exiting Thread-2

线程同步

如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:

多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。

考虑这样一种情况:一个列表里所有元素都是 0,线程 "set" 从后向前把所有元素改成 1,而线程 "print" 负责从前往后读取列表并打印。

那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半 0 一半 1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。

锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如 "print" 获得锁定了,那么就让线程 "set" 暂停,也就是同步阻塞;等到线程 "print" 访问完毕,释放锁以后,再让线程 "set" 继续。

经过这样的处理,打印列表时要么全部输出 0,要么全部输出 1,不会再出现一半 0 一半 1 的尴尬场面。

实例:

#coding=utf-8#!/usr/bin/pythonimport threadingimport timeclass myThread (threading.Thread):    def __init__(self, threadID, name, counter):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.counter = counter    def run(self):        print "Starting " + self.name       # 获得锁,成功获得锁定后返回True       # 可选的timeout参数不填时将一直阻塞直到获得锁定       # 否则超时后将返回False        threadLock.acquire()        print_time(self.name, self.counter, 3)        # 释放锁        threadLock.release()def print_time(threadName, delay, counter):    while counter:        time.sleep(delay)        print "%s: %s" % (threadName, time.ctime(time.time()))        counter -= 1threadLock = threading.Lock()threads = []# 创建新线程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 开启新线程thread1.start()thread2.start()# 添加线程到线程列表threads.append(thread1)threads.append(thread2)# 等待所有线程完成for t in threads:    t.join()print "Exiting Main Thread"

线程优先级队列( Queue)

Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括 FIFO(先入先出)队列 Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列 PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

Queue 模块中的常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回 True, 反之 False
  • Queue.full() 如果队列满了,返回 True, 反之 False
  • Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]]) 获取队列,timeout  等待时间
  • Queue.get_nowait() 相当 Queue.get(False)
  • Queue.put(item) 写入队列,timeout 等待时间
  • Queue.put_nowait(item) 相当 Queue.put(item, False)
  • Queue.task_done() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作

实例:

#coding=utf-8#!/usr/bin/pythonimport Queueimport threadingimport timeexitFlag = 0class myThread (threading.Thread):    def __init__(self, threadID, name, q):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.q = q    def run(self):        print "Starting " + self.name        process_data(self.name, self.q)        print "Exiting " + self.namedef process_data(threadName, q):    while not exitFlag:        queueLock.acquire()        if not workQueue.empty():            data = q.get()            queueLock.release()            print "%s processing %s" % (threadName, data)        else:            queueLock.release()        time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"]nameList = ["One", "Two", "Three", "Four", "Five"]queueLock = threading.Lock()workQueue = Queue.Queue(10)threads = []threadID = 1# 创建新线程for tName in threadList:    thread = myThread(threadID, tName, workQueue)    thread.start()    threads.append(thread)    threadID += 1# 填充队列queueLock.acquire()for word in nameList:    workQueue.put(word)queueLock.release()# 等待队列清空while not workQueue.empty():    pass# 通知线程是时候退出exitFlag = 1# 等待所有线程完成for t in threads:    t.join()print "Exiting Main Thread"

以上程序执行结果:

Starting Thread-1Starting Thread-2Starting Thread-3Thread-1 processing OneThread-2 processing TwoThread-3 processing ThreeThread-1 processing FourThread-2 processing FiveExiting Thread-3Exiting Thread-1Exiting Thread-2Exiting Main Thread

Python XML 解析


什么是 XML?

XML 指可扩展标记语言(eXtensible Markup Language)。 你可以通过本站学习XML教程

XML 被设计用来传输和存储数据。

XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。


python 对 XML 的解析

常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

1.SAX (simple API for XML )

pyhton 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

2.DOM(Document Object Model)

将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。

3.ElementTree(元素树)

ElementTree 就像一个轻量级的 DOM,具有方便友好的 API。代码可用性好,速度快,消耗内存少。

注:因 DOM 需要将 XML 数据映射到内存中的树,一是比较慢,二是比较耗内存,而 SAX 流式读取 XML 文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

本章节使用到的 XML 实例文件 movies.xml 内容如下:

<collection shelf="New Arrivals"><movie title="Enemy Behind">   <type>War, Thriller</type>   <format>DVD</format>   <year>2003</year>   <rating>PG</rating>   <stars>10</stars>   <description>Talk about a US-Japan war</description></movie><movie title="Transformers">   <type>Anime, Science Fiction</type>   <format>DVD</format>   <year>1989</year>   <rating>R</rating>   <stars>8</stars>   <description>A schientific fiction</description></movie>   <movie title="Trigun">   <type>Anime, Action</type>   <format>DVD</format>   <episodes>4</episodes>   <rating>PG</rating>   <stars>10</stars>   <description>Vash the Stampede!</description></movie><movie title="Ishtar">   <type>Comedy</type>   <format>VHS</format>   <rating>PG</rating>   <stars>2</stars>   <description>Viewable boredom</description></movie></collection>

python 使用 SAX 解析 xml

SAX 是一种基于事件驱动的 API。

利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。

解析器负责读取 XML 文档, 并向事件处理器发送事件, 如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应, 对传递的 XML 数据进行处理。

  • 1、对大型文件进行处理;
  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
  • 3、想建立自己的对象模型的时候。

在 python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。

ContentHandler 类方法介绍

characters(content) 方法

调用时机:

从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

标签可以是开始标签,也可以是结束标签。

startDocument() 方法

文档启动的时候调用。

endDocument() 方法

解析器到达文档结尾时调用。

startElement(name, attrs) 方法

遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。

endElement(name) 方法

遇到 XML 结束标签时调用。


make_parser 方法

以下方法创建一个新的解析器对象并返回。

xml.sax.make_parser( [parser_list] )

参数说明:

  • parser_list - 可选参数,解析器列表

parser方法

以下方法创建一个 SAX 解析器并解析 xml 文档:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

参数说明:

  • xmlfile - xml 文件名
  • contenthandler - 必须是一个 ContentHandler 的对象
  • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

parseString 方法

parseString 方法创建一个 XML 解析器并解析 xml 字符串:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

参数说明:

  • xmlstring - xml 字符串
  • contenthandler - 必须是一个 ContentHandler 的对象
  • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

Python 解析 XML 实例

#coding=utf-8#!/usr/bin/pythonimport xml.saxclass MovieHandler( xml.sax.ContentHandler ):   def __init__(self):      self.CurrentData = ""      self.type = ""      self.format = ""      self.year = ""      self.rating = ""      self.stars = ""      self.description = ""   # 元素开始事件处理   def startElement(self, tag, attributes):      self.CurrentData = tag      if tag == "movie":         print "*****Movie*****"         title = attributes["title"]         print "Title:", title   # 元素结束事件处理   def endElement(self, tag):      if self.CurrentData == "type":         print "Type:", self.type      elif self.CurrentData == "format":         print "Format:", self.format      elif self.CurrentData == "year":         print "Year:", self.year      elif self.CurrentData == "rating":         print "Rating:", self.rating      elif self.CurrentData == "stars":         print "Stars:", self.stars      elif self.CurrentData == "description":         print "Description:", self.description      self.CurrentData = ""   # 内容事件处理   def characters(self, content):      if self.CurrentData == "type":         self.type = content      elif self.CurrentData == "format":         self.format = content      elif self.CurrentData == "year":         self.year = content      elif self.CurrentData == "rating":         self.rating = content      elif self.CurrentData == "stars":         self.stars = content      elif self.CurrentData == "description":         self.description = content  if ( __name__ == "__main__"):      # 创建一个 XMLReader   parser = xml.sax.make_parser()   # turn off namepsaces   parser.setFeature(xml.sax.handler.feature_namespaces, 0)   # 重写 ContextHandler   Handler = MovieHandler()   parser.setContentHandler( Handler )      parser.parse("movies.xml")

以上代码执行结果如下:

*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom

完整的 SAX API 文档请查阅 Python SAX APIs


使用 xml.dom 解析 xml

文件对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用 DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入 xml 文件。

python 中用x ml.dom.minidom 来解析 xml 文件,实例如下:

#coding=utf-8#!/usr/bin/pythonfrom xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif collection.hasAttribute("shelf"):   print "Root element : %s" % collection.getAttribute("shelf")# 在集合中获取所有电影movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息for movie in movies:   print "*****Movie*****"   if movie.hasAttribute("title"):      print "Title: %s" % movie.getAttribute("title")   type = movie.getElementsByTagName('type')[0]   print "Type: %s" % type.childNodes[0].data   format = movie.getElementsByTagName('format')[0]   print "Format: %s" % format.childNodes[0].data   rating = movie.getElementsByTagName('rating')[0]   print "Rating: %s" % rating.childNodes[0].data   description = movie.getElementsByTagName('description')[0]   print "Description: %s" % description.childNodes[0].data

以上程序执行结果如下:

Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom

完整的 DOM API 文档请查阅Python DOM APIs

python GUI 编程 (Tkinter)

Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:

  • Tkinter: Tkinter 模块("Tk 接口")是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
  • wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。
  • Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT 或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。

Tkinter 编程

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

由于 Tkinter 是内置到 Python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。

注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写:

import tkinter

创建一个 GUI 程序

  • 1、导入 Tkinter 模块
  • 2、创建控件
  • 3、指定这个控件的 master, 即这个控件属于哪一个
  • 4、告诉 GM (geometry manager) 有一个控件产生了。

实例:

#!/usr/bin/pythonimport Tkintertop = Tkinter.Tk()# 进入消息循环top.mainloop()

以上代码执行结果如下图:

tkwindow

实例2:

#!/usr/bin/python# -*- coding: UTF-8 -*-from Tkinter import *           # 导入 Tkinter 库root = Tk()                     # 创建窗口对象的背景色                                # 创建两个列表li     = ['C','python','php','html','SQL','java']movie  = ['CSS','jQuery','Bootstrap']listb  = Listbox(root)          #  创建两个列表组件listb2 = Listbox(root)for item in li:                 # 第一个小部件插入数据    listb.insert(0,item)for item in movie:              # 第二个小部件插入数据    listb2.insert(0,item)listb.pack()                    # 将小部件放置到主窗口中listb2.pack()root.mainloop()                 # 进入消息循环

以上代码执行结果如下图:

tkinter编程



Tkinter 组件

Tkinter 的提供各种控件,如按钮,标签和文本框,一个 GUI 应用程序中使用。这些控件通常被称为控件或者部件。

目前有 15 种 Tkinter 的部件。我们提出这些部件以及一个简短的介绍,在下面的表:

控件描述
Button按钮控件;在程序中显示按钮。
Canvas画布控件;显示图形元素如线条或文本
Checkbutton多选框控件;用于在程序中提供多项选择框
Entry输入控件;用于显示简单的文本内容
Frame框架控件;在屏幕上显示一个矩形区域,多用来作为容器
Label标签控件;可以显示文本和位图
Listbox列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
Menubutton菜单按钮控件,由于显示菜单项。
Menu菜单控件;显示菜单栏,下拉菜单和弹出菜单
Message消息控件;用来显示多行文本,与label比较类似
Radiobutton单选按钮控件;显示一个单选的按钮状态
Scale范围控件;显示一个数值刻度,为输出限定范围的数字区间
Scrollbar滚动条控件,当内容超过可视化区域时使用,如列表框。.
Text文本控件;用于显示多行文本
Toplevel容器控件;用来提供一个单独的对话框,和Frame比较类似
Spinbox输入控件;与Entry类似,但是可以指定输入范围值
PanedWindowPanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。
LabelFramelabelframe 是一个简单的容器控件。常用与复杂的窗口布局。
tkMessageBox用于显示你应用程序的消息框。

标准属性

标准属性也就是所有控件的共同属性,如大小,字体和颜色等等。

属性 描述
Dimension 控件大小;
Color 控件颜色;
Font 控件字体;
Anchor 锚点;
Relief 控件样式;
Bitmap 位图;
Cursor 光标;

几何管理

Tkinter 控件有特定的几何状态管理方法,管理整个控件区域组织,一下是 Tkinter 公开的几何管理类:包、网格、位置

几何方法 描述
pack() 包装;
grid() 网格;
place() 位置;


Python 的 3​​.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。

为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下相容。

许多针对早期 Python 版本设计的程式都无法在 Python 3.0 上正常执行。

为了照顾现有程式,Python 2.6 作为一个过渡版本,基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3.0 的迁移,允许使用部分 Python 3.0 的语法与函数。

新的Python程式建议使用 Python 3.0 版本的语法。

除非执行环境无法安装 Python 3.0 或者程式本身使用了不支援 Python 3.0 的第三方库。目前不支援 Python 3.0 的第三方库有 Twisted, py2exe, PIL等。

大多数第三方库都正在努力地相容 Python 3.0 版本。即使无法立即使用 Python 3.0 ,也建议编写相容Python 3.0版本的程式,然后使用 Python 2.6, Python 2.7 来执行。

Python 3.0 的变化主要在以下几个方面:


print 函数

print​语句没有了,取而代之的是​print()​函数。 Python 2.6 与 Python 2.7 部分地支持这种形式的​print​语法。在 Python 2.6 与 Python 2.7 里面,以下三种形式是等价的:

print "fish"print ("fish") #注意print后面有个空格print("fish") #print()不能带有任何其它参数

然而,Python 2.6 实际已经支持新的​print()​语法:

from __future__ import print_functionprint("fish", "panda", sep=', ')

Unicode

Python 2 有 ​ASCII str()​ 类型,​unicode()​ 是单独的,不是 ​byte​ 类型。

现在, 在 Python 3,我们最终有了​ Unicode (utf-8)​ 字符串,以及一个字节类:​byte​ 和 ​bytearrays​。

由于 Python3.X 源码文件默认使用​utf-8​编码,这就使得以下代码是合法的:

>>> 编程狮 = 'W3Cschool' >>>print(编程狮) W3Cschool

Python 2.x

>>> str = "我爱北京天安门">>> str'xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8'>>> str = u"我爱北京天安门">>> stru'u6211u7231u5317u4eacu5929u5b89u95e8'

Python 3.x

>>> str = "编程狮">>> str'编程狮'

除法运算

Python 中的除法较其它语言显得非常高端,有套很复杂的规则。Python 中的除法有两个运算符,​/​和​//

首先来说/除法:

在 python 2.x 中/除法就跟我们熟悉的大多数语言,比如 Java 啊 C 啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。

在 python 3.x 中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

Python 2.x:

>>> 1 / 20>>> 1.0 / 2.00.5

Python 3.x:

>>> 1/20.5

而对于//除法,这种除法叫做​floor​除法,会对除法的结果自动进行一个​floor​操作,在 python 2.x 和 python 3.x 中是一致的。

python 2.x:

>>> -1 // 2-1

python 3.x:

>>> -1 // 2-1

注意的是并不是舍弃小数部分,而是执行 ​floor​ 操作,如果要截取整数部分,那么需要使用 ​math​ 模块的​ trunc​ 函数

python 3.x:

>>> import math>>> math.trunc(1 / 2)0>>> math.trunc(-1 / 2)0

异常

在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 ​as​ 作为关键词。

捕获异常的语法由 except exc​, ​var 改为 except exc as var

使用语法​except (exc1, exc2) as var​可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

  1. 在 2.x 时代,所有类型的对象都是可以被直接抛出的,在 3.x 时代,只有继承自​BaseException​的对象才可以被抛出。
  2. 2.x ​raise​语句使用逗号将抛出对象类型和参数分开,3.x 取消了这种奇葩的写法,直接调用构造函数抛出对象即可。

    在 2.x 时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在 3.x 中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。


    xrange

    在 Python 2 中​ xrange() ​创建迭代对象的用法是非常流行的。比如:​ for​ 循环或者是列表/集合/字典推导式。

    这个表现十分像生成器(比如。"​惰性求值​")。但是这个 ​xrange-iterable​ 是无穷的,意味着你可以无限遍历。

    由于它的惰性求值,如果你不得仅仅不遍历它一次,​xrange() ​函数 比 ​range()​ 更快(比如 ​for​ 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

    在 Python 3 中,​range() ​是像 ​xrange()​ 那样实现以至于一个专门的​ xrange()​ 函数都不再存在(在 Python 3 中​ xrange()​ 会抛出命名异常)。

    import timeitn = 10000def test_range(n):    return for i in range(n):        passdef test_xrange(n):    for i in xrange(n):        pass   

    Python 2

    print 'Python', python_version()print '
    timing range()' %timeit test_range(n)print '
    
    timing xrange()' %timeit test_xrange(n)Python 2.7.6timing range()1000 loops, best of 3: 433 µs per looptiming xrange()1000 loops, best of 3: 350 µs per loop

    Python 3

    print('Python', python_version())print('
    timing range()')%timeit test_range(n)Python 3.4.1timing range()1000 loops, best of 3: 520 µs per loop
    print(xrange(10))---------------------------------------------------------------------------NameError                                 Traceback (most recent call last)<ipython-input-5-5d8f9b79ea70> in <module>()----> 1 print(xrange(10))NameError: name 'xrange' is not defined

    八进制字面量表示

    八进制数必须写成​0o777​,原来的形式​0777​不能用了;二进制必须写成​0b111​。

    新增了一个​bin()​函数用于将一个整数转换成二进制字串。 Python 2.6 已经支持这两种语法。

    在 Python 3.x 中,表示八进制字面量的方式只有一种,就是​0o1000​。

    python 2.x

    >>> 0o1000512>>> 01000512

    python 3.x

    >>> 01000  File "<stdin>", line 1    01000        ^SyntaxError: invalid token>>> 0o1000512

    不等运算符

    Python 2.x 中不等于有两种写法​ !=​ 和 ​<>

    Python 3.x 中去掉了​<>​, 只有​!=​一种写法,还好,我从来没有使用​<>​的习惯


    去掉了repr表达式``

    Python 2.x 中反引号​``​相当于​repr​函数的作用

    Python 3.x 中去掉了​``​这种写法,只允许使用​repr​函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用​repr​的机会很少,一般只在​debug​的时候才用,多数时候还是用​str​函数来用字符串描述对象。

    def sendMail(from_: str, to: str, title: str, body: str) -> bool:    pass

    多个模块被改名(根据PEP8)

    旧的名字新的名字
    _winregwinreg
    ConfigParserconfigparser
    copy_regcopyreg
    Queuequeue
    SocketServersocketserver
    reprreprlib

    StringIO​模块现在被合并到新的​io​模组内。 ​new​, ​md5​, ​gopherlib​等模块被删除。 Python 2.6已经支援新的​io​模组。

    httplib​, ​BaseHTTPServer​, ​CGIHTTPServer​, ​SimpleHTTPServer​, ​Cookie​, ​cookielib​被合并到​http​包内。

    取消了​exec​语句,只剩下​exec()​函数。 Python 2.6已经支援​exec()​函数。


    5.数据类型

    1)Python 3.X 去除了​long​类型,现在只有一种整型——​int​,但它的行为就像 Python 2.X 版本的​long

    2)新增了​bytes​类型,对应于 Python 2.X 版本的八位串,定义一个​bytes​字面量的方法如下:

    >>> b = b'china' >>> type(b) <type 'bytes'> 

    str​ 对象和​ bytes ​对象可以使用 ​.encode() (str -> bytes)​ 或 ​.decode() (bytes -> str)​方法相互转化。

    >>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china' 

    3)​dict​的​.keys()​、​.items​ 和​.values()​方法返回迭代器,而之前的​iterkeys()​等函数都被废弃。同时去掉的还有​ dict.has_key()​,用​ in​替代它吧 。


    相关教程


    Python IDE

    本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Python IDE。


    PyCharm

    PyCharm 是由 JetBrains 打造的一款 Python IDE。

    PyCharm 具备一般 Python IDE 的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。

    另外,PyCharm 还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm 支持 IronPython。

    PyCharm 官方下载地址:http://www.jetbrains.com/pycharm/download/

    效果图查看:

    pycharm_ui_darcula

    Sublinme Text 2

    Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,Python 的插件,代码段等。还可自定义键绑定,菜单和工具栏。

    Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。

    Sublime Text 是一个跨平台的编辑器,同时支持 Windows、Linux、Mac OS X 等操作系统。

    sublimetext

    使用 Sublinme Text 2 的插件扩展功能,你可以轻松的打造一款不错的 Python IDE,以下推荐几款插件(你可以找到更多):

    • CodeIntel:自动补全+成员/方法提示(强烈推荐)
    • SublimeREPL:用于运行和调试一些需要交互的程序(E.G. 使用了Input()的程序)
    • Bracket Highlighter:括号匹配及高亮
    • SublimeLinter:代码 pep8 格式检查

    Eclipse+Pydev

    1、安装 Eclipse

    Eclipse可以在它的官方网站 Eclipse.org 找到并下载,通常我们可以选择适合自己的Eclipse版本,比如 Eclipse Classic。下载完成后解压到到你想安装的目录中即可。

    当然在执行Eclipse之前,你必须确认安装了Java运行环境,即必须安装JRE或JDK,你可以到(http://www.java.com/en/download/manual.jsp)找到 JRE 下载并安装。

    2、安装 Pydev

    运行 Eclipse 之后,选择 help-->Install new Software,如下图所示。

    Snap1

    点击 Add,添加 pydev 的安装地址:http://pydev.org/updates/,如下图所示。

    Snap2

    完成后点击"ok",接着点击 PyDev 的"+",展开 PyDev 的节点,要等一小段时间,让它从网上获取 PyDev 的相关套件,当完成后会多出 PyDev 的相关套件在子节点里,勾选它们然后按 next 进行安装。如下图所示。

    Snap3

    安装完成后,重启 Eclipse 即可

    3、设置 Pydev

    安装完成后,还需要设置一下 PyDev,选择 Window -> Preferences 来设置 PyDev。设置 Python 的路径,从 Pydev 的 Interpreter - Python 页面选择 New

    Snap5

    会弹出一个窗口让你选择 Python 的安装位置,选择你安装 Python 的所在位置。

    Snap6

    完成之后 PyDev 就设置完成,可以开始使用。

    4、建立 Python Project:

    安装好 Eclipse+PyDev 以后,我们就可以开始使用它来开发项目了。首先要创建一个项目,选择 File -> New ->Pydev Project

    Snap7

    会弹出一个新窗口,填写 Project Name,以及项目保存地址,然后点击 next 完成项目的创建。

    Snap8

    5、创建新的 Pydev Module

    光有项目是无法执行的,接着必须创建新的 Pydev Moudle,选择 File -> New -> Pydev Module

    Snap9

    在弹出的窗口中选择文件存放位置以及 Moudle Name,注意 Name 不用加 .py,它会自动帮助我们添加。然后点击 Finish 完成创建。

    Snap10

    输入"hello world"的代码。

    Snap11

    6、执行程序

    程序写完后,我们可以开始执行程序,在上方的工具栏上面找到执行的按钮。

    Snap13

    之后会弹出一个让你选择执行方式的窗口,通常我们选择 Python Run,开始执行程序。

    Snap14


    更多 Python IDE

    当然还有非常多很棒的 Python IDE,你可以自由的选择,更多 Python IDE 请参阅:http://wiki.python.org/moin/PythonEditors

    Python JSON

    本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。


    环境配置

    在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块。本教程我们会下载 Demjson 并安装:

    $tar xvfz demjson-1.6.tar.gz$cd demjson-1.6$python setup.py install

    JSON 函数

    使用 JSON 函数需要导入 json 库:import json。

    函数描述
    json.dumps将 Python 对象编码成 JSON 字符串
    json.loads将已编码的 JSON 字符串解码为 Python 对象

    json.dumps

    json.dumps 用于将 Python 对象编码成 JSON 字符串。

    语法

    json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

    实例

    以下实例将数组编码为 JSON 格式数据:

    #!/usr/bin/pythonimport jsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json = json.dumps(data)print json

    以上代码执行结果为:

    [{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]

    使用参数让 JSON 数据格式化输出:

    >>> import json>>> print json.dumps({'a': 'W3Cschool', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': ')){    "a": "W3Cschool",    "b": 7}

    Python 原始类型向 json 类型的转化对照表:

    PythonJSON
    dictobject
    list, tuplearray
    str, unicodestring
    int, long, floatnumber
    Truetrue
    Falsefalse
    Nonenull

    json.loads

    json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。

    语法

    json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

    实例

    以下实例展示了 Python 如何解码 JSON 对象:

    #!/usr/bin/pythonimport jsonjsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = json.loads(jsonData)print text

    以上代码执行结果为:

    {u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

    json 类型转换到 Python 的类型对照表:

    JSONPython
    objectdict
    arraylist
    stringunicode
    number (int)int, long
    number (real)float
    trueTrue
    falseFalse
    nullNone

    更多内容参考:https://docs.python.org/2/library/json.html



    使用第三方库:Demjson

    Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。

    Github 地址:https://github.com/dmeranda/demjson

    官方地址:http://deron.meranda.us/python/demjson/

    环境配置

    在使用 Demjson 编码或解码 JSON 数据前,我们需要先安装 Demjson 模块。本教程我们会下载 Demjson 并安装:

    $ tar -xvzf demjson-2.2.3.tar.gz$ cd demjson-2.2.3$ python setup.py install

    更多安装介绍查看:http://deron.meranda.us/python/demjson/install

    JSON 函数

    函数描述
    encode将 Python 对象编码成 JSON 字符串
    decode将已编码的 JSON 字符串解码为 Python 对象

    encode

    Python encode() 函数用于将 Python 对象编码成 JSON 字符串。

    语法

    demjson.encode(self, obj, nest_level=0)

    实例

    以下实例将数组编码为 JSON 格式数据:

    #!/usr/bin/pythonimport demjsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json = demjson.encode(data)print json

    以上代码执行结果为:

    [{"a":1,"b":2,"c":3,"d":4,"e":5}]

    decode

    Python 可以使用 demjson.decode() 函数解码 JSON 数据。该函数返回 Python 字段的数据类型。

    语法

    demjson.decode(self, txt)

    实例

    以下实例展示了 Python 如何解码 JSON 对象:

    #!/usr/bin/pythonimport demjsonjson = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = demjson.decode(json)print  text

    以上代码执行结果为:

    {u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

    Python 100例

    以下实例在 Python2.7 下测试通过:

    GUI 图形界面

    1.wxpython

      Python 下的 GUI 编程框架,与 MFC 的架构相似

     下载地址:http://wxpython.org/download.php

    2. PyQt

      用于 Python 的 QT 开发库

      下载地址:http://www.riverbankcomputing.com/software/pyqt/download

    Web 框架

    1. Django

    开源 web 开发框架,它鼓励快速开发,并遵循 MVC 设计

    下载地址: http://www.djangoproject.com/

    2. web2py

    一个小巧灵活的 Web 框架,虽然简单但是功能强大

    下载地址:http://web2py.com/

    科学计算

    1. Matplotlib

    用 Python 实现的类 matlab 的第三方库,用以绘制一些高质量的数学二维图形

    下载地址:

    http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.0/

    2. SciPy

    基于 Python 的 matlab 实现,旨在实现 matlab 的所有功能

    下载地址:http://pypi.python.org/pypi/scipy/

    3. NumPy

    基于 Python 的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案

    下载地址:http://pypi.python.org/pypi/numpy/

    网页处理

    1. BeautifulSoup,强大的容错功能

    网页处理非常强大的包

    http://www.crummy.com/software/BeautifulSoup/

    2. PyQuery,在 Python 中如网页的  jQuery 一样处理文档

    下载:https://pypi.python.org/pypi/pyquery

    文档:https://pythonhosted.org/pyquery/


    其他

    1. MySQLdb

    用于连接 MySQL 数据库

    下载地址:http://pypi.python.org/pypi/MySQL-python/

    2. PIL

    基于 Python 的图像处理库,功能强大,对图形文件的格式支持广泛

    下载地址:http://effbot.org/zone/pil-index.htm

    3. PyGame

    基于 Python 的多媒体开发和游戏软件开发模块

    下载地址:http://www.pygame.org/download.shtml

    4. sh 系统管理

    sh 可以让你像执行函数一样执行 shell 终端命令

    下载地址:https://pypi.python.org/pypi/sh

    5. pickle (cPickle)

    6. json

    7. random

    8. datetime


    特别介绍

    1. cx_Freeze

    方便简洁的打包工具,可跨平台!

    下载地址:http://cx-freeze.sourceforge.net/

    2. psyco

    脚本的执行效率多少有点差强人意,虽然优化起来并不是难事,但如果有简单的方法,近乎不用修改源代码,那当然值得去关注一下。psyco 的神奇在于它只需要在代码的入口处调用短短两行代码,性能就能提升 40% 或更多,真可谓是立竿见影!

    如果你的客户觉得你的程序有点慢,敬请不要急着去优化代码,psyco 或许能让他立即改变看法。psyco 堪称 Python 的 jit,有许多潜力可以挖掘,如果剩下来给你优化性能的时间已经不多,请马上去阅读它的手册,有许多招儿轻松优化性能。


    以上都是一些常用的第三方库

    更多请点击:http://pypi.python.org/pypi


    其他推荐:

    http://www.zhihu.com/question/20501628

    http://blog.csdn.net/sasoritattoo/article/details/9381361

    1.pip使用包管理

    文档: https://pip.pypa.io/en/latest/installing.html

    # 安装,可指定版本号(sudo) pip install Django==1.6.8# 升级(sudo) pip install bpython --upgrade# 一次安装多个(sudo) pip install BeautifulSoup4 fabric virtualenv# 从文本中安装,文本中为包名,一行一个,可以指定版本号(sudo) pip install –r requirements.txt# 删除(sudo) pip uninstall xlrd# 导出当前已经安装包pip freeze > requirements.txt

    2. virtualenv独立Python环境管理

    文档:  http://virtualenvwrapper.readthedocs.org/en/latest/

    virtualenv 是一个创建独立环境的包,Pythonvirtualenvwrapper 是一个更好用的 Pythonvirtualenv

    # 安装:(sudo) pip install virtualenv virtualenvwrapper# 修改.bash_profile 或 .zshrc(如果你用 zsh 的话),添加以下语句export WORKON_HOME=$HOME/.virtualenvsexport PROJECT_HOME=$HOME/workspacesource /usr/local/bin/virtualenvwrapper.sh

    mkvirtualenv  ENV:创建运行环境ENV

    rmvirtualenv  ENV:删除运行环境ENV

    mkproject  mic:创建 mic 项目和运行环境 mic

    mktmpenv :创建临时运行环境

    workon  bsp: 工作在 bsp 运行环境

    lsvirtualenv : 管理者的运行环境

    lssitepackages : 当前环境安装了的包

    创建的环境是独立的,互不干扰,不需要 sudo 包就可以使用 pip 来进行的管理。

    下面是使用演示图:


    3.面料管理和应用发布

    官网: http://www.fabfile.org/

    文档: http ://docs.fabfile.org/

    Fabric:应用程序部署或系统管理任务

    #coding:utf-8from fabric.api import *# 服务器列表env.hosts = ['user@server1','user2@server2']def ls_home():    with cd('/home/bae/'):        run('ls')'''常用命令lcd(dir): 进入本机某目录local(cmd): 本机上执行命令cd(dir): 进入服务器某目录run(cmd):服务器上执行命令'''

    把上面的文件保存成 fabfile.py 在终端上进入该文件的目录,执行

    fab 函数名比如:fab ls_home

    更多使用方法请参见官方文档。

    领取免费资料

    扫描下方二维码或打开微信搜一搜“51coolma编程狮”关注公众号回复关键词【Python123】或者【Python资料包】免费领取 Python 学习资料,包含软件安装包,电子书、思维导图等

    51coolma编程狮微信公众号

    1. python 中的字符串简介与常用函数

    在 python 中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改

    字符串是我们后面需要学习的稍大一点的对象类别--序列的第一个代表

    在字符串章节所说到的关于序列的操作,后面的列表与元组一样适用

    字符串常用的一些操作与函数

    操作解释
    s=''空字符串
    s="abc'd"双引号和单引号相同
    s='abc '转义序列,使用变量完全显示字符,只有使用 print 函数才能够显示转义
    s="""aaaaa"""三重引号字符串块
    s=r' empspam'Raw 字符串
    s=b'abc'python 3.x 的字节字符串
    s=u'bac'unicode 字符串
    s1+s2合并
    s*3重复
    s[i]索引
    s[i:j]分片
    len(s)求长度
    “a %s parrot” % kind字符串格式化表达式
    "a {0} parrot".format(kind)字符串格式化方法
    s.find('xxx')搜索
    s.rstrip()移除空格
    s.replace('xxx','xxx')替换
    s.endswith('xxx')以 xxx 结尾
    'xxx'.join(strlist)出入分隔符
    s.encode('latin-1')改变编码
    for x in s:print(x)迭代
    ‘xxx’ in s 成员关系
    [c*2 for c in s]成员关系
    map(ord,s)成员关系

    2. python 字符串常量

    1.单双引号字符串是一样的

      >>> 'abc',"abc"    ('abc''abc')    >>>   

    当你的 python 照着上面的例子来写,这个时候单双引号字符串是一样的。两者可以互换。

    我们甚至可以在单双引号直接引入对方

      >>> 'abc"d',"abc'd"    ('abc"d'"abc'd")  

    在任意表达式中,python会自动合并相连的字符串,尽管它们之间没有通过+连接

      >>> 'abc"d',"abc'd"    ('abc"d'"abc'd")  

    还有,就像上面的几个例子,在字符串中间加上逗号,最后形成的是元组而不是字符串

    2.使用转义字符表示特殊字符

      >>> a='abc
    def
    '    >>> a    'abc
    def
    '    >>> print(a)   abc    def        >>>   

    看上面的例子,字符串之间加上转义字符,如果我们直接用变量打印,他会把所有字符都打印出来,但是如果使用 print 打印,转义字符会从原来的字符串变成二进制值,例如: 代表制表符等等

    常见的转义字符:

    转义意义
    连续,接着上面一行
    反斜杠
    '单引号
    "双引号
    a响铃
    倒退
    f换页
    换行
    返回
    水平制表符
    v垂直制表符
    N{id}unicode 数据库 id
    uhhhhunicode16 位的十六进制值
    Uhhhhunicode32位的十六进制值
    xhh十六进制值
    ooo八进制值
    Null
    other不转义

    3.raw 字符串抑制转义

    有很多时候我们需要打开文件等,那么就需要输入路径,特别是 window 的路径,大多使用反斜杠,这个时候就会出现问题

    例如:

    handler=open('c: b123.txt','w')  

    这个时候就出问题了,本来是打开 nb123 这个文本文件,但是由于前面有个反斜杠,在转义当中是换行,引起歧义

    所以,我们需要把路径改成下面的样子:

      handler=open(r'c:
    b123.txt','w')    handler=open('c:
    b123.txt','w')  

    这个时候就是合法的,使用r来抑制转义,或者使用双反斜杠

    4.使用三重双引号来输入多字符串

     >>> a="""aaabbb   ccdcdef'ddfdfd"""    >>> a    "aaabbb
    ccdcdef'ddfdfd"  

    它常用于文档字符串,或者注释大段的代码

    3. Python 字符串的一般使用

    1. 基本操作

    1)使用 + 连接

      >>> "abc"+"efg"    'abcefg'    >>> a="abc"    >>> b="efg"    >>> c=a+b    >>> c    'abcefg'    >>>   

    2)使用 * 重复

     >>> "abc"*3    'abcabcabc'    >>> "abc
    "*3    'abc
    abc
    abc
    '    >>> print("abc
    "*3)    abc    abc    abc        >>>   

    3)字符串不能使用 + 连接数字

      >>> "abc"+9    Traceback (most recent call last):      File "", line 1in         "abc"+9    TypeError: Can't convert 'int' object to str implicitly  

    4)使用 for 来迭代

     >>> a="abcdefg"    >>> for x in a:print(x)        a    b    c    d    e    f    g  

    5)使用 in 来找字符,后面我们还会说到 str.find() 方法,跟 in 非常相似

      >>> a="abcdefg"    >>> "h" in a    False    >>> "abc" in a    True    >>>   

    2. 索引与分片

    1)索引

    字符串可以通过索引来查找想要的字符,而且索引分成正负,通过不同的查询方向来查找

      >>> a="abcdefg"    >>> a[0],a[1],a[5]    ('a''b''f')    >>> a[-2],a[-1],a[-5]    ('f''g''c')    >>>   

    2)分片,说白了就是提取字符串的某些部分,而且当索引使用负数则返回空

      >>> a="abcdefg"    >>> a[1:]    'bcdefg'    >>> a[1:3]    'bc'    >>> a[-1:3]    ''    >>>   

    我使用一张图来说明一下这个分片是怎么分的,以 a[1:3] 为例子

    从图上面我们比较清楚情况,对于 1,他是把指针放到a的后面,从 b 开始数,a 不算,然后后面的 3,他是把指针放到 d 的前面,不算 d

    所以返回的只有 bc

    还有需要特殊说明一些例子:

    a[1:] 从第二个字符开始到结束

    a[:3] 从第一个字符开始到第二个字符,也就是第三个字符前

    a[:] 复制所有字符

    其实还有第三个参数,步进,说白了,就是跳着选,就是要看跳几个而已

      >>> a="abcdefghijklmn"   >>> a[2:8:2]   'ceg'    >>> a[::3]    'adgjm'    >>>   

    a[2:8:2] 代表从第三个字符开始抽取,到第八个之前也就是第七个,然后每隔 2 个挑一个出来

    a[::3]代表从所有字符中每隔3个挑一个出来

    如果步进是复数,则反着挑

    3. 字符串转换 str()与 repr()

      >>> str(42)    '42'    >>> repr(43)    '43'  

    区别,在使用 print 的时候,repr 多了一对单引号

      >>> print(str('aaa'),repr('aaa'))    aaa 'aaa'  

    4. 修改字符串

    字符串是不可以修改的,那么怎么修改呢?

    其实过程是我们从一个字符串里面抽取某些字符,然后在加上其他的字符,形成新的字符串对象

     >>> a="abcdefghijklmn"    >>> id(a)    24338048    >>> b=a[1:5]+" 
     this is a str"   >>> id(b)    24342896   >>> b    'bcde 
     this is a str'    >>> print(b)    bcde     this is a str   >>>   

    4. Python 修改字符串实例总结

    我们知道 python 里面字符串是不可原处直接修改的,为了是原来的字符串修改过来,我们有一下方法:

    1. 分片和合并

      >>> a='abcde'    >>> b='fghij'    >>> c=a[1:3]+b[2:5]+' end'    >>> c    'bchij end'    >>>   

    2. replace()

      >>> a='aaabbbcccddd'    >>> a.replace ('aaa','xxx')    'xxxbbbcccddd'    >>>   

    3. 结合 find() 和分片

      >>> a='aaaxbbbcccxddd'    >>> where = a.find ('x')    >>> where    3    >>> a[:where]+'ttttt'+a[where:]    'aaatttttxbbbcccxddd'    >>>   

    上面的三种方法,虽然都修改了源字符串,其实它们没有直接在原处修改,只是重新创建一个新的字符串对象

    4. 使用可修改的列表

    可能你需要修改超长文本多个地方,这时候上面的方法性能不好,所以需要转换为可以修改的对象-列表

      >>> a='aaaxbbbcccxddd'    >>> b=list(a)    >>> b    ['a''a''a''x''b''b''b''c''c''c''x''d''d''d']    >>> b[2]='x'    >>> b[7]='x'    >>> b    ['a''a''x''x''b''b''b''x''c''c''x''d''d''d']    >>> a=''.join (b)    >>> a    'aaxxbbbxccxddd'    >>>   

    5. Python 文本解析

    这一章节我们简单的聊聊文本解析的两种方法:

    1. 分片,通过分片,记录偏移处,然后提取想要的字符串

    例子:

      >>> line='aaa bbb ccc'    >>> col1=line[0:3]    >>> col3=line[8:]    >>> col1    'aaa'    >>> col3    'ccc'    >>>   

    2. split()

      >>> line='aaa bbb ccc'    >>> a=line.split (' ')    >>> a    ['aaa''bbb''ccc']    >>> a[0]    'aaa'    >>> a[1]    'bbb'    >>> a[2]    'ccc'    >>>   
      >>> line='aaa,bbb,ccc'    >>> a=line.split (',')    >>> a    ['aaa''bbb''ccc']    >>>   

    使用 split 方法,根据特征码提取不同的字符

    虽然上面的两种方法对于平常文本解析的潜力有限,但是它们对于我们平常编程的时候值的传递有着不少的用处

    例如 json 字符串就是其中一个比较典型的例子,使用 {} [] , 三种符号,区分开各种对象

    6. Python 字符串格式化表达式

    字符串格式化允许在一个单个的步骤中对一个字符串执行多个特定类型的替换

    特别是给用户提示的时候,格式化非常方便

    实现方法:

    1. 格式化表达式,类似于 c 语言的 printf

    在表达式中,我们使用 % 二进制操作符

      >>> print('this is %d %s bird' % (1,'dead'))    this is 1 dead bird  

    举上面的例子说明(注意我们下面所说的 %,都是以字符串和元组中间的那个为准)

    在 % 的左边放置一个字符串,字符串里面放置了一个或者多个使用 % 开头的嵌入对象

    在 % 的右边放入一个(或多个,嵌入元组当中)对象,这些对象将插入到左边的转换目标位置上

      >>> name='ray'    >>> 'my name is %s' % name    'my name is ray'    >>> '%d %s %d you' % (1,'spam',4)    '1 spam 4 you'    >>> '%s---%s---%s' % (42,3.14,[1,2,3])    '42---3.14---[1, 2, 3]'    >>>   

    当插入多个对象时,需要把他们放到一个元组里面

    2. 高级格式化表达式

    字符串格式化代码列表

    代码意义
    s字符串(或者任何对象)
    rs, 但是用 repr,而不是 str
    c字符
    d十进制整数
    i整数
    u无号整数
    o八进制整数
    x十六进制整数
    Xx,但打印大写
    e浮点指数
    Ee,但打印大写
    f浮点十进制
    F浮点十进制
    g浮点e或f
    G浮点e或f
    %常量%

    %[(name)][flags][width][.pression]typecode

    例子

      >>> x=1234    >>> res='integers:...%d...%-6d...%06d' % (x,x,x)    >>> res    'integers:...1234...1234  ...001234'    >>>   

    %e, %f, %g 对于浮点数的打印是有所区别的

      >>> x=1.23456789    >>> x    1.23456789    >>> '%e|%f|%g' % (x,x,x)    '1.234568e+00|1.234568|1.23457'    >>>   

    3. 基于字典的格式化表达式

      >>> 'my name is %(name)s,my age is %(age)d' % {'name':'ray','age':30}    'my name is ray,my age is 30'    >>>   

    说白了就是给每个替换位置命名,这样代码看起来更加明了

    7. Python 字符串格式化方法(1)

    承接上一章节,我们这一节来说说字符串格式化的另一种方法,就是调用 format()

      >>> template='{0},{1} and {2}'    >>> template.format ('a','b','c')    'a,b and c'    >>> template='{name1},{name2} and {name3}'    >>> template.format (name1='a',name2='b',name3='c')    'a,b and c'   >>> template='{name1},{0} and {name2}'    >>> template.format ('a',name1='b',name2='c')    'b,a and c'    >>>   

    这里根据上面的例子说明一下

    1. 替换的位置可以使用下标的来标记

    2. 替换的位置可以使用名称来替换

    下面我们来说说,在方法里面添加属性

      >>>import sys    >>> 'my {1[spam]} runs {0.platform}'.format(sys,{'spam':                             'laptop'})    'my laptop runs win32'    >>>   
      >>> 'my {config[spam]} runs {sys.platform}'.format(sys=sys,config={'spam':'laptop'})    'my laptop runs win32'    >>>   

    上面两个例子里面,第一处读取了字符串,第二处读取 sys 里面的 platform 属性

    下面再举一个例子,说明在表达式里面使用偏移量

      >>> aList=list('abcde')    >>> aList    ['a''b''c''d''e']    >>> 'first={0[0]} third={0[2]}'.format (aList)    'first=a third=c'    >>>   

    注意:在使用偏移量的时候只能够是正整数,不能够使用负数,不能够使用代表区间正整数

      >>> aList=list('abcde')        >>> aList    ['a''b''c''d''e']    >>> 'first={0[0]} third={0[-1]}'.format (aList)    Traceback (most recent call last):      File "", line 1in         'first={0[0]} third={0[-1]}'.format (aList)    TypeError: list indices must be integers, not str    >>> 'first={0[0]} third={0[1:3]}'.format (aList)    Traceback (most recent call last):      File "", line 1in         'first={0[0]} third={0[1:3]}'.format (aList)    TypeError: list indices must be integers, not str    >>>   

    7. python 字符串格式化方法(2)

    紧接着上一章节,这一章节我们聊聊怎样添加具体格式化

    就是指定替换字段的大小、对齐方式和特定的类型编码,结构如下:

    {fieldname!conversionflag:formatspec}

    fieldname 指定参数的一个数字或者关键字,后面可选 .name 或者 [index] 引用

    conversionflag 可以是 r/s/a 或者是在该值上对 repr/str/ascii 内置函数的一次调用

    formatspec 指定如何表示该值,如字段宽带、对齐方式、补零、小数点精度等,并以一个可选的数据类型编码结束

      >>> '{0:10}={1:10}'.format ('abcde',1.234566789)    'abcde     =1.234566789'    >>> '{0:10}={1:3}'.format ('abcde',1.234566789)    'abcde     =1.234566789'    >>> '{0:10}={1:3}'.format ('abcde',123456678.9)    'abcde     =123456678.9'    >>> '{0:.format ('abcde',123456678.9)    'abcde     =123456678.9'    >>> '{0:>10}={1:3}'.format ('abcde',123456678.9)    '     abcde=123456678.9'    >>> import sys    >>> '{0.platform:>10}={1:3}'.format (sys,123456678.9)    '     win32=123456678.9'  

    上面举了一些例子

    {0:10} 表示一个 10 字节宽的字段的参数

    {0:<10} 表示一个左对齐的 10 字节宽的字段的参数

    {0:>10} 表示一个右对齐的 10 字节宽的字段的参数

    {0.platform} 读取 sys 模块的属性

    下面再举一些例子

      >>> '{0:e},{1:.3e},{2:g}'.format (3.141592,3.141592,3.141592)    '3.141592e+00,3.142e+00,3.14159'    >>> '{0:f},{1:.2f},{2:06.2f}'.format (3.141592,3.141592,3.141592)    '3.141592,3.14,003.14'    >>>   

    {0:e} 代表使用科学计数法来表示

    {1:.3e} 只保留三位小数的科学计数法来表示

    {2:g} 使用 g 来表示浮点数

    {1:.2f} 保留两位小数的浮点数

    {2:06.2f} 六字节款的保留两位小数不足宽度补零的字符串

    除了上面的十进制,还支持八进制、十六进制

      >>> '{0:X},{1:o},{2:b}'.format (255,255,255)    'FF,377,11111111'    >>> bin(255),int('11111111',2),0b11111111    ('0b11111111'255255)  

    还支持在 format 里面嵌入表达式,动态获取

      >>> '{0:f},{1:.2f},{2:06.2f}'.format (1/3,1/3,1/3)    '0.333333,0.33,000.33'  

    python 字符串对齐

    场景:

    字符串对齐

    python 提供非常容易的方法,使得字符串对齐

      >>> print("abc".center (30,'-'))    -------------abc--------------                           >>> print("abc".ljust (30)+'|')    abc                           |    >>> print("abc".rjust (30))                               abc    >>>   

    分别是 center,ljust,rjust

    三个方法默认填充是空格,也可以使用其他字符填充

    python文本 字符与字符值转换

    场景:

    将字符转换成 ascii 或者 unicode 编码

    在转换过程中,注意使用 ord 和 chr 方法

      >>> print(ord('a'))    97    >>> print(chr(97))    a    >>>   

    有时候需要反转过来使用:

      >>> print(str(ord('a')))    97    >>> print(chr(ord('a')))    a    >>>   

    这个时候需要注意 str() 与 chr() 之间的区别:str 是把返回的对象直接转为字符串,而 chr 则是把返回的对象转换为对应的 ascii 码的字符串。

    python 文本 字符串开头或者结尾匹配

    场景:

    字符串开头或者结尾匹配,一般是使用在匹配文件类型或者 url

    一般使用 startwith 或者 endwith

      >>> a='http://www.51coolma.cn/vip'    >>> a.startswith ('http')    True  

    注意:这两个方法里面的参数可以是 str,也可以是元组,但是不可以是列表和字典

      >>> a='http://www.51coolma.cn/vip'    >>> a.startswith (('http','ftp'))    True  

    如果是列表或者字典,则报错

      >>> a='http://www.51coolma.cn/vip'    >>> a.startswith (['http','ftp'])    Traceback (most recent call last):      File "", line 1in         a.startswith (['http','ftp'])    TypeError: startswith first arg must be str or a tuple of str, not list    >>>   

    其实,除了上面的方法, 也可以使用切片来实现,只不过代码看上去没那么好看而已

      >>> a='http://www.51coolma.cn/vip'    >>> a[0:4]=='http'    True    >>>   

    当然,我们也可以用正则表达式来做,但是理解上面就稍微难度有点。

      >>> import re    >>> url = 'http://www.python.org'    >>> re.match('http:|https:|ftp:', url)    05), match='http:'>    >>> help(re.match )    Help on function match in module re:        match(pattern, string, flags=0)        Try to apply the pattern at the start of the string, returning        a match object, or None if no match was found.       >>>   


    python 文本 单独处理字符串每个字符的方法汇总

    场景:

    用每次处理一个字符的方式处理字符串

    方法:

    1. 使用 list(str)

      >>> a='abcdefg'    >>> list(a)    ['a''b''c''d''e''f''g']    >>> aList=list(a)    >>> for item in aList:        print(item)#这里可以加入其他的操作,我们这里只是单纯使用print                a    b    c    d    e    f    g    >>>   

    2. 使用 for 遍历字符串

      >>> a='abcdefg'    >>> for item in a :        print(item)#这里可以加入其他的操作,我们这里只是单纯使用print                a    b    c    d    e    f    g    >>>   

    3. 使用 for 解析字符串到 list 里面

      >>> a='abcdefg'    >>> result=[item for item in a]    >>> result    ['a''b''c''d''e''f''g']    >>>   

    python文本 判断对象里面是否是类字符串

    场景:

    判断对象里面是否是类字符串

    一般立刻会想到使用 type() 来实现

      >>> def isExactlyAString(obj):        return type(obj) is type('')        >>> isExactlyAString(1)    False    >>> isExactlyAString('1')    True    >>>   

    还有

      >>> def isAString(obj):        try :obj+''        except:return False        else:return True                >>> isAString(1)    False   >>> isAString('1')    True    >>> isAString({1})    False    >>> isAString(['1'])    False    >>>   

    虽然思路上和方法使用上都没用问题,但是如果从 python 的特性出发,我们可以找到更好的方法:isinstance(obj, str)

      >>> def isAString(obj):        return isinstance(obj,str)        >>> isAString(1)    False   >>> isAString('1')    True    >>>   

    str 作为 python3 里面唯一的一个字符串类,我们可以检测字符串是否是 str 的实例

    python 文本 去掉字符串前后空格

    场景:

    去掉字符串前后空格

    可以使用 strip,lstrip,rstrip 方法

      >>> a="abc".center (30)    >>> a    '             abc              '    >>> b=a.lstrip ()    >>> b    'abc              '    >>> c=a.rstrip ()    >>> c    '             abc'    >>> d=a.strip ()    >>> d    'abc'    >>>   

    这三个方法默认是去掉空格,也可以通过参数去掉其他字符,等价与 replace

      >>> a="abc"    >>> b=a.strip ('a')    >>> b    'bc'    >>> c=a.replace ('a','')    >>> c    'bc'    >>>   

    python文本 拼接、合并字符串

    场景:

    拼接、合并字符串

    在这个场景中,我们首先想到的当然是使用 + 或者 += 将两个字符串连接起来

      >>> a='a'    >>> b='b'    >>> c=a+b    >>> c    'ab'    >>>   

    如果整个程序只有两个字符串需要拼接,那没有问题

    但是如果程序里面大量存在拼接,甚至需要循环拼接,这个时候性能问题就会出现

    原因:字符串是不可原地修改的,改变一个字符串就是创建一个新的字符串替代旧的,如果当有 N 个字符串需要改动,那么就是创建 N 个字符串,然后再丢掉 N 个旧的字符串,分配一个大字符串空间并且填充这个字符串所需的时间大致正比于这个字符串的长度

    因此,我们推荐使用 .join 方法,如果是有些字符串不是一开始就到位,可以使用 list 暂存,然后再 join

    例如:

      >>> a='a'    >>> b='b'    >>> c=a.join (b)    >>> c    'b'    >>>   

    python文本 字符串逐字符反转以及逐单词反转

    场景:

    字符串逐字符反转以及逐单词反转

    首先来看字符串逐字符反转,由于 python 提供了非常有用的切片,所以只需要一句就可以搞定了

      >>> a='abc edf degd'    >>> a[::-1]    'dged fde cba'    >>>   

    然后我们来看住单词反转

    1. 同样的我们也可以使用切片

      >>> a='abc edf degd'    >>> a.split ()[::-1]    ['degd''edf''abc']  

    2. 可以使用原生方法 reverse

      >>> a='abc edf degd'    >>> result=a.split()    >>> result    ['abc''edf''degd']    >>> result.reverse()    >>> result    ['degd''edf''abc']    >>> result=' '.join (result)    >>> result    'degd edf abc'    >>>   

    在反转的过程中,我意外发现 join 的另外使用方法

      >>> a='abcd'    >>> ' '.join (a)    'a b c d'    >>> a='abc edf degd'    >>> ' '.join (a)    'a b c   e d f   d e g d'    >>>   

    它可以快速的再每个字符中间加上我们赋值的字符

      >>> '+'.join (a)    'a+b+c+ +e+d+f+ +d+e+g+d'    >>>   

    综上所有,还是使用切片的方法最好,最推荐使用

    python 文本 maketrans 和 translate

    场景:

    过滤字符串的某些字符,我们从例子出发

      >>> tb=str.maketrans ('abc','123')    >>> 'abcd'.translate (tb)    '123d'    >>> 'abcd+++a+b+cd'.translate (tb)    '123d+++1+2+3d'    >>>   

    1. 建立字符映射表,也就是 maketrans 方法所做的事情,它返回一个字符串的映射表,意思是:如果字符串里面出现a,那么它就会变成对应的 1,如此类推,b->2,c->3

    2. 使用 translate 方法,将字符串里面的字符改掉

    注意:

    1. 映射两遍的长度必须一致,不然报错,也就是说 'abc' 一定需要对于 '123' 或者 '234' 等,不能是 'abc' 对应 '12',这个时候就报错

      >>> tb=str.maketrans ('abc','12')    Traceback (most recent call last):      File "", line 1in         tb=str.maketrans ('abc','12')    ValueError: the first two maketrans arguments must have equal length    >>>   

    2. 还需要注意的是,字符串的 translate 方法只接受一个参数,而 bytes 的 translate 方法是可以接收两个参数,而且第二个参数可以快速实现删除方法

      >>> bytes_tb = bytes.maketrans(b'abcd', b'ABCD')    >>> b'abcdefg'.translate (bytes_tb,b'a')    b'BCDefg'    >>>   

    下面列举一些 translate 的一些应用方法:(注意:为了快速实现删除,所以下面的方法都是用 bytes 的 translate)

    修改某些字符串:

      >>> def AToB(seq,frm,to):        if len(frm)or len(frm)>len(to):return '映射字符长度不一致'        else:            bytes_tb = bytes.maketrans(frm,to)            return seq.translate (bytes_tb)                >>> AToB(b'abcd',b'a',b't1')    '映射字符长度不一致'    >>> AToB(b'abcd',b'a1',b't')    '映射字符长度不一致'    >>> AToB(b'abcd',b'a',b't')    b'tbcd'    >>>   

    删除某些字符串:

      >>> def AToB(seq,delete):        return seq.translate (None,delete)        >>> AToB(b'abcd',b'a')    b'bcd'    >>>   

    保留某些字符:

      >>> def AToB(seq,keep):        delete=seq.translate (None,keep)        return seq.translate (None,"font-family: Arial, Helvetica, sans-serif;">delete)        >>> AToB(b'abcd',b'a')    b'a'    >>>   

    https://www.51coolma.cn/python3/


    Python 简介

    Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。

    Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

    • Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于 PHP 和 Perl 语言。

    • Python 是交互式语言: 这意味着,您可以在一个 Python 提示符,直接使用互动的形式执行你写的程序。

    • Python 是面向对象语言: 这意味着 Python 支持面向对象的风格或代码封装在对象的编程技术。

    • Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到web服务器再到游戏,python都能胜任。


    Python发展历史

    Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。

    Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。

    像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。

    现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。

    python团队决定在2020年的时候停止python2版本的维护,python2.7.18是其最后一个版本。


    Python特点

    • 1.易于学习:Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
    • 2.易于阅读:Python 代码定义的更清晰。

    • 3.易于维护:Python 的成功在于它的源代码是相当容易维护的。

    • 4.一个广泛的标准库:Python 的最大的优势之一是丰富的库,跨平台的,在 UNIX,Windows 和 Macintosh 兼容很好。

    • 5.互动模式:互动模式的支持,您可以从终端输入并获得结果的语言,互动的测试和调试代码片断。

    • 6.便携式:Python 可以运行在多种硬件平台和所有平台上都具有相同的接口。

    • 7.可扩展:可以添加低层次的模块到 Python 解释器。这些模块使程序员可以添加或定制自己的工具,更有效。

    • 8.数据库:Python 提供所有主要的商业数据库的接口。

    • 9.GUI编程:Python 支持 GUI 可以创建和移植到许多系统调用。

    • 10.可扩展性:相比 shell 脚本,Python 提供了一个更好的结构,且支持大型程序。

    Python 环境搭建

    本章节我们将向大家介绍如何在本地搭建 Python 开发环境。

    Python 可应用于多平台包括 Linux 和 Mac OS X,这些系统已经自带Python 支持,不需要再配置安装了。

    Windows 下直接下载最新版的 Python 2.7.9,安装的时候注意选择


    你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装 Python 以及 Python 的安装版本。

    • Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)
    • Win 9x/NT/2000
    • Macintosh (Intel, PPC, 68K)
    • OS/2
    • DOS (多个 DOS 版本)
    • PalmOS
    • Nokia 移动手机
    • Windows CE
    • Acorn/RISC OS
    • BeOS
    • Amiga
    • VMS/OpenVMS
    • QNX
    • VxWorks
    • Psion
    • Python 同样可以移植到 Java 和 .NET 虚拟机上。


    Python下载

    Python 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到:

    Python官网:http://www.python.org/

    你可以在以下链接中下载 Python 的文档,你可以下载 HTML、PDF 和 PostScript 等格式的文档。

    Python文档下载地址:www.python.org/doc/



    Python安装

    Python 已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。

    您需要下载适用于您使用平台的二进制代码,然后安装 Python。

    如果您平台的二进制代码是不可用的,你需要使用C编译器手动编译源代码。

    编译的源代码,功能上有更多的选择性, 为 Python 安装提供了更多的灵活性。

    以下为不同平台上安装 Python 的方法:

    Unix & Linux 平台安装 Python:

    以下为在 Unix & Linux 平台上安装 Python 的简单步骤:

    • 打开 WEB 浏览器访问http://www.python.org/download/
    • 选择适用于 Unix/Linux 的源码压缩包。
    • 下载及解压压缩包。
    • 如果你需要自定义一些选项修改Modules/Setup
    • 执行 ./configure ​脚本
    • make
    • make install

    执行以上操作后,Python 会安装在​ /usr/local/bin​ 目录中,Python 库安装在​/usr/local/lib/pythonXX​,XX 为你使用的 Python 的版本号。

    Window 平台安装 Python:

    以下为在 Window 平台上安装 Python 的简单步骤:

    • 打开 WEB 浏览器访问http://www.python.org/download/
    • 在下载列表中选择 Window 平台安装包,包格式为:​python-XYZ.msi ​文件 , XYZ 为你要安装的版本号。
    • 要使用安装程序 ​python-XYZ.msi,​ Windows 系统必须支持 Microsoft Installer 2.0 搭配使用。只要保存安装文件到本地计算机,然后运行它,看看你的机器支持 MSI。Windows XP和更高版本已经有 MSI,很多老机器也可以安装 MSI。
    • 下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。

    MAC 平台安装 Python:

    最近的 Mac 系统都自带有 Python 环境,但是自带的 Python 版本为旧版本,你可以通过链接http://www.python.org/download/mac/ 查看 MAC 上 Python 的新版功能介绍。

    MAC 上完整的 Python 安装教程你可以查看:

    http://www.cwi.nl/~jack/macpython.html

    环境变量配置

    程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中。

    path(路径)存储在环境变量中,这是由操作系统维护的一个命名的字符串。这些变量包含可用的命令行解释器和其他程序的信息。

    Unix 或 Windows 中路径变量为 ​PATH​(UNIX 区分大小写,Windows 不区分大小写)。

    在 Mac OS 中,安装程序过程中改变了 Python 的安装路径。如果你需要在其他目录引用Python,你必须在 ​path ​中添加 Python 目录。

    在 Unix/Linux 设置环境变量

    • 在 csh shell: 输入
      setenv PATH "$PATH:/usr/local/bin/python"
      , 按下"Enter"。
    • 在 bash shell (Linux): 输入
      export PATH="$PATH:/usr/local/bin/python" 
      ,按下"Enter"。
    • 在 sh 或者 ksh shell: 输入
      PATH="$PATH:/usr/local/bin/python" 
      , 按下"Enter"。

    注意: /usr/local/bin/python​ 是 Python 的安装目录。

    在 Windows 设置环境变量

    在环境变量中添加 Python 目录:

    path=%path%;C:Python 
    按下"Enter"。

    注意: ​​C:Python​ ​是 Python 的安装目录。

    也可以通过以下方式设置:

    • 右键点击"计算机",然后点击"属性"
    • 然后点击"高级系统设置"
    • 选择"系统变量"窗口下面的​Path​,双击即可!
    • 然后在​Path​行,添加 Python 安装路径即可(我的 ​D:Python32​),所以在后面,添加该路径即可。 ps:记住,路径直接用分号";"隔开!
    • 最后设置成功以后,在 cmd 命令行,输入命令​python​,就可以有相关显示。

    python



    Python 环境变量

    下面几个重要的环境变量,它应用于 Python:

    变量名描述
    ​PYTHONPATH​PYTHONPATH 是 Python 搜索路径,默认我们 import 的模块都会从 PYTHONPATH 里面寻找。
    PYTHONSTARTUPPython 启动后,先寻找 PYTHONSTARTUP 环境变量,然后执行此文件中变量指定的执行代码。
    PYTHONCASEOK加入 PYTHONCASEOK 的环境变量, 就会使 Python 导入模块的时候不区分大小写.
    PYTHONHOME 另一种模块搜索路径。它通常内嵌于的 PYTHONSTARTUP 或 PYTHONPATH 目录中,使得两个模块库更容易切换。


    运行Python

    有三种方式可以运行 Python:

    1、交互式解释器:

    你可以通过命令行窗口进入 Python 并在交互式解释器中开始编写 Python 代码。

    你可以在 Unix,DOS 或任何其他提供了命令行或者 shell 的系统进行 Python 编码工作。

    $python # Unix/Linux
    或者
    python% # Unix/Linux
    或者
    C:>python # Windows/DOS

    以下为 Python 命令行参数:

    选项描述
    -d在解析时显示调试信息
    -O生成优化代码 ( .pyo 文件 )
    -S启动时不引入查找 Python 路径的位置
    -v输出 Python 版本号
    -X从 1.6 版本之后基于内建的异常(仅仅用于字符串)已过时。
    -c cmd执行 Python 脚本,并将运行结果作为 cmd 字符串。
    file在给定的 Python文件执行  Python 脚本。

    2、命令行脚本

    在你的应用程序中通过引入解释器可以在命令行中执行 Python 脚本,如下所示:

    $python script.py # Unix/Linux
    或者
    python% script.py # Unix/Linux
    或者
    C:>python script.py # Windows/DOS

    注意:在执行脚本时,请检查脚本是否有可执行权限。

    3、集成开发环境(IDE:Integrated Development Environment)

    您可以使用图形用户界面(GUI)环境来编写及运行 Python 代码。以下推荐各个平台上使用的 IDE:

    • Unix: IDLE 是 UNIX 上最早的 Python IDE 。
    • Windows: PythonWin 是一个 Python 集成开发环境,在许多方面都比 IDLE 优秀
    • Macintosh: Python 的 Mac 可以使用 IDLE IDE,你可以在网站上下载对应 MAC 的 IDLE 。

    继续下一章之前,请确保您的环境已搭建成功。如果你不能够建立正确的环境,那么你就可以从您的系统管理员的帮助。

    在以后的章节中给出的例子已在 Centos(Linux)下 Python2.7.13 版本测试通过。


    在 Cloud Studio 中运行 Python 程序

     Python 是跨平台的,它可以运行在 Windows、Mac 和各种 Linux/Unix 系统上。在 Windows 上写 Python 程序,放到 Linux 上也是能够运行的。要开始学习 Python 编程,首先就得把 Python 安装到你的电脑里。安装后,你会得到 Python 解释器(就是负责运行 Python 程序的),一个命令行交互环境,还有一个简单的集成开发环境。

    您也可以使用 Coding Cloud Studio 这款在线云端开发工具。它提供了原生的在线 Linux 命令交互终端环境,Python 运行解释器,在线开发文本编辑器,你可以直接在工作站中创建 Python 文件并在 Cloud Studio 中运行你写的 Python 程序。然后你可以略过本节余下的安装 Python 运行环境以及集成开发环境等部分。

    Python 环境搭建

    如果遇到问题,您可以查看 Coding帮助文档


    Python 中文编码

    前面章节中我们已经学会了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题。

    Python 文件中如果未指定编码,在执行过程会出现报错:

    #!/usr/bin/pythonprint "你好,世界";

    以上程序执行输出结果为:

      File "test.py", line 2SyntaxError: Non-ASCII character 'xe4' in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

    以上出错信息显示了我们为指定编码,解决方法为只要在文件开头加入​ # -*- coding: UTF-8 -*- ​或者 ​#coding=utf-8​ 就行了。

    #!/usr/bin/python# -*- coding: UTF-8 -*-print "你好,世界";

    输出结果为:

    你好,世界

    所以如果大家在学习过程中,代码中包含中文,就需要在头部指定编码。

    注意:Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

    注意:如果你使用编辑器,同时需要设置好编辑器的编码,如 Pycharm 设置步骤:

    • 进入 file > Settings,在输入框搜索 encoding
    • 找到 Editor > File encodings,将 IDE Encoding 和 Project Encoding 设置为utf-8。

    Python 中文编码



    Python 基础语法

    Python 语言与 Perl,C 和 Java 等语言有许多相似之处。但是,也存在一些差异。

    在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程。


    用一张图概况 Python 学习



    第一个 Python程序

    交互式编程

    交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。

    linux 上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下:

    $ pythonPython 2.4.3 (#1, Nov 11 2010, 13:34:43)[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>

    Window 上在安装 Python 时已经安装了默认的交互式编程客户端,提示窗口如下:

    python27

    在 Python 提示符中输入以下文本信息,然后按 Enter 键查看运行效果:

    >>> print "Hello, Python!";

    在 Python 2.7.13 版本中,以上事例输出结果如下:

    Hello, Python!

    如果您运行的是新版本的 Python,那么你就需要在 print 语句中使用括号如:

    >>>  print ("Hello, Python!");

    脚本式编程

    通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕。当脚本执行完成后,解释器不再有效。

    让我们写一个简单的 Python 脚本程序。所有 Python 文件将以 .py 为扩展名。将以下的源代码拷贝至 test.py 文件中。

    print "Hello, Python!";

    这里,假设你已经设置了 Python 解释器 PATH 变量。使用以下命令运行程序:

    $ python test.py

    输出结果:

    Hello, Python!

    让我们尝试另一种方式来执行 Python 脚本。修改 test.py 文件,如下所示:

    #!/usr/bin/pythonprint "Hello, Python!";

    这里,假定您的 Python 解释器在 /usr/bin 目录中,使用以下命令执行脚本:

    $ chmod +x test.py     # 脚本文件添加可执行权限$./test.py

    输出结果:

    Hello, Python!

    Python2.x 中使用 Python3.x 的 print 函数

    如果 Python2.x 版本想使用使用 Python3.x 的 print 函数,可以导入 __future__ 包,该包禁用 Python2.x 的 print 语句,采用 Python3.x 的 print 函数:

    python2方式打印:
    #coding=utf-8list =["a", "b", "c"]print list    # python2.x 的 print 语句
    导入 __future__ 包后使用python2方式打印: 
    #coding=utf-8from __future__ import print_function  # 导入 __future__ 包list =["a", "b", "c"]print list    # python2.x 的 print 语句
    会报错:

     File "<stdin>", line 1

    print list

             ^

    SyntaxError: invalid syntax

    原因是因为python3的print与python2的不同,python3的print应该使用如下方式:

    #coding=utf-8from __future__ import print_function  # 导入 __future__ 包list =["a", "b", "c"]print (list)    # python2.x 的 print 语句

    Python标识符

    在 Python 里,标识符由字母、数字、下划线组成。

    在 Python 中,所有标识符可以包括字母、数字以及下划线(_),但不能以数字开头。

    Python 中的标识符是区分大小写的。

    以下划线开头的标识符是有特殊意义的。以单下划线开头(​_foo​)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用"​from xxx import *​"而导入;

    以双下划线开头的(​__foo​)代表类的私有成员;以双下划线开头和结尾的(​__foo__​)代表python 里特殊方法专用的标识,如​__init__()​代表类的构造函数。

    Python 可以同一行显示多条语句,方法是用分号 ; 分开,如:

    >>> print 'hello';print 'Python';helloPython
    但这并不是一种好的编程习惯,这样的代码是比较难以阅读的,而且python以缩进区分代码块,以换行代表语句结束,使用分号来进行强制的语句结束是不合理的。

    Python 保留字符

    下面的列表显示了在 Python 中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名称。

    所有 Python 的关键字只包含小写字母。

    andexecnot
    assertfinallyor
    breakforpass
    classfromprint
    continueglobalraise
    defifreturn
    delimporttry
    elifinwhile
    elseiswith
    exceptlambdayield

    行和缩进

    学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号({})包裹,而是以缩进来区分代码块。常见的代码块出现在函数、循环以及逻辑判断等地方。Python 最具特色的就是用缩进来写代码块。

    缩进的空白数量是可变的,但是所有同一级别的代码块语句必须包含相同的缩进空白数量,这个必须严格执行。如下所示:

    if True:    print "True"else:  print "False"

    以下代码将会执行错误(if前面有一个空格):

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py if True:    print "Answer"    print "True"else:    print "Answer"    # 没有严格缩进,在执行时报错  print "False"

    执行以上代码,会出现如下错误提醒:

    $ python test.py    File "test.py", line 5    if True:    ^IndentationError: unexpected indent

    IndentationError: unexpected indent​ 错误是 Python 编译器是在告诉你"Hi,老兄,你的文件里格式不对了,可能是 tab 和空格没对齐的问题",所有 Python 对格式要求非常严格。

     python的的最外层代码不能带有空格或缩进!!!

    如果是 ​IndentationError: unindent does not match any outer indentation level错误表明,你使用的缩进方式不一致,有的是 tab 键缩进,有的是空格缩进,改为一致即可。

    因此,在 Python 的代码块中必须使用相同数目的行首缩进空格数。

    建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用。

     在PEP8中规定了python一次缩进最好是四格。另外,有些代码编辑器会帮助你进行代码对齐,因为就如上述的代码展示一样,有时候多打了一个空格实际上也不是很明显。

    最后,虽然并没有强制规定没每一级的代码块缩进的空格数一定要固定四格,就像第一个缩进示例一样。但是这样的缩进会破坏整体代码的美观,影响代码的阅读。



    多行语句

    Python 语句中一般以换行作为语句的结束符。

    但是我们可以使用斜杠( ​​)将一行的语句分为多行显示,如下所示:

    total = item_one +          item_two +         item_three  

    语句中包含​[]​,​ {} ​或 ​()​ 括号就不需要使用多行连接符。如下实例:

    days = ['Monday', 'Tuesday', 'Wednesday',        'Thursday', 'Friday']

    Python 引号

    Python 使用单引号(​' ​),双引号(​" ​),三引号(​''' """​) 来表示字符串,引号的开始与结束必须是相同类型的。

    其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,一般用在代码文件的特定地点,被当做多行注释使用。

    #coding=utf-8word = 'word'sentence = "这是一个句子"paragraph = """这是一个段落包含了多个语句"""

    Python注释

    Python中单行注释采用 ​​开头。

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py# 第一个注释print "Hello, Python!";  # 第二个注释

    输出结果:

    Hello, Python!

    注释可以在语句或表达式行末:

    name = "Madisetti" # 这是一个注释

    Python 中多行注释使用三个单引号(​'''​)或三个双引号(​"""​)。

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:test.py'''这是多行注释,使用单引号。这是多行注释,使用单引号。这是多行注释,使用单引号。'''"""这是多行注释,使用双引号。这是多行注释,使用双引号。这是多行注释,使用双引号。"""

    Python 空行

    函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

    空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

    记住:空行也是程序代码的一部分。

     在PEP8中规定,函数块之间需要空两行。


    等待用户输入

    下面的程序执行后就会等待用户输入,按回车键后就会退出:

    #!/usr/bin/python# -*- coding: UTF-8 -*-raw_input("按下 enter 键退出,其他任意键显示...
    ")#本代码在在线工具展现效果不佳,建议使用自己的python环境

    以上代码中 ,​ ​ 实现换行。一旦用户按下 enter(回车) 键退出,其它键显示。


    同一行显示多条语句

    #!/usr/bin/pythonimport sys; x = '51coolma'; sys.stdout.write(x + '
    ')

    执行以上代码,输入结果为:

    $ python test.py51coolma
    不推荐使用这样的代码书写方式

    Print 输出

    print ​默认输出是换行的,如果要实现不换行需要在变量末尾加上逗号 ,

    #!/usr/bin/python# -*- coding: UTF-8 -*-x="a"y="b"# 换行输出print xprint yprint '---------'# 不换行输出print x,print y,# 不换行输出print x,y

    以上实例执行结果如下:

    ab---------a b a b

    多个语句构成代码组

    缩进相同的一组语句构成一个代码块,我们称之代码组。

    像 ​if​、​while​、​def ​和 ​class​ 这样的复合语句,首行以关键字开始,以冒号(​ :​ )结束,该行之后的一行或多行代码构成代码组。

    我们将首行及后面的代码组称为一个子句(clause)。

    如下实例:

    if expression :    suite elif expression :     suite  else :     suite 

    命令行参数

    很多程序可以执行一些操作来查看一些基本信息,Python 可以使用 -h 参数查看各参数帮助信息:

    $ python -h usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): -c cmd : program passed in as string (terminates option list) -d     : debug output from parser (also PYTHONDEBUG=x) -E     : ignore environment variables (such as PYTHONPATH) -h     : print this help message and exit  [ etc. ] 

    我们在使用脚本形式执行 Python 时,可以接收命令行输入的参数,具体使用可以参照  Python 命令行参数


    Python 变量类型

    变量是存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。

    基于变量的数据类型,解释器会分配指定大小的内存,并决定什么数据可以被存储在内存中。

    因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。


    变量赋值

    Python 中的变量不需要声明,变量的赋值操作既是变量声明的过程也是变量定义的过程。

    每个变量都在内存中创建,包括变量的标识,名称和数据这些信息。

    每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

    等号(=)用来给变量赋值。

    等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

    #coding=utf-8#!/usr/bin/python counter = 100 # 赋值整型变量miles = 1000.0 # 浮点型name = "John" # 字符串 print counterprint milesprint name

    以上实例中,100,1000.0 和"John"分别赋值给 counter,miles,name 变量。

    执行以上程序会输出如下结果:

     100 1000.0 John

    多个变量赋值

    Python 允许你同时为多个变量赋值。例如:

     a = b = c = 1

    以上实例,创建一个整型对象,值为 1,三个变量被分配到相同的内存空间上。

    您也可以为多个对象指定多个变量。例如:

    a, b, c = 1, 2, "john" 

    以上实例,两个整型对象1和2的分配给变量a和b,字符串对象"john"分配给变量 c。


    标准数据类型

    在内存中存储的数据可以有多种类型。

    例如,年龄作为一个数值存储,地址是字符存储。

    Python 有一些标准类型用于定义操作上,他们定义了相应数据类型的存储方法。

    Python 有五个标准的数据类型:

    • Numbers(数字)
    • String(字符串)
    • List(列表)
    • Tuple(元组)
    • Dictionary(字典)

    Python 数字

    数字数据类型用于存储数值。

    他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。

    当你指定一个值时,Number 对象就会被创建:

    var1 = 1var2 = 10 

    您也可以使用 ​del ​语句删除一些对象引用。

    del ​语句的语法是:

     del var1[,var2[,var3[....,varN]]]] 

    您可以通过使用 ​del​ 语句删除单个或多个对象。例如:

     del var del var_a, var_b 

    Python 支持四种不同的数值类型:

    • int(有符号整型)
    • long(长整型[也可以代表八进制和十六进制])
    • float(浮点型)
    • complex(复数)
    实例

    一些数值类型的实例:

    intlongfloatcomplex
    1051924361L0.03.14j
    100-0x19323L15.2045.j
    -7860122L-21.99.322e-36j
    0800xDEFABCECBDAECBFBAEl32.3+e18.876j
    -0490535633629843L-90.-.6545+0J
    -0x260-052318172735L-32.54e1003e+26J
    0x69-4721885298529L70.2-E124.53e-7j
    • 长整型也可以使用小写"l",但是还是建议您使用大写"L",避免与数字"1"混淆。Python 使用"L"来显示长整型。
    • Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj ,或者complex(a,b)表示, 复数的实部 a 和虚部 b 都是浮点型

    Python 字符串

    字符串或串 (String) 是由数字、字母、下划线组成的一串字符。

    一般记为 :

    s="a1a2···an"(n>=0)

    它是编程语言中表示文本的数据类型。

    python 的字串列表有 2 种取值顺序:

    • 从左到右索引默认 0 开始的,最大范围是字符串长度少 1
    • 从右到左索引默认 -1 开始的,最大范围是字符串开头

    如果你的实要取得一段子串的话,可以用到​变量[头下标:尾下标]​,就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

    比如:

     s = 'ilovepython' 

    s[1:5] 的结果是 love。

    当使用以冒号分隔的字符串,Python 返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。

    上面的结果包含了 s[1] 的值 l,而取到的最大范围不包括上边界,就是 s[5 ]的值 p。

    加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:

    #coding=utf-8#!/usr/bin/pythonstr = 'Hello World!' print str # 输出完整字符串print str[0] # 输出字符串中的第一个字符print str[2:5] # 输出字符串中第三个至第五个之间的字符串print str[2:] # 输出从第三个字符开始的字符串print str * 2 # 输出字符串两次print str + "TEST" # 输出连接的字符串 

    以上实例输出结果:

     Hello World! H llo llo World! Hello World!Hello World! Hello World!TEST

    Python 列表

    List(列表) 是 Python 中使用最频繁的数据类型。

    列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(也就是嵌套)。

    列表用​[ ]​标识。是 Python 最通用的复合数据类型。看这段代码就明白。

    列表中的值得分割也可以用到​变量[头下标:尾下标]​,就可以截取相应的列表,从左到右索引默认 0 开始的,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。

    加号(+)是列表连接运算符,星号(*)是重复操作。如下实例:

    #coding=utf-8#!/usr/bin/python list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john'] print list # 输出完整列表print list[0] # 输出列表的第一个元素print list[1:3] # 输出第二个至第三个的元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素print tinylist * 2 # 输出列表两次print list + tinylist # 打印组合的列表

    以上实例输出结果:

     ['abcd', 786, 2.23, 'john', 70.2] abcd [786, 2.23] [2.23, 'john', 70.2] [123, 'john', 123, 'john'] ['abcd', 786, 2.23, 'john', 70.2, 123, 'john']

    Python 元组

    元组是另一个数据类型,类似于 List(列表)。

    元组用"()"标识。内部元素用逗号隔开。但是元素不能二次赋值,相当于只读列表。

    #coding=utf-8#!/usr/bin/python tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )tinytuple = (123, 'john') print tuple # 输出完整元组print tuple[0] # 输出元组的第一个元素print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素print tinytuple * 2 # 输出元组两次print tuple + tinytuple # 打印组合的元组

    以上实例输出结果:

     ('abcd', 786, 2.23, 'john', 70.2) abcd (786, 2.23) (2.23, 'john', 70.2) (123, 'john', 123, 'john') ('abcd', 786, 2.23, 'john', 70.2, 123, 'john')

    以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:

    #!/usr/bin/python# -*- coding: UTF-8 -*- tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]tuple[2] = 1000    # 元组中是非法应用list[2] = 1000     # 列表中是合法应用

    会报错:​TypeError: 'tuple' object does not support item assignment


    Python 字典

    字典 (dictionary) 是除列表以外 Python 之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。

    两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

    字典用"{ }"标识。字典由索引 (key) 和它对应的值 value 组成。

    #coding=utf-8#!/usr/bin/python dict = {}dict['one'] = "This is one"dict[2] = "This is two"tinydict = {'name': 'john','code':6734, 'dept': 'sales'}  print dict['one'] # 输出键为'one' 的值print dict[2] # 输出键为 2 的值print tinydict # 输出完整的字典print tinydict.keys() # 输出所有键print tinydict.values() # 输出所有值

    输出结果为:

    This is oneThis is two{'dept': 'sales', 'code': 6734, 'name': 'john'}['dept', 'code', 'name']['sales', 6734, 'john']

    Python 数据类型转换

    有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

    以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。

    函数描述

    int(x [,base])

    将 x 转换为一个整数

    long(x [,base] )

    将 x 转换为一个长整数

    float(x)

    将 x 转换到一个浮点数

    complex(real [,imag])

    创建一个复数

    str(x)

    将对象 x 转换为字符串

    repr(x)

    将对象 x 转换为表达式字符串

    eval(str)

    用来计算在字符串中的有效 Python 表达式,并返回一个对象

    tuple(s)

    将序列 s 转换为一个元组

    list(s)

    将序列 s 转换为一个列表

    set(s)

    转换为可变集合

    dict(d)

    创建一个字典。d 必须是一个序列  (key,value) 元组。

    frozenset(s)

    转换为不可变集合

    chr(x)

    将一个整数转换为一个字符

    unichr(x)

    将一个整数转换为 Unicode 字符

    ord(x)

    将一个字符转换为它的整数值

    hex(x)

    将一个整数转换为一个十六进制字符串

    oct(x)

    将一个整数转换为一个八进制字符串


    Python 运算符


    什么是运算符?

    本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子中,4和5被称为操作数,"+"号为运算符。

    Python语言支持以下类型的运算符:

    接下来让我们一个个来学习Python的运算符。


    Python算术运算符

    以下假设变量a为10,变量b为20:

    运算符描述实例
    +加 - 两个对象相加a + b 输出结果 30
    -减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10
    *乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200
    /除 - x除以yb / a 输出结果 2
    %取模 - 返回除法的余数b % a 输出结果 0
    **幂 - 返回x的y次幂a**b 为10的20次方, 输出结果 100000000000000000000
    //取整除 - 返回商的整数部分9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

    以下实例演示了Python所有算术运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0c = a + bprint "1 - c 的值为:", cc = a - bprint "2 - c 的值为:", c c = a * bprint "3 - c 的值为:", c c = a / bprint "4 - c 的值为:", c c = a % bprint "5 - c 的值为:", c# 修改变量 a 、b 、ca = 2b = 3c = a**b print "6 - c 的值为:", ca = 10b = 5c = a//b print "7 - c 的值为:", c

    以上实例输出结果:

    1 - c 的值为: 31

    2 - c 的值为: 11

    3 - c 的值为: 210

    4 - c 的值为: 2

    5 - c 的值为: 1

    6 - c 的值为: 8

    7 - c 的值为: 2

    注意:Python2.x 里,整数除整数,只能得出整数。如果要得到小数部分,把其中一个数改成浮点数即可。

    >>> 1/20>>> 1.0/20.5>>> 1/float(2)0.5

    Python比较运算符

    以下假设变量a为10,变量b为20:

    运算符描述实例
    ==等于 - 比较对象是否相等(a == b) 返回 False。
    !=不等于 - 比较两个对象是否不相等(a != b) 返回 true.
    <>不等于 - 比较两个对象是否不相等(a <> b) 返回 true。这个运算符类似 != 。
    >大于 - 返回x是否大于y(a > b) 返回 False。
    <小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。(a < b) 返回 true。
    >=大于等于 - 返回x是否大于等于y。(a >= b) 返回 False。
    <=小于等于 - 返回x是否小于等于y。(a <= b) 返回 true。

    以下实例演示了Python所有比较运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0if ( a == b ):   print "1 - a 等于 b"else:   print "1 - a 不等于 b"if ( a != b ):   print "2 - a 不等于 b"else:   print "2 - a 等于 b"if ( a <> b ):   print "3 - a 不等于 b"else:   print "3 - a 等于 b"if ( a < b ):   print "4 - a 小于 b" else:   print "4 - a 大于等于 b"if ( a > b ):   print "5 - a 大于 b"else:   print "5 - a 小于等于 b"# 修改变量 a 和 b 的值a = 5;b = 20;if ( a <= b ):   print "6 - a 小于等于 b"else:   print "6 - a 大于  b"if ( b >= a ):   print "7 - b 大于等于 a"else:   print "7 - b 小于 a"

    以上实例输出结果:

    1 - a 不等于 b

    2 - a 不等于 b

    3 - a 不等于 b

    4 - a 大于等于 b

    5 - a 大于 b

    6 - a 小于等于 b

    7 - b 大于等于 a

    Python赋值运算符

    以下假设变量a为10,变量b为20:

    运算符描述实例
    =简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
    +=加法赋值运算符c += a 等效于 c = c + a
    -=减法赋值运算符c -= a 等效于 c = c - a
    *=乘法赋值运算符c *= a 等效于 c = c * a
    /=除法赋值运算符c /= a 等效于 c = c / a
    %=取模赋值运算符c %= a 等效于 c = c % a
    **=幂赋值运算符c **= a 等效于 c = c ** a
    //=取整除赋值运算符c //= a 等效于 c = c // a

    以下实例演示了Python所有赋值运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 21b = 10c = 0c = a + bprint "1 - c 的值为:", cc += aprint "2 - c 的值为:", c c *= aprint "3 - c 的值为:", c c /= a print "4 - c 的值为:", c c = 2c %= aprint "5 - c 的值为:", cc **= aprint "6 - c 的值为:", cc //= aprint "7 - c 的值为:", c

    以上实例输出结果:

     1 - c 的值为: 31

    2 - c 的值为: 52

    3 - c 的值为: 1092

    4 - c 的值为: 52

    5 - c 的值为: 2

    6 - c 的值为: 2097152

    7 - c 的值为: 99864

    Python位运算符

    按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

    运算符描述实例
    &按位与运算符(a & b) 输出结果 12 ,二进制解释: 0000 1100
    |按位或运算符(a | b) 输出结果 61 ,二进制解释: 0011 1101
    ^按位异或运算符(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
    ~按位取反运算符(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
    <<左移动运算符a << 2 输出结果 240 ,二进制解释: 1111 0000
    >>右移动运算符a >> 2 输出结果 15 ,二进制解释: 0000 1111

    以下实例演示了Python所有位运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 60            # 60 = 0011 1100 b = 13            # 13 = 0000 1101 c = 0c = a & b;        # 12 = 0000 1100print "1 - c 的值为:", cc = a | b;        # 61 = 0011 1101 print "2 - c 的值为:", cc = a ^ b;        # 49 = 0011 0001print "3 - c 的值为:", cc = ~a;           # -61 = 1100 0011print "4 - c 的值为:", cc = a << 2;       # 240 = 1111 0000print "5 - c 的值为:", cc = a >> 2;       # 15 = 0000 1111print "6 - c 的值为:", c

    以上实例输出结果:

    1 - c 的值为: 12

    2 - c 的值为: 61

    3 - c 的值为: 49

    4 - c 的值为: -61

    5 - c 的值为: 240

    6 - c 的值为: 15


    Python逻辑运算符

    Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

    运算符逻辑表达式描述实例
    andx and y布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。(a and b) 返回 20。
    orx or y布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。
    notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

    以上实例输出结果:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 10b = 20if ( a and b ):   print "1 - 变量 a 和 b 都为 true"else:   print "1 - 变量 a 和 b 有一个不为 true"if ( a or b ):   print "2 - 变量 a 和 b 都为 true,或其中一个变量为 true"else:   print "2 - 变量 a 和 b 都不为 true"# 修改变量 a 的值a = 0if ( a and b ):   print "3 - 变量 a 和 b 都为 true"else:   print "3 - 变量 a 和 b 有一个不为 true"if ( a or b ):   print "4 - 变量 a 和 b 都为 true,或其中一个变量为 true"else:   print "4 - 变量 a 和 b 都不为 true"if not( a and b ):   print "5 - 变量 a 和 b 都为 false,或其中一个变量为 false"else:   print "5 - 变量 a 和 b 都为 true"

    以上实例输出结果:

     1 - 变量 a 和 b 都为 true

    2 - 变量 a 和 b 都为 true,或其中一个变量为 true

    3 - 变量 a 和 b 有一个不为 true

    4 - 变量 a 和 b 都为 true,或其中一个变量为 true

    5 - 变量 a 和 b 都为 false,或其中一个变量为 false


    Python成员运算符

    除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

    运算符描述实例
    in如果在指定的序列中找到值返回True,否则返回False。x 在 y序列中 , 如果x在y序列中返回True。
    not in如果在指定的序列中没有找到值返回True,否则返回False。x 不在 y序列中 , 如果x不在y序列中返回True。

    以下实例演示了Python所有成员运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 10b = 20list = [1, 2, 3, 4, 5 ];if ( a in list ):   print "1 - 变量 a 在给定的列表中 list 中"else:   print "1 - 变量 a 不在给定的列表中 list 中"if ( b not in list ):   print "2 - 变量 b 不在给定的列表中 list 中"else:   print "2 - 变量 b 在给定的列表中 list 中"# 修改变量 a 的值a = 2if ( a in list ):   print "3 - 变量 a 在给定的列表中 list 中"else:   print "3 - 变量 a 不在给定的列表中 list 中"

    以上实例输出结果:

    1 - 变量 a 不在给定的列表中 list 中

    2 - 变量 b 不在给定的列表中 list 中

    3 - 变量 a 在给定的列表中 list 中


    Python身份运算符

    身份运算符用于比较两个对象的存储单元

    运算符描述实例
    isis是判断两个标识符是不是引用自一个对象x is y, 如果 id(x) 等于 id(y) , is 返回结果 1
    is notis not是判断两个标识符是不是引用自不同对象x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1

    以下实例演示了Python所有身份运算符的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 20b = 20if ( a is b ):   print "1 - a 和 b 有相同的标识"else:   print "1 - a 和 b 没有相同的标识"if ( id(a) == id(b) ):   print "2 - a 和 b 有相同的标识"else:   print "2 - a 和 b 没有相同的标识"# 修改变量 b 的值b = 30if ( a is b ):   print "3 - a 和 b 有相同的标识"else:   print "3 - a 和 b 没有相同的标识"if ( a is not b ):   print "4 - a 和 b 没有相同的标识"else:   print "4 - a 和 b 有相同的标识"

    以上实例输出结果:

    1 - a 和 b 有相同的标识

    2 - a 和 b 有相同的标识

    3 - a 和 b 没有相同的标识

    4 - a 和 b 没有相同的标识


    Python运算符优先级

    以下表格列出了从最高到最低优先级的所有运算符:

    运算符描述
    **指数 (最高优先级)
    ~ + -按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
    * / % //乘,除,取模和取整除
    + -加法减法
    >> <<右移,左移运算符
    &位 'AND'
    ^ |位运算符
    <= < > >=比较运算符
    <> == !=等于运算符
    = %= /= //= -= += *= **=赋值运算符
    is is not身份运算符
    in not in成员运算符
    not or and逻辑运算符

    以下实例演示了Python所有运算符优先级的操作:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = 20b = 10c = 15d = 5e = 0e = (a + b) * c / d       #( 30 * 15 ) / 5print "(a + b) * c / d 运算结果为:",  ee = ((a + b) * c) / d     # (30 * 15 ) / 5print "((a + b) * c) / d 运算结果为:",  ee = (a + b) * (c / d);    # (30) * (15/5)print "(a + b) * (c / d) 运算结果为:",  ee = a + (b * c) / d;      #  20 + (150/5)print "a + (b * c) / d 运算结果为:",  e

    ​以上实例输出结果:​

    (a + b) * c / d 运算结果为: 90

    ((a + b) * c) / d 运算结果为: 90

    (a + b) * (c / d) 运算结果为: 90

    a + (b * c) / d 运算结果为: 50


    Python 条件语句

    Python条件语句是通过一条或多条语句的执行结果(​True​或者​False​)来决定执行的代码块。

    可以通过下图来简单了解条件语句的执行过程:

    Python 条件语句

    Python程序语言指定任何非0和非空(​null​)值为​true​,0 或者 ​null​为​false​。

    Python 编程中​ if ​语句用于控制程序的执行,基本形式为:

    if 判断条件:    执行语句……else:    执行语句……

    其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。

    else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句,具体例子如下:

    # coding=utf8# 例1:if 基本用法flag = Falsename = 'luren'if name == 'python':         # 判断变量否为'python'    flag = True          # 条件成立时设置标志为真    print 'welcome boss'    # 并输出欢迎信息else:    print name              # 条件不成立时输出变量名称

    输出结果为:

    >>> luren         # 输出结果

    if ​语句的判断条件可以用​>​(大于)、​=​(大于等于)、​<=​(小于等于)来表示其关系。

    当判断条件为多个值时,可以使用以下形式:

    if 判断条件1:    执行语句1……elif 判断条件2:    执行语句2……elif 判断条件3:    执行语句3……else:    执行语句4……

    实例如下:

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 例2:elif用法 num = 5     if num == 3:            # 判断num的值    print 'boss'        elif num == 2:    print 'user'elif num == 1:    print 'worker'elif num < 0:           # 值小于零时输出    print 'error'else:    print 'roadman'     # 条件均不成立时输出

    输出结果为:

    >>> roadman     # 输出结果

    由于 python 并不支持 ​switch ​语句,所以多个条件判断,只能用 ​elif​ 来实现,如果判断需要多个条件需同时判断时,可以使用 ​or ​(或),表示两个条件有一个成立时判断条件成功;使用 ​and ​(与)时,表示只有两个条件同时成立的情况下,判断条件才成功。

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 例3:if语句多个条件num = 9if num >= 0 and num <= 10:    # 判断值是否在0~10之间    print 'hello'num = 10if num < 0 or num > 10:    # 判断值是否在小于0或大于10    print 'hello'else:    print 'undefine'num = 8# 判断值是否在0~5或者10~15之间if (num >= 0 and num <= 5) or (num >= 10 and num <= 15):        print 'hello'else:    print 'undefine'

    运行结果为:

    hello

    undefine

    undefine

    当if有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 ​and ​和 ​or ​的优先级低于​>​(大于)、​<​(小于)等判断符号,即大于和小于在没有括号的情况下会比与或要优先判断。

    简单的语句组

    你也可以在同一行的位置上使用if条件判断语句,如下实例:

    #!/usr/bin/python # -*- coding: UTF-8 -*- var = 100 if ( var  == 100 ) : print "变量 var 的值为100" print "Good bye!" 

    以上代码执行输出结果如下:

    变量 var 的值为100

    Good bye!


    Python 循环语句

    本章节将向大家介绍 Python 的循环语句,程序在一般情况下是按顺序执行的。

    编程语言提供了各种控制结构,允许更复杂的执行路径。

    循环语句允许我们执行一个语句或语句组多次,下面是在大多数编程语言中的循环语句的一般形式:

    loop_architecture

    Python 提供了 ​for ​循环和 ​while ​循环(在 Python 中没有 do..while 循环):

    循环类型描述
    while 循环在给定的判断条件为 True 时执行循环体,否则退出循环体。
    for 循环重复执行语句
    嵌套循环你可以在 while 循环体中嵌套 for 循环


    循环控制语句

    循环控制语句可以更改语句执行的顺序。Python 支持以下循环控制语句:

    控制语句描述
    break 语句在语句块执行过程中终止循环,并且跳出整个循环
    continue 语句在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。
    pass 语句pass 是空语句,是为了保持程序结构的完整性。


    Python 编程中 ​while​ 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:

    while 判断条件(condition):    执行语句(statements)……

    执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(​null​)的值均为​True​。

    当判断条件为假 ​False ​时,循环结束。

    执行流程图如下:


    Gif 演示 Python while 语句执行过程



    实例

    #!/usr/bin/pythoncount = 0while count < 9:    print 'The count is:', count    count = count + 1print "Good bye!"

    以上代码执行输出结果:

    The count is: 0

    The count is: 1

    The count is: 2

    The count is: 3

    The count is: 4

    The count is: 5

    The count is: 6

    The count is: 7

    The count is: 8

    Good bye!

    while ​语句时还有另外两个重要的命令 ​continue​,​break ​来跳过循环,​continue​ 用于跳过该次循环,​break ​则是用于退出循环,此外"判断条件"还可以是个常量,表示循环必定成立,具体用法如下:

    # coding=utf-8#continue 和 break 用法 i = 1while i < 10:       i += 1    if i%2 > 0:     # 非双数时跳过输出        continue    print i         # 输出双数2、4、6、8、10 i = 1while 1:            # 循环条件为1必定成立    print i         # 输出1~10    i += 1    if i > 10:     # 当i大于10时跳出循环        break

    运行结果为:

    2

    4

    6

    8

    10

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10


    无限循环

    如果条件判断语句永远为 ​True​,循环将会无限的执行下去,如下实例:

    实例

    #!/usr/bin/python# -*- coding: UTF-8 -*- var = 1while var == 1:  # 该条件永远为true,循环将无限执行下去   num = raw_input("Enter a number  :")   print "You entered: ", num print "Good bye!"#该代码在在线代码测试展现效果不好,建议在本地环境运行

    以上实例输出结果:

    Enter a number  :20

    You entered:  20

    Enter a number  :29

    You entered:  29

    Enter a number  :3

    You entered:  3

    Enter a number between :Traceback (most recent call last):

      File "test.py", line 5, in <module>

        num = raw_input("Enter a number :")

    KeyboardInterrupt

    注意:以上的无限循环你可以使用 CTRL+C 来中断循环。


    循环使用 else 语句

    在 Python 中,​while … els​e 在循环条件为 ​False ​时执行 ​else ​语句块:

    实例

    #!/usr/bin/python count = 0while count < 5:   print count, " is  less than 5"   count = count + 1else:   print count, " is not less than 5"

    以上实例输出结果为:

     0 is less than 5

    1 is less than 5

    2 is less than 5

    3 is less than 5

    4 is less than 5

    5 is not less than 5


    简单语句组

    类似 ​if ​语句的语法,如果你的 ​while ​循环体中只有一条语句,你可以将该语句与 ​while ​写在同一行中, 如下所示:

    实例

    #!/usr/bin/python flag = 1 while (flag): print 'Given flag is really true!' print "Good bye!"

    "注意:以上的无限循环你可以使用 CTRL+C 来中断循环。


    应用实例

    Pyhton 去除字符串首尾的空格:

    # coding=utf-8#一个简单的使用while去除字符串前后空格的代码str = '   W3cschool     '#打印没有处理前的字符串print str#使用循环除去字符串前的空格while str[:1] == ' ':    str = str[1:]#使用循环除去字符串后的空格while str[-1:] == ' ':    str = str[:-1]#打印处理后的结果print str


    Python for 循环语句

    Python ​for ​循环可以遍历任何序列的项目,如一个列表或者一个字符串。

    语法:

    for ​循环的语法格式如下:

    for iterating_var in sequence:    statements(s)

    流程图:

    Python 循环嵌套

    Python 语言允许在一个循环体里面嵌入另一个循环。

    Python for 循环嵌套语法:

    for iterating_var in sequence:   for iterating_var in sequence:      statements(s)   statements(s)

    Python while 循环嵌套语法:

    while expression:   while expression:      statement(s)   statement(s)

    你可以在循环体内嵌入其他的循环体,如在 ​while ​循环中可以嵌入 ​for​ 循环, 同样的,你也可以在 ​for​ 循环中嵌入 while 循环。

    实例:

    以下实例使用了嵌套循环输出 2~100 之间的素数:

    #!/usr/bin/python# -*- coding: UTF-8 -*-i = 2while(i < 100):   j = 2   while(j <= (i/j)):      if not(i%j): break      j = j + 1   if (j > i/j) :       print "{} 是素数".format(i)   i = i + 1print "Good bye!"

    以上实例输出结果:

    2 是素数

    3 是素数

    5 是素数

    7 是素数

    11 是素数

    13 是素数

    17 是素数

    19 是素数

    23 是素数

    29 是素数

    31 是素数

    37 是素数

    41 是素数

    43 是素数

    47 是素数

    53 是素数

    59 是素数

    61 是素数

    67 是素数

    71 是素数

    73 是素数

    79 是素数

    83 是素数

    89 是素数

    97 是素数

    Good bye!


    更多实例

    实例一:使用循环嵌套来获取 100 以内的质数

    #!/usr/bin/python# -*- coding: UTF-8 -*-num=[];i=2for i in range(2,100):   j=2   for j in range(2,i):      if(i%j==0):         break   else:      num.append(i)print num

    运行结果:

     [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

    实例二:使用嵌套循环实现*字塔的实现

    #!/usr/bin/python# -*- coding: UTF-8 -*-#*字塔i=1#j=1while i<=9:   if i<=5:      print "*"*i   elif i<=9 :      j=i-2*(i-5)      print "*"*j    i+=1else :   print ""

    运行结果:

    *

    **

    ***

    ****

    *****

    ****

    ***

    **

    *


    Python break 语句

    Python 的​break ​语句,与C语言类似,可以用来跳出 ​for ​或 ​while ​循环。

    break ​语句用来终止循环语句,即循环条件没有 False 条件或者序列还没被完全递归完,也会停止执行循环语句。

    break ​语句用在 ​while ​和 ​for ​循环中。

    如果您使用嵌套循环,​break​ 语句将停止执行最深层的循环,并开始执行下一行代码。

    Python语言 break 语句语法:

    break

    流程图:

    cpp_break_statement

    实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*- for letter in 'Python':     # 第一个实例   if letter == 'h':      break   print '当期字母 :', letter  var = 10                    # 第二个实例while var > 0:                 print '当期变量值 :', var   var = var -1   if var == 5:   # 当变量 var 等于 5 时退出循环      break print "Good bye!"

    以上实例执行结果:

     当期字母 : P

    当期字母 : y

    当期字母 : t

    当期变量值 : 10

    当期变量值 : 9

    当期变量值 : 8

    当期变量值 : 7

    当期变量值 : 6

    Good bye!


    Python continue 语句

    Python ​continue ​语句跳出本次循环,而 ​break ​跳出整个循环。

    continue ​语句用来告诉 Python 跳过当前循环的剩余语句,然后继续进行下一轮循环。

    continue ​语句用在 ​while ​和 ​for​循环中。

     continue和break都是作用在其代码块的(也就是跟他缩进相同的代码块),而且遇到它们后在对应语句后的代码都不执行。不同的是,continue只跳过单次循环,而break结束这个循环。

    举个例子,有一个循环十次的循环,其中有个条件判定,当执行到第五次的时候执行​break​或者​continue​语句。如果是执行​continue​语句,当执行到第五次的时候结束这次循环进入第六次循环,也就是所这个循环执行了9次。如果执行的是​break​语句的话,当执行到第五次循环的时候结束这次循环(也就是说不再继续循环了),结果是这个循环循环了5次。

    Python 语言 continue 语句语法格式如下:

    continue

    流程图:

    cpp_continue_statement

    实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*-for letter in 'Python':     # 第一个实例   if letter == 'h':      continue   print '当前字母 :', lettervar = 10                    # 第二个实例while var > 0:                 var = var -1   if var == 5:      continue   print '当前变量值 :', varprint "Good bye!"

    以上实例执行结果:

    当前字母 : P

    当前字母 : y

    当前字母 : t

    当前字母 : o

    当前字母 : n

    当前变量值 : 9

    当前变量值 : 8

    当前变量值 : 7

    当前变量值 : 6

    当前变量值 : 4

    当前变量值 : 3

    当前变量值 : 2

    当前变量值 : 1

    当前变量值 : 0

    Good bye!

    实例:

    可以使用 Python 的 ​continue ​语句跳过某些循环,只打印 0-10 之间的奇数:

    #!/usr/bin/python# -*- coding: UTF-8 -*-n = 0while n < 10:    n = n + 1    if n % 2 == 0:      # 如果n是偶数,执行continue语句        continue        # continue语句会直接继续下一轮循环,后续的print()语句不会执行    print(n)

    运行结果:

    1

    3

    5

    7

    9


    Python pass 语句

    Python ​pass ​是空语句,是为了保持程序结构的完整性。

    pass ​不做任何事情,一般用做占位语句。

    Python 语言 pass 语句语法格式如下:

    pass

    实例:

    # -*- coding: UTF-8 -*- #!/usr/bin/python# 输出 Python 的每个字母for letter in 'Python':   if letter == 'h':      pass      print '这是 pass 块'   print '当前字母 :', letterprint "Good bye!"

    以上实例执行结果:

    当前字母 : P

    当前字母 : y

    当前字母 : t

    这是 pass 块

    当前字母 : h

    当前字母 : o

    当前字母 : n

    Good bye!


    Python 数字

    Python 数字数据类型用于存储数值。

    数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。

    以下实例在变量赋值时数字对象将被创建:

    var1 = 1var2 = 10

    您也可以使用 ​del ​语句删除一些数字对象引用。

    del ​语句的语法是:

    del var1[,var2[,var3[....,varN]]]]

    您可以通过使用 del 语句删除单个或多个对象,例如:

    del vardel var_a, var_b

    Python 支持四种不同的数值类型:

    • 整型 (int) - 通常被称为是整型或整数,是正或负整数,不带小数点。
    • 长整型 (long int) - 无限大小的整数,整数最后带一个大写或小写的L。(实际上还是有范围的)
    • 浮点型( float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
    • 复数 ( complex) - 复数的虚部以字母J 或 j结尾 。如:2+3i
    intlongfloatcomplex
    1051924361L0.03.14j
    100-0x19323L15.2045.j
    -7860122L-21.99.322e-36j
    0800xDEFABCECBDAECBFBAEl32.3+e18.876j
    -0490535633629843L-90.-.6545+0J
    -0x260-052318172735L-32.54e1003e+26J
    0x69-4721885298529L70.2-E124.53e-7j
    • 长整型也可以使用小写"L",但是还是建议您使用大写"L",避免与数字"1"混淆。Python 使用"L"来显示长整型。
    • Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj, 或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型

    Python数字类型转换

    int(x [,base ])         将x转换为一个整数  long(x [,base ])        将x转换为一个长整数  float(x )               将x转换到一个浮点数  complex(real [,imag ])  创建一个复数  str(x )                 将对象 x 转换为字符串  repr(x )                将对象 x 转换为表达式字符串  eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象  tuple(s )               将序列 s 转换为一个元组  list(s )                将序列 s 转换为一个列表  chr(x )                 将一个整数转换为一个字符  unichr(x )              将一个整数转换为Unicode字符  ord(x )                 将一个字符转换为它的整数值  hex(x )                 将一个整数转换为一个十六进制字符串  oct(x )                 将一个整数转换为一个八进制字符串 


    Python math 模块、cmath 模块

    Python 中数学运算常用的函数基本都在 ​math ​模块、​cmath​ 模块中。

    Python ​math ​模块提供了许多对浮点数的数学运算函数。

    Python ​cmath ​模块包含了一些用于复数运算的函数。

    cmath ​模块的函数跟 ​math ​模块函数基本一致,区别是 ​cmath ​模块支持复数运算,​math ​模块仅支持普通的数学运算。

    要使用 ​math ​或 ​cmath ​函数必须先导入:

    import math

    查看 ​math ​包中的内容:

    >>> import math>>> dir(math)['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']>>>

    下文会介绍各个函数的具体应用。

    查看 ​cmath ​包中的内容:

    >>> import cmath>>> dir(cmath)['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']>>>

    实例:

    >>> import cmath>>> cmath.sqrt(-1)1j>>> cmath.sqrt(9)(3+0j)>>> cmath.sin(1)(0.8414709848078965+0j)>>> cmath.log10(100)(2+0j)>>>

    Python数学函数

    函数返回值 ( 描述 )
    abs(x)返回数字的绝对值,如 abs(-10) 返回 10
    ceil(x) 返回整型数字的上入整数(向上取整),如 math.ceil(4.1) 返回 5
    cmp(x, y)比较函数;如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
    exp(x) 返回 e 的 x 次幂 (ex), 如 math.exp(1) 返回2.718281828459045
    fabs(x)返回浮点型数字的绝对值,如 math.fabs(-10) 返回10.0
    floor(x) 返回浮点型数字的下舍整数,如 math.floor(4.9)返回 4
    log(x) 如 math.log(math.e) 返回 1.0, math.log(100,10) 返回2.0
    log10(x) 返回以 10 为基数的x的对数,如 math.log10(100) 返回 2.0
    max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。
    min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。
    modf(x) 返回 x 的整数部分与小数部分,两部分的数值符号与 x 相同,整数部分以浮点型表示。
    pow(x, y)x**y 运算后的值。
    round(x [,n])返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。
    sqrt(x) 返回数字 x 的平方根,数字可以为负数,返回类型为实数,如 math.sqrt(4) 返回 2+0j


    Python随机数函数

    随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

    Python 包含以下常用随机数函数:

    函数描述
    choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从 0 到 9 中随机挑选一个整数。
    randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为 1
    random() 随机生成下一个实数,它在 [0,1) 围内。
    seed([x]) 改变随机数生成器的种子 seed。如果你不了解其原理,你不必特别去设定 seed,Python 会帮你选择seed。
    shuffle(lst) 将序列的所有元素随机排序
    uniform(x, y)随机生成下一个实数,它在 [x,y] 范围内。


    Python三角函数

    Python 包括以下三角函数:

    函数描述
    acos(x)返回 x 的反余弦弧度值。
    asin(x)返回 x 的反正弦弧度值。
    atan(x)返回 x 的反正切弧度值。
    atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
    cos(x)返回 x 的弧度的余弦值。
    hypot(x, y)返回欧几里德范数 sqrt(x*x + y*y)。
    sin(x)返回的 x 弧度的正弦值。
    tan(x)返回 x 弧度的正切值。
    degrees(x)将弧度转换为角度,如 degrees(math.pi/2) , 返回 90.0
    radians(x)将角度转换为弧度


    Python数学常量

    常量描述
    pi数学常量 pi(圆周率,一般以 π 来表示)
    e数学常量 e,e 即自然常数(自然常数)。


    Python 字符串

    字符串是 Python 中最常用的数据类型之一。我们可以使用引号来创建字符串。

    创建字符串很简单,只要为变量分配一个值即可。例如:

    var1 = 'Hello World!'var2 = "Python 51coolma"

    Python访问字符串中的值

    Python不支持单字符类型,单字符也在Python也是作为一个字符串使用。

    Python访问子字符串,可以使用方括号来截取字符串,如下实例:

    #!/usr/bin/pythonvar1 = 'Hello World!'var2 = "Python 51coolma"print "var1[0]: ", var1[0]print "var2[1:5]: ", var2[1:5]

    以上实例执行结果:

    var1[0]:  Hvar2[1:5]:  ytho

    Python字符串更新

    你可以对已存在的字符串进行修改,并赋值给另一个变量,如下实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*-var1 = 'Hello World!'print "更新字符串 :- ", var1[:6] + '51coolma!'

    以上实例执行结果

    更新字符串 :-  Hello 51coolma!


    Python转义字符

    在需要在字符中使用特殊字符时,Python 用反斜杠()转义字符。如下表:

    转义字符描述
    (在行尾时) 续行符
    反斜杠符号
    ' 单引号
    " 双引号
    a 响铃
     退格 (Backspace)
    e 转义
    00
    换行
    v 纵向制表符
    横向制表符
    回车
    f 换页
    oyy 八进制数,yy 代表的字符,例如:o12 代表换行
    xyy 十六进制数,yy 代表的字符,例如:x0a 代表换行
    other 其它的字符以普通格式输出

    Python字符串运算符

    下表实例变量a值为字符串"Hello",b 变量值为"Python":

    操作符描述实例
    +字符串连接a + b 输出结果: HelloPython
    *重复输出字符串a * 2 输出结果:HelloHello
    []通过索引获取字符串中字符a[1] 输出结果 e
    [ : ]截取字符串中的一部分a[1:4] 输出结果 ell
    in成员运算符 - 如果字符串中包含给定的字符返回 TrueH in a 输出结果 1
    not in成员运算符 - 如果字符串中不包含给定的字符返回 TrueM not in a 输出结果 1
    r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母"r"(可以大小写)以外,与普通字符串有着几乎完全相同的语法。print r' ' prints 和 print R' ' prints
    %格式字符串请看下一章节

    实例如下:

    #!/usr/bin/python# -*- coding: UTF-8 -*-a = "Hello"b = "Python"print "a + b 输出结果:", a + b print "a * 2 输出结果:", a * 2 print "a[1] 输出结果:", a[1] print "a[1:4] 输出结果:", a[1:4] if( "H" in a):    print "H 在变量 a 中" else:    print "H 不在变量 a 中" if( "M" not in a) :    print "M 不在变量 a 中" else :    print "M 在变量 a 中"print r'
    'print R'
    '

    以上程序执行结果为:

    a + b 输出结果: HelloPython

    a * 2 输出结果: HelloHello

    a[1] 输出结果: e

    a[1:4] 输出结果: ell

    H 在变量 a 中

    M 不在变量 a 中


    Python字符串格式化

    Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 ​%s​ 的字符串中。

    在 Python 中,字符串格式化使用与 C 中的 printf 函数一样的语法。

    如下实例:

    #!/usr/bin/pythonprint "My name is %s and weight is %d kg!" % ('Zara', 21) 

    以上实例输出结果:

    My name is Zara and weight is 21 kg!

    Python 字符串格式化符号:

        符   号 描述
          %c 格式化字符及其 ASCII 码
          %s 格式化字符串
          %d 格式化整数
          %u 格式化无符号整型
          %o 格式化无符号八进制数
          %x 格式化无符号十六进制数
          %X 格式化无符号十六进制数(大写)
          %f 格式化浮点数字,可指定小数点后的精度
          %e 用科学计数法格式化浮点数
          %E 作用同 %e,用科学计数法格式化浮点数
          %g %f 和 %e 的简写
          %G %f 和 %E 的简写
          %p 用十六进制数格式化变量的地址

    格式化操作符辅助指令:

    符号功能
    *定义宽度或者小数点精度
    -用做左对齐
    +在正数前面显示加号( + )
    <sp>在正数前面显示空格
    #在八进制数前面显示零 ('0'),在十六进制前面显示 '0x' 或者 '0X' (取决于用的是 'x' 还是 'X' )
    0显示的数字前面填充 '0' 而不是默认的空格
    %'%%' 输出一个单一的 '%'
    (var)映射变量(字典参数)
    m.n.m 是显示的最小总宽度, n 是小数点后的位数(如果可用的话)

    Python三引号(triple quotes)

    Python 中三引号可以将复杂的字符串进行复制:

    Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。

    三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。

     >>> hi = '''hi there'''>>> hi   # repr()'hi
    there'>>> print hi  # str()hi there  

    三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。

    一个典型的用例是,当你需要一块HTML或者SQL时,这时用字符串组合,特殊字符串转义将会非常的繁琐。

     errHTML = '''<HTML><HEAD><TITLE>Friends CGI Demo</TITLE></HEAD><BODY><H3>ERROR</H3><B>%s</B><P><FORM><INPUT TYPE=button VALUE=Back ONCLICK="window.history.back()"></FORM></BODY></HTML>'''cursor.execute('''CREATE TABLE users (  login VARCHAR(8), uid INTEGER,prid INTEGER)''')

    Unicode 字符串

    Python 中定义一个 Unicode 字符串和定义一个普通字符串一样简单:

    >>> u'Hello World !'u'Hello World !'

    引号前小写的"u"表示这里创建的是一个 Unicode 字符串。如果你想加入一个特殊字符,可以使用 Python 的 Unicode-Escape 编码。如下例所示:

    >>> u'Hellou0020World !'u'Hello World !'

    被替换的 u0020 标识表示在给定位置插入编码值为 0x0020 的 Unicode 字符(空格符)。


    Python的字符串内建函数

    字符串方法是从 Python1.6 到 2.0 慢慢加进来的——它们也被加到了 Python 中。

    这些方法实现了 string 模块的大部分方法,如下表所示列出了目前字符串内建支持的方法,所有的方法都包含了对 Unicode 的支持,有一些甚至是专门用于 Unicode 的。

    方法 描述

    string.capitalize()

    把字符串的第一个字符大写

    string.center(width)

    返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

    string.count(str, beg=0, end=len(string))

    返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数

    string.decode(encoding='UTF-8', errors='strict')

    以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace'

    string.encode(encoding='UTF-8', errors='strict')

    以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'

    string.endswith(obj, beg=0, end=len(string))

    检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.

    string.expandtabs(tabsize=8)

    把字符串 string 中的 tab 符号转为空格,默认的空格数 tabsize 是 8.

    string.find(str, beg=0, end=len(string))

    检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

    string.index(str, beg=0, end=len(string))

    跟 find() 方法一样,只不过如果 str 不在 string 中会报一个异常.

    string.isalnum()

    如果 string 至少有一个字符并且所有字符都是字母或数字则返

    回 True,否则返回 False

    string.isalpha()

    如果 string 至少有一个字符并且所有字符都是字母则返回 True,

    否则返回 False

    string.isdecimal()

    如果 string 只包含十进制数字则返回 True 否则返回 False.

    string.isdigit()

    如果 string 只包含数字则返回 True 否则返回 False.

    string.islower()

    如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

    string.isnumeric()

    如果 string 中只包含数字字符,则返回 True,否则返回 False

    string.isspace()

    如果 string 中只包含空格,则返回 True,否则返回 False.

    string.istitle()

    如果 string 是标题化的 (见 title()) 则返回 True,否则返回 False

    string.isupper()

    如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

    string.join(seq)

    Merges (concatenates)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

    string.ljust(width)

    返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

    string.lower()

    转换 string 中所有大写字符为小写.

    string.lstrip()

    截掉 string 左边的空格

    string.maketrans(intab, outtab])

    maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

    max(str)

    返回字符串 str 中最大的字母。

    min(str)

    返回字符串 str 中最小的字母。

    string.partition(str)

    有点像 find()和 split() 的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.

    string.replace(str1, str2,  num=string.count(str1))

    把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.

    string.rfind(str, beg=0,end=len(string) )

    类似于 find()函数,不过是从右边开始查找.

    string.rindex( str, beg=0,end=len(string))

    类似于 index(),不过是从右边开始.

    string.rjust(width)

    返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

    string.rpartition(str)

    类似于 partition()函数,不过是从右边开始查找.

    string.rstrip()

    删除 string 字符串末尾的空格.

    string.split(str="", num=string.count(str))

    以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串

    string.splitlines(num=string.count(' '))

    按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行.

    string.startswith(obj, beg=0,end=len(string))

    检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

    string.strip([obj])

    在 string 上执行 lstrip()和 rstrip()

    string.swapcase()

    翻转 string 中的大小写

    string.title()

    返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())

    string.translate(str, del="")

    根据 str 给出的表(包含 256 个字符)转换 string 的字符,

    要过滤掉的字符放到 del 参数中

    string.upper()

    转换 string 中的小写字母为大写

    string.zfill(width)

    返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

    string.isdecimal()

    isdecimal() 方法检查字符串是否只包含十进制字符。这种方法只存在于 unicode 对象。


    Python 列表(Lists)

    序列是 Python 中最基本的数据结构。序列中的每个元素都分配一个数字用来表示它的位置,索引,第一个索引是 0,第二个索引是 1,依此类推。

    Python有 6 个序列的内置类型,但最常见的是列表和元组。

    序列都可以进行的操作包括索引,切片,加,乘,检查成员。

    此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。

    列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。

    列表的数据项不需要具有相同的类型

    创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:

    list1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5 ];list3 = ["a", "b", "c", "d"];

    与字符串的索引一样,列表索引从 0 开始。列表可以进行截取、组合等。


    访问列表中的值

    使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符,如下所示:

    #!/usr/bin/pythonlist1 = ['physics', 'chemistry', 1997, 2000];list2 = [1, 2, 3, 4, 5, 6, 7 ];print "list1[0]: ", list1[0]print "list2[1:5]: ", list2[1:5]

    以上实例输出结果:

    list1[0]:  physicslist2[1:5]:  [2, 3, 4, 5]

    更新列表

    你可以对列表的数据项进行修改或更新,你也可以使用 append() 方法来添加列表项,如下所示:

    #!/usr/bin/pythonlist = ['physics', 'chemistry', 1997, 2000];print "Value available at index 2 : "print list[2];list[2] = 2001;print "New value available at index 2 : "print list[2];

    注意:我们会在接下来的章节讨论 append() 方法的使用

    以上实例输出结果:

    Value available at index 2 :1997New value available at index 2 :2001

    删除列表元素

    可以使用 del 语句来删除列表的的元素,如下实例:

    #!/usr/bin/pythonlist1 = ['physics', 'chemistry', 1997, 2000];print list1;del list1[2];print "After deleting value at index 2 : "print list1;

    以上实例输出结果:

    ['physics', 'chemistry', 1997, 2000]After deleting value at index 2 :['physics', 'chemistry', 2000]

    注意:我们会在接下来的章节讨论 remove() 方法的使用


    Python 列表脚本操作符

    列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

    如下所示:

    Python 表达式结果 描述
    len([1, 2, 3])3长度
    [1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
    ['Hi!'] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']重复
    3 in [1, 2, 3]True元素是否存在于列表中
    for x in [1, 2, 3]: print x,1 2 3迭代

    Python 列表截取

    Python 的列表截取与字符串操作类型,如下所示:

    L = ['spam', 'Spam', 'SPAM!']

    操作:

    Python 表达式结果 描述
    L[2]'SPAM!'读取列表中第三个元素
    L[-2]'Spam'读取列表中倒数第二个元素
    L[1:]['Spam', 'SPAM!']从第二个元素开始截取列表

    Python 列表函数&方法

    Python 包含以下函数:

    序号函数
    1cmp(list1, list2)
    比较两个列表的元素
    2len(list)
    列表元素个数
    3max(list)
    返回列表元素最大值
    4min(list)
    返回列表元素最小值
    5list(seq)
    将元组转换为列表

    Python 包含以下方法:

    序号方法
    1list.append(obj)
    在列表末尾添加新的对象
    2list.count(obj)
    统计某个元素在列表中出现的次数
    3list.extend(seq)
    在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
    4list.index(obj)
    从列表中找出某个值第一个匹配项的索引位置
    5list.insert(index, obj)
    将对象插入列表
    6list.pop(obj=list[-1])
    移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
    7list.remove(obj)
    移除列表中某个值的第一个匹配项
    8list.reverse()
    反向列表中元素
    9list.sort([func])
    对原列表进行排序

    实例:

    如果 Python 列表无法正常输出汉字,则可以采取以下的解决方法:

    #encoding=utf-8import json#以下代码是用来保证在线环境中运行不报错的。import sys  # 导入sys库reload(sys)sys.setdefaultencoding('utf-8')  # 设置默认的编码字符集为utf-8,避免第14行的print在在线情况下报错#本地环境可以不需要这部分代码list_words = [ '你', '我', '他' ]print( list_words )                                        # 无法正常显示汉字print( str(list_words).decode( 'string_escape' ) )         # 正常显示汉字list_words_result = json.dumps( list_words, encoding='UTF-8', ensure_ascii=False )print( list_words_result )

    以上实例输出结果:

    ['xe4xbdxa0', 'xe6x88x91', 'xe4xbbx96']['你', '我', '他']["你", "我", "他"]


    Python 元组

    Python 的元组与列表类似,不同之处在于元组的元素不能修改。

    元组使用小括号,列表使用方括号。

    元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

    如下实例:

    tup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5 );tup3 = "a", "b", "c", "d";

    创建空元组

    tup1 = ();

    元组中只包含一个元素时,需要在元素后面添加逗号

    tup1 = (50,);

    元组与字符串类似,下标索引从0开始,可以进行截取,组合等。


    访问元组

    元组可以使用下标索引来访问元组中的值,如下实例:

    #!/usr/bin/pythontup1 = ('physics', 'chemistry', 1997, 2000);tup2 = (1, 2, 3, 4, 5, 6, 7 );print "tup1[0]: ", tup1[0]print "tup2[1:5]: ", tup2[1:5]

    以上实例输出结果:

    tup1[0]:  physicstup2[1:5]:  (2, 3, 4, 5)

    修改元组

    元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

    #coding=utf-8#!/usr/bin/pythontup1 = (12, 34.56);tup2 = ('abc', 'xyz');# 以下修改元组元素操作是非法的。# tup1[0] = 100;# 创建一个新的元组tup3 = tup1 + tup2;print tup3;

    以上实例输出结果:

    (12, 34.56, 'abc', 'xyz')

    删除元组

    元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

    #!/usr/bin/pythontup = ('physics', 'chemistry', 1997, 2000);print tup;del tup;print "After deleting tup : "print tup;

    以上实例元组被删除后,控制台会有异常信息输出,输出如下所示:

    ('physics', 'chemistry', 1997, 2000)After deleting tup :Traceback (most recent call last):  File "test.py", line 9, in <module>    print tup;NameError: name 'tup' is not defined

    元组运算符

    与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

    Python 表达式结果 描述
    len((1, 2, 3))3计算元素个数
    (1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接
    ['Hi!'] * 4['Hi!', 'Hi!', 'Hi!', 'Hi!']复制
    3 in (1, 2, 3)True元素是否存在
    for x in (1, 2, 3): print x,1 2 3迭代

    元组索引,截取

    因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

    元组:

    L = ('spam', 'Spam', 'SPAM!')
    Python 表达式结果 描述
    L[2]'SPAM!'读取第三个元素
    L[-2]'Spam'反向读取;读取倒数第二个元素
    L[1:]('Spam', 'SPAM!')截取元素

    无关闭分隔符

    任意无符号的对象,以逗号隔开,默认为元组,如下实例:

    #!/usr/bin/pythonprint 'abc', -4.24e93, 18+6.6j, 'xyz';x, y = 1, 2;print "Value of x , y : ", x,y;

    以上实例运行结果:

    abc -4.24e+93 (18+6.6j) xyzValue of x , y : 1 2

    元组内置函数

    Python 元组包含了以下内置函数

    序号方法及描述
    1cmp(tuple1, tuple2)
    比较两个元组元素。
    2len(tuple)
    计算元组元素个数。
    3max(tuple)
    返回元组中元素最大值。
    4min(tuple)
    返回元组中元素最小值。
    5tuple(seq)
    将列表转换为元组。

    Python 字典(Dictionary)

    字典是另一种可变容器模型,且可存储任意类型对象。

    字典的每个键值 (key=>value) 对用冒号(:)分割,每个对之间用逗号 (,) 分割,整个字典包括在花括号 ({}) 中 ,格式如下所示:

    d = {key1 : value1, key2 : value2 }

    键必须是唯一的,但值则不必。

    值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

    一个简单的字典实例:

    dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

    也可如此创建字典:

    dict1 = { 'abc': 456 };dict2 = { 'abc': 123, 98.6: 37 };

    访问字典里的值

    把相应的键放入熟悉的方括号内,如下实例:

    #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print "dict['Name']: ", dict['Name'];print "dict['Age']: ", dict['Age'];

    以上实例输出结果:

    dict['Name']:  Zaradict['Age']:  7

    如果用字典里没有的键访问数据,会输出错误如下:

    #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print "dict['Alice']: ", dict['Alice'];

    以上实例输出结果:

    dict['Zara']:Traceback (most recent call last):  File "test.py", line 4, in <module>    print "dict['Alice']: ", dict['Alice'];KeyError: 'Alice'

    修改字典

    向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

    #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; dict['Age'] = 8; # update existing entrydict['School'] = "DPS School"; # Add new entry  print "dict['Age']: ", dict['Age'];print "dict['School']: ", dict['School'];

    以上实例输出结果:

    dict['Age']:  8dict['School']:  DPS School

    删除字典元素

    能删单一的元素也能清空字典,清空只需一项操作。

    显示删除一个字典用 del 命令,如下实例:

    #coding=utf-8#!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; del dict['Name']; # 删除键是'Name'的条目dict.clear();     # 清空词典所有条目del dict ;        # 删除词典 print "dict['Age']: ", dict['Age'];print "dict['School']: ", dict['School'];

    但这会引发一个异常,因为用 del 后字典不再存在:

    dict['Age']:Traceback (most recent call last):  File "test.py", line 8, in <module>    print "dict['Age']: ", dict['Age'];TypeError: 'type' object is unsubscriptable

    注:del() 方法后面也会讨论。


    字典键的特性

    字典值可以没有限制地取任何 Python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。

    两个重要的点需要记住:

    1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,只会保存后一次赋值,如下实例:

    #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}; print "dict['Name']: ", dict['Name'];

    以上实例输出结果:

    dict['Name']:  Manni

    2)键必须不可变,所以可以用数,字符串或元组充当,所以用列表就不行,如下实例:

    #!/usr/bin/python dict = {['Name']: 'Zara', 'Age': 7}; print "dict['Name']: ", dict['Name'];

    以上实例输出结果:

    Traceback (most recent call last):  File "test.py", line 3, in <module>    dict = {['Name']: 'Zara', 'Age': 7};TypeError: list objects are unhashable


    字典内置函数&方法

    Python字典包含了以下内置函数:

    序号函数及描述
    1cmp(dict1, dict2)
    比较两个字典元素。
    2len(dict)
    计算字典元素个数,即键的总数。
    3str(dict)
    输出字典可打印的字符串表示。
    4type(variable)
    返回输入的变量类型,如果变量是字典就返回字典类型。

    Python字典包含了以下内置方法:

    序号函数及描述
    1radiansdict.clear()
    删除字典内所有元素
    2radiansdict.copy()
    返回一个字典的浅复制
    3radiansdict.fromkeys()
    创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
    4radiansdict.get(key, default=None)
    返回指定键的值,如果值不在字典中返回 default 值
    5radiansdict.has_key(key)
    如果键在字典 dict 里返回 True,否则返回 False
    6radiansdict.items()
    以列表返回可遍历的(键, 值) 元组数组
    7radiansdict.keys()
    以列表返回一个字典所有的键
    8radiansdict.setdefault(key, default=None)
    和 get() 类似, 但如果键不已经存在于字典中,将会添加键并将值设为 default
    9radiansdict.update(dict2)
    把字典 dict2 的键/值对更新到 dict 里
    10radiansdict.values()
    以列表返回字典中的所有值

    实例:

    使用Python编写字典程序:

    1. 用户添加单词和定义
    2. 查找这些单词
    3. 如果查不到,请让用户知道
    4. 循环

    代码如下:

    #coding:utf-8# 字典创建  while开关 字典添加   字典寻找dictionary = {}flag = 'a'pape = 'a'off = 'a'while flag == 'a' or 'c' :    flag = raw_input("添加或查找单词 ?(a/c)")    if flag == "a" :                             # 开启        word = raw_input("输入单词(key):")        defintion = raw_input("输入定义值(value):")        dictionary[str(word)] = str(defintion)  # 添加字典        print "添加成功!"        pape = raw_input("您是否要查找字典?(a/0)")   #read        if pape == 'a':            print dictionary        else :            continue    elif flag == 'c':        check_word = raw_input("要查找的单词:")  # 检索        for key in sorted(dictionary.keys()):            # yes            if str(check_word) == key:                print "该单词存在! " ,key, dictionary[key]                break            else:                                       # no                off = 'b'        if off == 'b':            print "抱歉,该值不存在!"    else:                               # 停止        print "error type"        break

     在线运行的展示效果不是很好,建议使用本地代码环境进行运行!

    测试结果如下所示:

    添加或查找单词 ?(a/c)a

    输入单词(key):w3c

    输入定义值(value):51coolma.cn

    添加成功!

    您是否要查找字典?(a/0)0

    添加或查找单词 ?(a/c)c

    要查找的单词:w3c

    该单词存在!  w3c 51coolma.cn

    添加或查找单词 ?(a/c)


    Python 日期和时间

    Python 能用很多方式处理日期和时间,转换日期格式是一个常见的功能。

    Python 提供了 time 和 calendar 模块可以用于格式化日期和时间。

    时间间隔是以秒为单位的浮点型小数。

    每个时间戳都以自从 公元1970 年 1 月 1 日0:00到现在所经过的时间来表示。

    Python 的 time 模块下有很多函数可以转换常见日期格式。如函数 time.time() 用于获取当前时间戳, 如下实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*-import time;  # 引入time模块ticks = time.time()print "当前时间戳为:", ticks

    以上实例输出结果:

    当前时间戳为: 1459994552.51

    时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX 和Windows 只支持到 2038 年。


    什么是时间元组?

    很多 Python 函数用一个元组装起来的9组数字处理时间:

    序号字段
    04 位数年2008
    11 到 12
    21 到 31
    3小时0 到 23
    4分钟
    50 到 61 (60或61 是闰秒)
    6一周的第几日0 到 6 (0 是周一)
    7一年的第几日1 到 366 (儒略历)
    8夏令时-1, 0, 1, -1 是决定是否为夏令时的旗帜

    上述也就是struct_time元组。这种结构具有如下属性:

    序号属性
    0tm_year2008
    1tm_mon1 到 12
    2tm_mday1 到 31
    3tm_hour0 到 23
    4tm_min0 到 59
    5tm_sec0 到 61 (60 或 61 是闰秒)
    6tm_wday0 到 6 (0 是周一)
    7tm_yday1 到 366 (儒略历)
    8tm_isdst-1, 0, 1, -1 是决定是否为夏令时的旗帜


    获取当前时间

    从返回浮点数的时间辍方式向时间元组转换,只要将浮点数传递给如 localtime 之类的函数。

    #!/usr/bin/python# -*- coding: UTF-8 -*-import timelocaltime = time.localtime(time.time())print "本地时间为 :", localtime

    以上实例输出结果:

    本地时间为 : time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)


    获取格式化的时间

    你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime():

    #!/usr/bin/python# -*- coding: UTF-8 -*-import timelocaltime = time.asctime( time.localtime(time.time()) )print "本地时间为 :", localtime

    以上实例输出结果:

    本地时间为 : Thu Apr  7 10:05:21 2016

    格式化日期

    我们可以使用 time 模块的 strftime 方法来格式化日期,:

    time.strftime(format[, t])

    #!/usr/bin/python# -*- coding: UTF-8 -*-import time# 格式化成2016-03-20 11:45:39形式print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化成Sat Mar 28 22:24:24 2016形式print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) # 将格式字符串转换为时间戳a = "Sat Mar 28 22:24:24 2016"print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

    以上实例输出结果:

    2021-09-06 07:08:04Mon Sep 06 07:08:04 20211459203864.0


    Python中时间日期格式化符号:

    %y 两位数的年份表示(00-99)

    %Y 四位数的年份表示(000-9999)

    %m 月份(01-12)

    %d 月内中的一天(0-31)

    %H 24 小时制小时数(0-23)

    %I 12 小时制小时数(01-12)

    %M 分钟数(00=59)

    %S 秒(00-59)

    %a 本地简化星期名称

    %A 本地完整星期名称

    %b 本地简化的月份名称

    %B 本地完整的月份名称

    %c 本地相应的日期表示和时间表示

    %j 年内的一天(001-366)

    %p 本地 A.M. 或 P.M. 的等价符

    %U 一年中的星期数(00-53)星期天为星期的开始

    %w 星期(0-6),星期天为星期的开始

    %W 一年中的星期数(00-53)星期一为星期的开始

    %x 本地相应的日期表示

    %X 本地相应的时间表示

    %Z 当前时区的名称

    %% % 号本身


    获取某月日历

    Calendar 模块有很广泛的方法用来处理年历和月历,例如打印某月的月历:

    #!/usr/bin/python# -*- coding: UTF-8 -*-import calendarcal = calendar.month(2016, 1)print "以下输出2016年1月份的日历:"print cal;

    以上实例输出结果:

    以下输出2016年1月份的日历:    January 2016Mo Tu We Th Fr Sa Su             1  2  3 4  5  6  7  8  9 1011 12 13 14 15 16 1718 19 20 21 22 23 2425 26 27 28 29 30 31

    Time 模块

    Time 模块包含了以下内置函数,既有时间处理相的,也有转换时间格式的:

    序号函数及描述
    1time.altzone
    返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。
    2time.asctime([tupletime])
    接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的 24 个字符的字符串。
    3time.clock( )
    用以浮点数计算的秒数返回当前的 CPU 时间。用来衡量不同程序的耗时,比 time.time() 更有用。
    4time.ctime([secs])
    作用相当于asctime(localtime(secs)),未给参数相当于asctime()
    5time.gmtime([secs])
    接收时间辍(1970 纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组 t。注:t.tm_isdst 始终为 0
    6time.localtime([secs])
    接收时间辍(1970 纪元后经过的浮点秒数)并返回当地时间下的时间元组 t(t.tm_isdst 可取 0 或 1,取决于当地当时是不是夏令时)。
    7time.mktime(tupletime)
    接受时间元组并返回时间辍(1970 纪元后经过的浮点秒数)。
    8time.sleep(secs)
    推迟调用线程的运行,secs 指秒数。
    9time.strftime(fmt[,tupletime])
    接收以时间元组,并返回以可读字符串表示的当地时间,格式由 fmt 决定。
    10time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')
    根据 fmt 的格式把一个时间字符串解析为时间元组。
    11time.time( )
    返回当前时间的时间戳(1970 纪元后经过的浮点秒数)。
    12time.tzset()
    根据环境变量 TZ 重新初始化时间相关设置。

    Time 模块包含了以下 2 个非常重要的属性:

    序号属性及描述
    1time.timezone
    属性 time.timezone 是当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
    2time.tzname
    属性 time.tzname 包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的。


    日历(Calendar)模块

    此模块的函数都是日历相关的,例如打印某月的字符月历。

    星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用 calendar.setfirstweekday() 函数。模块包含了以下内置函数:

    序号函数及描述
    1calendar.calendar(year,w=2,l=1,c=6)
    返回一个多行字符串格式的year年年历,3 个月一行,间隔距离为 c。 每日宽度间隔为 w 字符。每行长度为 21* W+18+2* C。l 是每星期行数。
    2calendar.firstweekday( )
    返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。
    3calendar.isleap(year)
    是闰年返回 True,否则为 False。
    4calendar.leapdays(y1,y2)
    返回在 Y1,Y2 两年之间的闰年总数。
    5calendar.month(year,month,w=2,l=1)
    返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为 w 字符。每行的长度为 7* w+6。l 是每星期的行数。
    6calendar.monthcalendar(year,month)
    返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
    7calendar.monthrange(year,month)
    返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从 1 到 12。
    8calendar.prcal(year,w=2,l=1,c=6)
    相当于 print calendar.calendar(year,w,l,c).
    9calendar.prmonth(year,month,w=2,l=1)
    相当于 print calendar.calendar(year,w,l,c)。
    10calendar.setfirstweekday(weekday)
    设置每周的起始日期码。0(星期一)到 6(星期日)。
    11calendar.timegm(tupletime)
    和 time.gmtime 相反:接受一个时间元组形式,返回该时刻的时间辍(1970 纪元后经过的浮点秒数)。
    12calendar.weekday(year,month,day)
    返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(1 月) 到 12(12 月)。


    其他相关模块和函数

    在 Python 种,其他处理日期和时间的模块还有:


    Python函数

    函数是封装好的,可重复使用的,用来实现单一,或相关联功能的代码段。

    函数能提高程序的模块性,和代码的重复利用率。你已经知道 Python 提供了许多内建函数,比如 print()。但你也可以自己创建函数,这被叫做用户自定义函数。


    定义一个函数

    你可以定义一个由自己想要功能的函数,以下是简单的规则:

    • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号起始,并且缩进。
    • Return[expression] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。

    语法

    def functionname( parameters ):   "函数_文档字符串"   function_suite   return [expression]

    默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。

    实例

    以下为一个简单的 Python 函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

    def printme( str ):   "打印传入的字符串到标准显示设备上"   print str   return

    函数调用

    定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

    这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 提示符执行。

    如下实例调用了 printme() 函数:

    #coding=utf-8#!/usr/bin/python # Function definition is heredef printme( str ):   "打印任何传入的字符串"   print str;   return; # Now you can call printme functionprintme("我要调用用户自定义函数!");printme("再次调用同一函数");

    以上实例输出结果:

    我要调用用户自定义函数!再次调用同一函数

    参数传递

    在 Python 中,类型属于对象,变量是没有类型的:

    a=[1,2,3] a="51coolma"

    以上代码中,[1,2,3] 是 list 类型,"51coolma"是 string 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 list 类型对象,也可以指向 是 string 类型对象。

    可更改 (mutable) 与不可更改 (immutable) 对象

    在 Python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list, dict 等则是可以修改的对象。

    • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
    • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身 la 没有动,只是其内部的一部分值被修改了。

    Python 函数的参数传递:

    • 不可变类型:类似 c++的值传递,如 整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
    • 可变类型:类似 c++的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

     Python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

    Python 传不可变对象实例

    实例(Python 2.0+)

    #!/usr/bin/python# -*- coding: UTF-8 -*- def ChangeInt( a ):    a = 10 b = 2ChangeInt(b)print b # 结果是 2

    实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。

    按值传递参数和按引用传递参数(传可变对象实例)

    所有参数(自变量)在 Python 里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

    #coding=utf-8#!/usr/bin/python # 可写函数说明def changeme( mylist ):   "修改传入的列表"   mylist.append([1,2,3,4]);   print "函数内取值: ", mylist   return # 调用changeme函数mylist = [10,20,30];changeme( mylist );print "函数外取值: ", mylist

    传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

    函数内取值:  [10, 20, 30, [1, 2, 3, 4]]函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

    参数

    以下是调用函数时可使用的正式参数类型:

    • 必备参数
    • 命名参数
    • 缺省参数
    • 不定长参数

    必备参数

    必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

    调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:

    #coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return; #调用printme函数printme();

    以上实例输出结果:

    Traceback (most recent call last):  File "test.py", line 11, in <module>    printme();TypeError: printme() takes exactly 1 argument (0 given)

    关键字参数

    关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

    使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

    以下实例在函数 printme() 调用时使用参数名:

    #!/usr/bin/python# -*- coding: UTF-8 -*-#可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return;#调用printme函数printme( str = "My string");

    以上实例输出结果:

    My string

    下例能将关键字参数顺序不重要展示得更清楚:

    #!/usr/bin/python# -*- coding: UTF-8 -*-#可写函数说明def printinfo( name, age ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return;#调用printinfo函数printinfo( age=50, name="miki" );

    以上实例输出结果:

    Name:  miki

    Age  50

    命名参数

    命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为 Python 解释器能够用参数名匹配参数值。用命名参数调用 printme() 函数:

    #coding=utf-8#!/usr/bin/python #可写函数说明def printme( str ):   "打印任何传入的字符串"   print str;   return; #调用printme函数printme( str = "My string");

    以上实例输出结果:

    My string

    下例能将命名参数顺序不重要展示得更清楚:

    #coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return; #调用printinfo函数printinfo( age=50, name="miki" );

    以上实例输出结果:

    Name:  mikiAge  50

    缺省参数

    调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的 age,如果 age 没有被传入:

    #coding=utf-8#!/usr/bin/python #可写函数说明def printinfo( name, age = 35 ):   "打印任何传入的字符串"   print "Name: ", name;   print "Age ", age;   return; #调用printinfo函数printinfo( age=50, name="miki" );printinfo( name="miki" );

    以上实例输出结果:

    Name:  mikiAge  50Name:  mikiAge  35

    不定长参数

    你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:

    def functionname([formal_args,] *var_args_tuple ):   "函数_文档字符串"   function_suite   return [expression]

    加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:

    #coding=utf-8#!/usr/bin/python # 可写函数说明def printinfo( arg1, *vartuple ):   "打印任何传入的参数"   print "输出: "   print arg1   for var in vartuple:      print var   return; # 调用printinfo 函数printinfo( 10 );printinfo( 70, 60, 50 );

    以上实例输出结果:

    输出:10输出:706050

    匿名函数

    python 使用 lambda 来创建匿名函数。

    • lambda 只是一个表达式,函数体比 def 简单很多。
    • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
    • lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
    • 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

    语法

    lambda 函数的语法只包含一个语句,如下:

    lambda [arg1 [,arg2,.....argn]]:expression

    如下实例:

    #coding=utf-8#!/usr/bin/python #可写函数说明sum = lambda arg1, arg2: arg1 + arg2; #调用sum函数print "Value of total : ", sum( 10, 20 )print "Value of total : ", sum( 20, 20 )

    以上实例输出结果:

    Value of total :  30Value of total :  40

    return 语句

    return 语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:

    #coding=utf-8#!/usr/bin/python # 可写函数说明def sum( arg1, arg2 ):   # 返回2个参数的和."   total = arg1 + arg2   print "Inside the function : ", total   return total; # 调用sum函数total = sum( 10, 20 );print "Outside the function : ", total 

    以上实例输出结果:

    Inside the function :  30Outside the function :  30

    变量作用域

    一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

    变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

    • 全局变量
    • 局部变量

    变量和局部变量

    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

    局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

    #coding=utf-8#!/usr/bin/python total = 0; # This is global variable.# 可写函数说明def sum( arg1, arg2 ):   #返回2个参数的和."   total = arg1 + arg2; # total在这里是局部变量.   print "Inside the function local total : ", total   return total; #调用sum函数sum( 10, 20 );print "Outside the function global total : ", total 

    以上实例输出结果:

    Inside the function local total :  30Outside the function global total :  0


    Python 模块

    模块让你能够有逻辑地组织你的 Python 代码段。

    把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。

    模块也是 Python 对象,具有随机的名字属性用来绑定或引用。

    简单地说,模块就是一个保存了 Python 代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。

    例子

    一个叫做 aname 的模块里的 Python 代码一般都能在一个叫 aname.py 的文件中找到。下例是个简单的模块 support.py。

    def print_func( par ):   print "Hello : ", par   return

    import 语句

    想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

    import module1[, module2[,... moduleN]

    当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

    搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 hello.py,需要把命令放在脚本的顶端:

    #coding=utf-8#!/usr/bin/python # 导入模块import support # 现在可以调用模块里包含的函数了support.print_func("Zara")

    以上实例输出结果:

    Hello : Zara

    一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。


    From…import 语句

    Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:

    from modname import name1[, name2[, ... nameN]]

    例如,要导入模块 fib 的 fibonacci 函数,使用如下语句:

    from fib import fibonacci

    这个声明不会把整个 fib 模块导入到当前的命名空间中,它只会将fib里的 fibonacci 单个引入到执行这个声明的模块的全局符号表。


    From…import* 语句

    把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

    from modname import *

    这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。


    定位模块

    当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

    • 当前目录
    • 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
    • 如果都找不到,Python 会察看默认路径。UNIX下,默认路径一般为 /usr/local/lib/python/

    模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH 和由安装过程决定的默认目录。



    PYTHONPATH变量

    作为环境变量,PYTHONPATH 由装在一个列表里的许多目录组成。PYTHONPATH 的语法和 shell 变量PATH的一样。

    在 Windows 系统,典型的 PYTHONPATH 如下:

    set PYTHONPATH=c:python20lib;

    在 UNIX 系统,典型的 PYTHONPATH 如下:

    set PYTHONPATH=/usr/local/lib/python


    命名空间和作用域

    变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。

    一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

    每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。

    Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

    因此,如果要给全局变量在一个函数里赋值,必须使用 global 语句。

    global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

    例如,我们在全局命名空间里定义一个变量 money。我们再在函数内给变量 money 赋值,然后 Python 会假定 money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句的注释就能解决这个问题。

    #coding=utf-8#!/usr/bin/python Money = 2000def AddMoney():   # 想改正代码就取消以下注释:   # global Money   Money = Money + 1 print MoneyAddMoney()print Money


    dir()函数

    dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。

    返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:

    #coding=utf-8#!/usr/bin/python # 导入内置math模块import math content = dir(math) print content;

    以上实例输出结果:

    ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

    在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。



    globals() 和 locals() 函数

    根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。

    如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。

    如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。

    两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。



    reload() 函数

    当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

    因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:

    reload(module_name)

    在这里,module_name 要直接放模块的名字,而不是一个字符串形式。比如想重载 hello 模块,如下:

    reload(hello)


    Python 中的包

    包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

    考虑一个在 Phone 目录下的 pots.py 文件。这个文件有如下源代码:

    #coding=utf-8#!/usr/bin/python def Pots():   print "I'm Pots Phone"

    同样地,我们有另外两个保存了不同函数的文件:

    • Phone/Isdn.py 含有函数 Isdn()
    • Phone/G3.py 含有函数 G3()

    现在,在 Phone 目录下创建 file __init__.py:

    • Phone/__init__.py

    当你导入 Phone 时,为了能够使用所有函数,你需要在 __init__.py 里使用显式的导入语句,如下:

    from Pots import Potsfrom Isdn import Isdnfrom G3 import G3

    当你把这些代码添加到__init__.py之后,导入 Phone 包的时候这些类就全都是可用的了。

    #coding=utf-8#!/usr/bin/python # Now import your Phone Package.import Phone Phone.Pots()Phone.Isdn()Phone.G3()

    以上实例输出结果:

    I'm Pots PhoneI'm 3G PhoneI'm ISDN Phone

    如上,为了举例,我们只在每个文件里放置了一个函数,但其实你可以放置许多函数。你也可以在这些文件里定义 Python 的类,然后为这些类建一个包。

    Python 文件 I/O

    本章只讲述所有基本的的 I/O 函数,更多函数请参考 Python 标准文档。

     关于python文件读写和基本输入输出的代码,由于在线示例的限制并不能较好的展现出应有的运行结果,建议在本地环境下运行!

    打印到屏幕

    最简单的输出方法是用 print 语句,你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下:

    #!/usr/bin/python print "Python is really a great language,", "isn't it?";

    你的标准屏幕上会产生以下结果:

    Python is really a great language, isn't it?

    读取键盘输入

    Python 提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:

    • raw_input
    • input

    raw_input函数

    raw_input([prompt]) 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):

    #!/usr/bin/python# -*- coding: UTF-8 -*-  str = raw_input("请输入:");print "你输入的内容是: ", str

    这将提示你输入任意字符串,然后在屏幕上显示相同的字符串。当我输入"Hello Python!",它的输出如下:

    请输入:Hello Python!你输入的内容是:  Hello Python!

    input函数

    input([prompt]) 函数和 raw_input([prompt]) 函数基本可以互换,但是 input 会假设你的输入是一个有效的 Python 表达式,并返回运算结果。

    #!/usr/bin/python str = input("Enter your input: ");print "Received input is : ", str

    这会产生如下的对应着输入的结果:

    Enter your input: [x*5 for x in range(2,10,2)]Recieved input is :  [10, 20, 30, 40]

    打开和关闭文件

    到现在为止,你已经可以向标准输入和输出进行读写。现在,来看看怎么读写实际的数据文件。

    Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用file对象做大部分的文件操作。

    open函数

    你必须先用 Python 内置的 open() 函数打开一个文件,创建一个 file 对象,相关的辅助方法才可以调用它进行读写。

    语法:

    file object = open(file_name [, access_mode][, buffering])

    各个参数的细节如下:

    • file_name:file_name 变量是一个包含了你要访问的文件名称的字符串值。
    • access_mode:access_mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
    • buffering: 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

    不同模式打开文件的完全列表:

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    下图很好的总结了这几种模式:

    Python 文件I/O

    模式rr+ww+aa+
    ++++
    +++++
    创建++++
    覆盖++
    指针在开始++++
    指针在结尾++


    File 对象的属性

    一个文件被打开后,你有一个 file 对象,你可以得到有关该文件的各种信息。

    以下是和 file 对象相关的所有属性的列表:

    属性描述
    file.closed如果文件已被关闭返回 True,否则返回 False。
    file.mode返回被打开文件的访问模式。
    file.name返回文件的名称。
    file.softspace如果用 print 输出后,必须跟一个空格符,则返回 False。否则返回 True。

    如下实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*- # 打开一个文件fo = open("foo.txt", "wb")print "文件名: ", fo.nameprint "是否已关闭 : ", fo.closedprint "访问模式 : ", fo.modeprint "末尾是否强制加空格 : ", fo.softspace

    以上实例输出结果:

    文件名:  foo.txt是否已关闭 :  False访问模式 :  wb末尾是否强制加空格 :  0

    Close()方法

    File对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

    当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

    语法:

    fileObject.close();

    例子:

    #coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("foo.txt", "wb")print "文件名: ", fo.name # 关闭打开的文件fo.close()

    以上实例输出结果:

    文件名:  foo.txt

    读写文件:

    file 对象提供了一系列方法,能让我们的文件访问更轻松。来看看如何使用 read() 和 write() 方法来读取和写入文件。

    write() 方法

    write() 方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python 字符串可以是二进制数据,而不是仅仅是文字。

    write() 方法不在字符串的结尾添加换行符 (' '):

    语法:

    fileObject.write(string);

    在这里,被传递的参数是要写入到已打开文件的内容。

    例子:

    #coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "wb")fo.write( "Python is a great language.
    Yeah its great!!
    "); # 关闭打开的文件fo.close()#!/usr/bin/python

    上述方法会创建 foo.txt 文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容:

    Python is a great language.Yeah its great!!

    read()方法

    read() 方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python 字符串可以是二进制数据,而不是仅仅是文字。

    语法:

    fileObject.read([count]);

    在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。

    例子:

    就用我们上面创建的文件 foo.txt。

    #coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "r+")str = fo.read(10);print "读取的字符串是: ", str# 关闭打开的文件fo.close()

    以上实例输出结果:

    读取的字符串是:  Python is

    文件位置:

    tell() 方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后:

    seek(offset [,from])方法改变当前文件的位置。Offset 变量表示要移动的字节数。From 变量指定开始移动字节的参考位置。

    如果 from 被设为 0,这意味着将文件的开头作为移动字节的参考位置。如果设为 1,则使用当前的位置作为参考位置。如果它被设为 2,那么该文件的末尾将作为参考位置。

    例子:

    就用我们上面创建的文件 foo.txt。

    #coding=utf-8#!/usr/bin/python # 打开一个文件fo = open("/tmp/foo.txt", "r+")str = fo.read(10);print "读取的字符串是: ", str # 查找当前位置position = fo.tell();print "当前文件位置: ", position # 把指针再次重新定位到文件开头position = fo.seek(0, 0);str = fo.read(10);print "重新读取字符串: ", str# 关闭打开的文件fo.close()

    以上实例输出结果:

    读取的字符串是:  Python is当前文件位置:  10重新读取字符串:  Python is

    重命名和删除文件

    Python 的 os 模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。

    要使用这个模块,你必须先导入它,然后可以调用相关的各种功能。

    rename() 方法:

    rename() 方法需要两个参数,当前的文件名和新文件名。

    语法:

    os.rename(current_file_name, new_file_name)

    例子:

    下例将重命名一个已经存在的文件 test1.txt。

    #coding=utf-8#!/usr/bin/pythonimport os # 重命名文件test1.txt到test2.txt。os.rename( "test1.txt", "test2.txt" )

    remove() 方法

    你可以用 remove() 方法删除文件,需要提供要删除的文件名作为参数。

    语法:

    os.remove(file_name)

    例子:

    下例将删除一个已经存在的文件 test2.txt。

    #coding=utf-8#!/usr/bin/pythonimport os # 删除一个已经存在的文件test2.txtos.remove("text2.txt")

    Python 里的目录:

    所有文件都包含在各个不同的目录下,不过 Python 也能轻松处理。os 模块有许多方法能帮你创建,删除和更改目录。

    mkdir() 方法

    可以使用 os 模块的 mkdir() 方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。

    语法:

    os.mkdir("newdir")

    例子:

    下例将在当前目录下创建一个新目录 test。

    #coding=utf-8#!/usr/bin/pythonimport os # 创建目录testos.mkdir("test")

    chdir() 方法

    可以用 chdir() 方法来改变当前的目录。chdir() 方法需要的一个参数是你想设成当前目录的目录名称。

    语法:

    os.chdir("newdir")

    例子:

    下例将进入 "/home/newdir" 目录。

    #coding=utf-8#!/usr/bin/pythonimport os # 将当前目录改为"/home/newdir"os.chdir("/home/newdir")

    getcwd() 方法:

    getcwd() 方法显示当前的工作目录。

    语法:

    os.getcwd()

    例子:

    下例给出当前目录:

    #coding=utf-8#!/usr/bin/pythonimport os # 给出当前的目录os.getcwd()

    rmdir()方法

    rmdir() 方法删除目录,目录名称以参数传递。

    在删除这个目录之前,它的所有内容应该先被清除。

    语法:

    os.rmdir('dirname')

    例子:

    以下是删除" /tmp/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。

    #coding=utf-8#!/usr/bin/pythonimport os # 删除”/tmp/test”目录os.rmdir( "/tmp/test"  )

    文件、目录相关的方法

    三个重要的方法来源能对 Windows 和 Unix 操作系统上的文件及目录进行一个广泛且实用的处理及操控,如下:

    • File 对象方法: file 对象提供了操作文件的一系列方法。
    • OS 对象方法: 提供了处理文件及目录的一系列方法。


    Python File(文件) 方法

     由于在线示例的限制,所有文件操作的方法都不能在线运行(运行会报错),建议在本地环境下运行相关代码

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

    序号方法及描述
    1

    file.close()

    关闭文件。关闭后文件不能再进行读写操作。

    2

    file.flush()

    刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

    3

    file.fileno()

    返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如 os 模块的 read 方法等一些底层操作上。

    4

    file.isatty()

    如果文件连接到一个终端设备返回 True,否则返回 False。

    5

    file.next()

    返回文件下一行。

    6

    file.read([size])

    从文件读取指定的字节数,如果未给定或为负则读取所有。

    7

    file.readline([size])

    读取整行,包括 " " 字符。

    8

    file.readlines([sizehint])

    读取所有行并返回列表,若给定 sizeint>0,返回总和大约为 sizeint 字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。

    9

    file.seek(offset[, whence])

    设置文件当前位置

    10

    file.tell()

    返回文件当前位置。

    11

    file.truncate([size])

    截取文件,截取的字节通过 size 指定,默认为当前文件位置。

    12

    file.write(str)

    将字符串写入文件,返回的是写入的字符。

    13

    file.writelines(sequence)

    向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。


    Python 异常处理

    Python 提供了两个非常重要的功能来处理 Python 程序在运行中出现的异常和错误。你可以使用该功能来调试 Python 程序。

    • 异常处理: 本站 Python 教程会具体介绍。
    • 断言 (Assertions): 本章 Python 教程会具体介绍。

    Python 标准异常

    异常名称描述
    BaseException所有异常的基类
    SystemExit解释器请求退出
    KeyboardInterrupt用户中断执行(通常是输入^C)
    Exception常规错误的基类
    StopIteration迭代器没有更多的值
    GeneratorExit生成器 (generator) 发生异常来通知退出
    StandardError所有的内建标准异常的基类
    ArithmeticError所有数值计算错误的基类
    FloatingPointError浮点计算错误
    OverflowError数值运算超出最大限制
    ZeroDivisionError除(或取模)零 (所有数据类型)
    AssertionError断言语句失败
    AttributeError对象没有这个属性
    EOFError没有内建输入,到达 EOF 标记
    EnvironmentError操作系统错误的基类
    IOError输入/输出操作失败
    OSError操作系统错误
    WindowsError系统调用失败
    ImportError导入模块/对象失败
    LookupError无效数据查询的基类
    IndexError序列中没有此索引(index)
    KeyError映射中没有这个键
    MemoryError内存溢出错误(对于 Python 解释器不是致命的)
    NameError未声明/初始化对象 (没有属性)
    UnboundLocalError访问未初始化的本地变量
    ReferenceError弱引用 (Weak reference) 试图访问已经垃圾回收了的对象
    RuntimeError一般的运行时错误
    NotImplementedError尚未实现的方法
    SyntaxErrorPython 语法错误
    IndentationError缩进错误
    TabErrorTab 和空格混用
    SystemError一般的解释器系统错误
    TypeError对类型无效的操作
    ValueError传入无效的参数
    UnicodeErrorUnicode 相关的错误
    UnicodeDecodeErrorUnicode 解码时的错误
    UnicodeEncodeErrorUnicode 编码时错误
    UnicodeTranslateErrorUnicode 转换时错误
    Warning警告的基类
    DeprecationWarning关于被弃用的特征的警告
    FutureWarning关于构造将来语义会有改变的警告
    OverflowWarning旧的关于自动提升为长整型 (long) 的警告
    PendingDeprecationWarning关于特性将会被废弃的警告
    RuntimeWarning可疑的运行时行为 (runtime behavior) 的警告
    SyntaxWarning可疑的语法的警告
    UserWarning用户代码生成的警告

    什么是异常?

    异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

    一般情况下,在 Python 无法正常处理程序时就会发生一个异常。

    异常是 Python 对象,表示一个错误。

    当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行。


    异常处理

    捕捉异常可以使用 try/except 语句。

    try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。

    如果你不想在异常发生时结束你的程序,只需在 try 里捕获它。

    语法:

    以下为简单的 try....except...else 的语法:

    try:<语句>        #运行别的代码except <名字>:<语句>        #如果在try部份引发了'名字'异常except <名字>,<数据>:<语句>        #如果引发了'名字'异常,获得附加的数据else:<语句>        #如果没有异常发生

    try 的工作原理是,当开始一个 try 语句后,Python 就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try 子句先执行,接下来会发生什么依赖于执行时是否出现异常。

    • 如果当 try 后的语句执行时发生异常,Python 就跳回到 try 并执行第一个匹配该异常的 except 子句,异常处理完毕,控制流就通过整个 try 语句(除非在处理异常时又引发新的异常)。
    • 如果在 try 后的语句里发生了异常,却没有匹配的 except 子句,异常将被递交到上层的 try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
    • 如果在 try 子句执行时没有发生异常,Python 将执行 else 语句后的语句(如果有 else 的话),然后控制流通过整个 try 语句。

    实例

    下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,且并未发生异常:

    #!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")except IOError:   print "Error: can't find file or read data"else:   print "Written content in the file successfully"   fh.close()

    以上程序输出结果:

     Written content in the file successfully

    实例

    下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:

    #!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")except IOError:   print "Error: can't find file or read data"else:   print "Written content in the file successfully"

    以上程序输出结果:

    Error: can't find file or read data

    使用 except 而不带任何异常类型

    你可以不带任何异常类型使用except,如下实例:

    try:   You do your operations here;   ......................except:   If there is any exception, then execute this block.   ......................else:   If there is no exception then execute this block. 

    以上方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。


    使用 except 而带多种异常类型

    你也可以使用相同的 except 语句来处理多个异常信息,如下所示:

    try:   You do your operations here;   ......................except(Exception1[, Exception2[,...ExceptionN]]]):   If there is any exception from the given exception list,    then execute this block.   ......................else:   If there is no exception then execute this block.  

    try-finally 语句

    try-finally 语句无论是否发生异常都将执行最后的代码。

    try:<语句>finally:<语句>    #退出try时总会执行raise

    注意:你可以使用 except 语句或者 finally 语句,但是两者不能同时使用。else 语句也不能与 finally 语句同时使用

    实例

    #!/usr/bin/pythontry:   fh = open("testfile", "w")   fh.write("This is my test file for exception handling!!")finally:   print "Error: can't find file or read data"

    如果打开的文件没有可写权限,输出如下所示:

    Error: can't find file or read data

    同样的例子也可以写成如下方式:

    #!/usr/bin/pythontry:   fh = open("testfile", "w")   try:      fh.write("This is my test file for exception handling!!")   finally:      print "Going to close the file"      fh.close()except IOError:   print "Error: can't find file or read data"

    当在 try 块中抛出一个异常,立即执行 finally 块代码。

    finally 块中的所有语句执行后,异常被再次提出,并执行 except 块代码。

    参数的内容不同于异常。


    异常的参数

    一个异常可以带上参数,可作为输出的异常信息参数。

    你可以通过 except 语句来捕获异常的参数,如下所示:

    try:   You do your operations here;   ......................except ExceptionType, Argument:   You can print value of Argument here...

    变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。

    元组通常包含错误字符串,错误数字,错误位置。

    实例

    以下为单个异常的实例:

    #!/usr/bin/python# 定义函数def temp_convert(var):   try:      return int(var)   except ValueError, Argument:      print "The argument does not contain numbers
    ", Argument# 调用函数temp_convert("xyz");

    以上程序执行结果如下:

    The argument does not contain numbersinvalid literal for int() with base 10: 'xyz'

    触发异常

    我们可以使用 raise 语句自己触发异常

    raise 语法格式如下:

    raise [Exception [, args [, traceback]]]

    语句中 Exception 是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。

    最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

    实例

    一个异常可以是一个字符串,类或对象。 Python 的内核提供的异常,大多数都是实例化的类,这是一个类的实例的参数。

    定义一个异常非常简单,如下所示:

    def functionName( level ):    if level < 1:        raise Exception("Invalid level!", level)        # 触发异常后,后面的代码就不会再执行

    注意:为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串。

    例如我们捕获以上异常,"except"语句如下所示:

    try:   Business Logic here...except "Invalid level!":   Exception handling here...else:   Rest of the code here...

    用户自定义异常

    通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自 Exception 类,通过直接或间接的方式。

    以下为与 RuntimeError 相关的实例,实例中创建了一个类,基类为 RuntimeError,用于在异常触发时输出更多的信息。

    在 try 语句块中,用户自定义的异常后执行 except 块语句,变量 e 是用于创建 Networkerror 类的实例。

    class Networkerror(RuntimeError):   def __init__(self, arg):      self.args = arg

    在你定义以上类后,你可以触发该异常,如下所示:

    try:   raise Networkerror("Bad hostname")except Networkerror,e:   print e.args

    异常处理代码执行说明:

    #!/usr/bin/python# -*- coding: UTF-8 -*-#This is note foe exceptiontry:  code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息#except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理  code  #这里执行异常处理的相关代码,打印输出等else:  #如果没有异常则执行else  code  #try部分被正常执行后执行的代码finally:  code  #退出try语句块总会执行的程序#函数中做异常检测def try_exception(num):  try:    return int(num)  except ValueError,arg:    print arg,"is not a number"  else:    print "this is a number inputs"try_exception('xxx')#输出异常值Invalide literal for int() with base 10: 'xxx' is not a number


    Python 面向对象

    Python 从设计之初就已经是一门面向对象的语言,正因为如此,在 Python 中创建一个类和对象是很容易的。本章节我们将详细介绍 Python 的面向对象编程。

    如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习 Python 的面向对象编程。

    接下来我们先来简单的了解下面向对象的一些基本特征。


    面向对象技术简介

    • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
    • 方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载。
    • 实例变量:定义在方法中的变量,只作用于当前实例的类。
    • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例:Dog 是一个 Animal)。
    • 实例化:创建一个类的实例,类的具体对象。
    • 方法:类中定义的函数。
    • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

    创建类

    使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾,如下实例:

    class ClassName:   '类的帮助信息'   #类文档字符串   class_suite  #类体

    类的帮助信息可以通过 ClassName.__doc__查看。

    class_suite 由类成员,方法,数据属性组成。

    实例

    以下是一个简单的 Python 类实例:

    #coding=utf-8class Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salary
    • empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
    • 第一种方法 __init__() 方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
    • self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

    self 代表类的实例,而非类

    类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

    class Test:    def prt(self):        print(self)        print(self.__class__)t = Test()t.prt()

    以上实例执行结果为:

    <__main__.Test instance at 0x10d066878>__main__.Test

    从执行结果可以很明显的看出,self代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

    self 不是 Python 关键字,我们把他换成 51coolma 也是可以正常执行的:

    实例:

    class Test:    def prt(51coolma):        print(51coolma)        print(51coolma.__class__)t = Test()t.prt()

    以上实例执行结果为:

    <__main__.Test instance at 0x10d066878>__main__.Test

    创建实例对象

    要创建一个类的实例,你可以使用类的名称,并通过__init__方法接受参数。

    "创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)

    访问属性

    您可以使用点 (.) 来访问对象的属性。使用如下类的名称访问类变量:

    emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

    完整实例:

    #coding=utf-8#!/usr/bin/pythonclass Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salary"创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

    执行以上代码输出结果如下:

    Name :  Zara ,Salary:  2000Name :  Manni ,Salary:  5000Total Employee 2

    你可以添加,删除,修改类的属性,如下所示:

    emp1.age = 7  # 添加一个 'age' 属性emp1.age = 8  # 修改 'age' 属性del emp1.age  # 删除 'age' 属性

    你也可以使用以下函数的方式来访问属性:

    • getattr(obj, name[, default]) : 访问对象的属性。
    • hasattr(obj,name) : 检查是否存在一个属性。
    • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
    • delattr(obj, name) : 删除属性。
    hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。getattr(emp1, 'age')    # 返回 'age' 属性的值setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8delattr(empl, 'age')    # 删除属性 'age'

    Python 内置类属性

    • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
    • __doc__ :类的文档字符串
    • __name__: 类名
    • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块 mymod 中,那么 className.__module__ 等于 mymod)
    • __bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

    Python 内置类属性调用实例如下:

    #coding=utf-8#!/usr/bin/pythonclass Employee:   '所有员工的基类'   empCount = 0   def __init__(self, name, salary):      self.name = name      self.salary = salary      Employee.empCount += 1      def displayCount(self):     print "Total Employee %d" % Employee.empCount   def displayEmployee(self):      print "Name : ", self.name,  ", Salary: ", self.salaryprint "Employee.__doc__:", Employee.__doc__print "Employee.__name__:", Employee.__name__print "Employee.__module__:", Employee.__module__print "Employee.__bases__:", Employee.__bases__print "Employee.__dict__:", Employee.__dict__

    执行以上代码输出结果如下:

    Employee.__doc__: 所有员工的基类Employee.__name__: EmployeeEmployee.__module__: __main__Employee.__bases__: ()Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': 'xe6x89x80xe6x9cx89xe5x91x98xe5xb7xa5xe7x9ax84xe5x9fxbaxe7xb1xbb', '__init__': <function __init__ at 0x10a939578>}

    Python 对象销毁(垃圾回收)

    同 Java 语言一样,Python 使用了引用计数这一简单技术来追踪内存中的对象。

    在 Python 内部记录着所有使用中的对象各有多少引用。

    一个内部跟踪变量,称为一个引用计数器。

    当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为 0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

    a = 40      # 创建对象  <40>b = a       # 增加引用, <40> 的计数c = [b]     # 增加引用.  <40> 的计数del a       # 减少引用 <40> 的计数b = 100     # 减少引用 <40> 的计数c[0] = -1   # 减少引用 <40> 的计数

    垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

    实例

    析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:

    #coding=utf-8#!/usr/bin/pythonclass Point:   def __init( self, x=0, y=0):      self.x = x      self.y = y   def __del__(self):      class_name = self.__class__.__name__      print class_name, "destroyed"pt1 = Point()pt2 = pt1pt3 = pt1print id(pt1), id(pt2), id(pt3) # 打印对象的iddel pt1del pt2del pt3

    以上实例运行结果如下:

    3083401324 3083401324 3083401324Point destroyed

    注意:通常你需要在单独的文件中定义一个类,

    类的继承

    面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

    需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

    在 Python 中继承中的一些特点:

    • 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
    • 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
    • 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

    如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

    语法:

    派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:

    class SubClassName (ParentClass1[, ParentClass2, ...]):   'Optional class documentation string'   class_suite

    实例:

    #coding=utf-8#!/usr/bin/pythonclass Parent:        # 定义父类   parentAttr = 100   def __init__(self):      print "调用父类构造函数"   def parentMethod(self):      print '调用父类方法'   def setAttr(self, attr):      Parent.parentAttr = attr   def getAttr(self):      print "父类属性 :", Parent.parentAttrclass Child(Parent): # 定义子类   def __init__(self):      print "调用子类构造方法"   def childMethod(self):      print '调用子类方法 child method'c = Child()          # 实例化子类c.childMethod()      # 调用子类的方法c.parentMethod()     # 调用父类方法c.setAttr(200)       # 再次调用父类的方法c.getAttr()          # 再次调用父类的方法

    以上代码执行结果如下:

    调用子类构造方法调用子类方法 child method调用父类方法父类属性 : 200

    你可以继承多个类

    class A:        # 定义类 A.....class B:         # 定义类 B.....class C(A, B):   # 继承类 A 和 B.....

    你可以使用 issubclass() 或者 isinstance() 方法来检测。

    • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
    • isinstance(obj, class) 布尔函数如果obj是Class类的实例对象或者是一个 class 子类的实例对象则返回 true。

    方法重写

    如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法:

    实例:

    #coding=utf-8#!/usr/bin/pythonclass Parent:        # 定义父类   def myMethod(self):      print '调用父类方法'class Child(Parent): # 定义子类   def myMethod(self):      print '调用子类方法'c = Child()          # 子类实例c.myMethod()         # 子类调用重写方法

    执行以上代码输出结果如下:

    调用子类方法

    基础重载方法

    下表列出了一些通用的功能,你可以在自己的类重写:

    序号方法, 描述 & 简单的调用
    1__init__ ( self [,args...] )
    构造函数
    简单的调用方法: obj = className(args)
    2__del__( self )
    析构方法, 删除一个对象
    简单的调用方法 : dell obj
    3__repr__( self )
    转化为供解释器读取的形式
    简单的调用方法 : repr(obj)
    4__str__( self )
    用于将值转化为适于人阅读的形式
    简单的调用方法 : str(obj)
    5__cmp__ ( self, x )
    对象比较
    简单的调用方法 : cmp(obj, x)

    运算符重载

    Python 同样支持运算符重载,实例如下:

    #!/usr/bin/pythonclass Vector:   def __init__(self, a, b):      self.a = a      self.b = b   def __str__(self):      return 'Vector (%d, %d)' % (self.a, self.b)      def __add__(self,other):      return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)v2 = Vector(5,-2)print v1 + v2

    以上代码执行结果如下所示:

    Vector(7,8)

    类属性与方法

    类的私有属性

    __private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs

    类的方法

    在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

    类的私有方法

    __private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

    实例

    #coding=utf-8#!/usr/bin/pythonclass JustCounter:	__secretCount = 0  # 私有变量	publicCount = 0    # 公开变量	def count(self):		self.__secretCount += 1		self.publicCount += 1		print self.__secretCountcounter = JustCounter()counter.count()counter.count()print counter.publicCountprint counter.__secretCount  # 报错,实例不能访问私有变量

    Python 通过改变名称来包含类名:

    122Traceback (most recent call last):  File "test.py", line 17, in <module>    print counter.__secretCount  # 报错,实例不能访问私有变量AttributeError: JustCounter instance has no attribute '__secretCount'

    Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性,将如下代码替换以上代码的最后一行代码:

    .........................print counter._JustCounter__secretCount

    执行以上代码,执行结果如下:

    1222

    单下划线、双下划线、头尾双下划线说明:

    • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
    • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
    • __foo: 双下划线的表示的是私有类型 (private) 的变量, 只能是允许这个类本身进行访问了。

    Python 正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自 1.5 版本起增加了 re 模块,它提供 Perl 风格的正则表达式模式。

    re 模块使 Python 语言拥有全部的正则表达式功能。

    compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

    re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

    本章节主要介绍 Python 中常用的正则表达式处理函数。


    re.match 函数

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。

    函数语法

    re.match(pattern, string, flags=0)

    函数参数说明:

    参数描述
    pattern匹配的正则表达式
    string要匹配的字符串。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

    匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。

    我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

    匹配对象方法描述
    group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
    groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

    实例:

    #!/usr/bin/pythonimport reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:   print "matchObj.group() : ", matchObj.group()   print "matchObj.group(1) : ", matchObj.group(1)   print "matchObj.group(2) : ", matchObj.group(2)else:   print "No match!!"

    以上实例执行结果如下:

    matchObj.group() :  Cats are smarter than dogsmatchObj.group(1) :  CatsmatchObj.group(2) :  smarter

    re.search方法

    re.search 会在字符串内查找模式匹配,直到找到第一个匹配。

    函数语法:

    re.search(pattern, string, flags=0)

    函数参数说明:

    参数描述
    pattern匹配的正则表达式
    string要匹配的字符串。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

    匹配成功 re.search 方法返回一个匹配的对象,否则返回 None。

    我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

    匹配对象方法描述
    group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
    groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

    实例:

    #!/usr/bin/pythonimport reline = "Cats are smarter than dogs";searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:   print "searchObj.group() : ", searchObj.group()   print "searchObj.group(1) : ", searchObj.group(1)   print "searchObj.group(2) : ", searchObj.group(2)else:   print "Nothing found!!"

    以上实例执行结果如下:

    searchObj.group() :  Cats are smarter than dogssearchObj.group(1) :  CatssearchObj.group(2) :  smarter

    re.match 与 re.search 的区别

    re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None;而 re.search 匹配整个字符串,直到找到一个匹配。

    实例:

    #!/usr/bin/pythonimport reline = "Cats are smarter than dogs";matchObj = re.match( r'dogs', line, re.M|re.I)if matchObj:   print "match --> matchObj.group() : ", matchObj.group()else:   print "No match!!"matchObj = re.search( r'dogs', line, re.M|re.I)if matchObj:   print "search --> matchObj.group() : ", matchObj.group()else:   print "No match!!"

    以上实例运行结果如下:

    No match!!search --> matchObj.group() :  dogs

    检索和替换

    Python 的 re 模块提供了 re.sub 用于替换字符串中的匹配项。

    语法:

    re.sub(pattern, repl, string, max=0)

    返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。

    可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

    实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*- import re phone = "2004-959-559 # 这是一个国外电话号码" # 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone)print "电话号码是: ", num # 删除非数字(-)的字符串 num = re.sub(r'D', "", phone)print "电话号码是 : ", num

    以上实例执行结果如下:

    电话号码 :  2004-959-559电话号码 :  2004959559

    repl 参数是一个函数

    以下实例中将字符串中的匹配的数字乘以 2:

    实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*- import re # 将匹配的数字乘以 2def double(matched):    value = int(matched.group('value'))    return str(value * 2) s = 'A23G4HFD567'print(re.sub('(?P<value>d+)', double, s))

    执行输出结果为:

    A46G8HFD1134

    re.compile 函数

    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

    语法格式为:

    re.compile(pattern[, flags])

    参数:

    • pattern : 一个字符串形式的正则表达式
    • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
      1. re.I 忽略大小写
      2. re.L 表示特殊字符集 w, W, , B, s, S 依赖于当前环境
      3. re.M 多行模式
      4. re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
      5. re.U 表示特殊字符集 w, W, , B, d, D, s, S 依赖于 Unicode 字符属性数据库
      6. re.X 为了增加可读性,忽略空格和 # 后面的注释

    实例

    >>>import re>>> pattern = re.compile(r'd+')                    # 用于匹配至少一个数字>>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配>>> print mNone>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配>>> print mNone>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配>>> print m                                         # 返回一个 Match 对象<_sre.SRE_Match object at 0x10a42aac0>>>> m.group(0)   # 可省略 0'12'>>> m.start(0)   # 可省略 03>>> m.end(0)     # 可省略 05>>> m.span(0)    # 可省略 0(3, 5)

    在上面,当匹配成功时返回一个 match 对象,其中:

    • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
    • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
    • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
    • span([group]) 方法返回 (start(group), end(group))。

    再看看一个例子:

    >>>import re>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写>>> m = pattern.match('Hello World Wide Web')>>> print m                               # 匹配成功,返回一个 Match 对象<_sre.SRE_Match object at 0x10bea83e8>>>> m.group(0)                            # 返回匹配成功的整个子串'Hello World'>>> m.span(0)                             # 返回匹配成功的整个子串的索引(0, 11)>>> m.group(1)                            # 返回第一个分组匹配成功的子串'Hello'>>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引(0, 5)>>> m.group(2)                            # 返回第二个分组匹配成功的子串'World'>>> m.span(2)                             # 返回第二个分组匹配成功的子串(6, 11)>>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)('Hello', 'World')>>> m.group(3)                            # 不存在第三个分组Traceback (most recent call last):  File "<stdin>", line 1, in <module>IndexError: no such group

    findall

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

    注意: match 和 search 是匹配一次 findall 匹配所有。

    语法格式为:

    findall(string[, pos[, endpos]])

    参数:

    • string : 待匹配的字符串。
    • pos : 可选参数,指定字符串的起始位置,默认为 0。
    • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

    查找字符串中的所有数字:

    # -*- coding:UTF8 -*- import re pattern = re.compile(r'd+')   # 查找数字result1 = pattern.findall('school 123 google 456')result2 = pattern.findall('sch88ool123google456', 0, 10) print(result1)print(result2)

    输出结果:

    ['123', '456']['88', '12']

    re.finditer

    和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

    re.finditer(pattern, string, flags=0)

    参数:

    参数描述
    pattern匹配的正则表达式
    string要匹配的字符串。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

    实例:

    # -*- coding: UTF-8 -*- import re it = re.finditer(r"d+","12a32bc43jf3") for match in it:     print (match.group() )

    输出结果:

    12 32 43 3

    re.split

    split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

    re.split(pattern, string[, maxsplit=0, flags=0])

    参数:

    参数描述
    pattern匹配的正则表达式
    string要匹配的字符串。
    maxsplit分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
    flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

    实例:

    >>>import re>>> re.split('W+', '51coolma, 51coolma, 51coolma.')['51coolma', '51coolma', '51coolma', '']>>> re.split('(W+)', ' 51coolma, 51coolma, 51coolma.') ['', ' ', '51coolma', ', ', '51coolma', ', ', '51coolma', '.', '']>>> re.split('W+', ' 51coolma, 51coolma, 51coolma.', 1) ['', '51coolma, 51coolma, 51coolma.'] >>> re.split('a*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割['hello world']



    正则表达式修饰符 - 可选标志

    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

    修饰符描述
    re.I使匹配对大小写不敏感
    re.L做本地化识别( locale-aware )匹配
    re.M多行匹配,影响 ^ 和 $
    re.S使 . 匹配包括换行在内的所有字符
    re.U根据 Unicode 字符集解析字符。这个标志影响 w, W, , B.
    re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

    正则表达式模式

    模式字符串使用特殊的语法来表示一个正则表达式:

    字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

    多数字母和数字前加一个反斜杠时会拥有不同的含义。

    标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

    反斜杠本身需要使用反斜杠转义。

    由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。

    下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

    模式描述
    ^匹配字符串的开头
    $匹配字符串的末尾。
    .匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符。
    [...]用来表示一组字符,单独列出:[amk] 匹配 'a','m' 或 'k'
    [^...]不在[]中的字符:[^abc] 匹配除了 a,b,c 之外的字符。
    re*匹配 0 个或多个的表达式。
    re+匹配 1 个或多个的表达式。
    re?匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式
    re{ n}
    re{ n,}精确匹配 n 个前面表达式。
    re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
    a| b匹配 a 或 b
    (re)G 匹配括号内的表达式,也表示一个组
    (?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
    (?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
    (?: re)类似 (...), 但是不表示一个组
    (?imx: re)在括号中使用 i, m, 或 x 可选标志
    (?-imx: re)在括号中不使用 i, m, 或 x 可选标志
    (?#...)注释.
    (?= re)前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
    (?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
    (?> re)匹配的独立模式,省去回溯。
    w匹配字母数字
    W匹配非字母数字
    s匹配任意空白字符,等价于 [ f].
    S匹配任意非空字符
    d匹配任意数字,等价于 [0-9].
    D匹配任意非数字
    A匹配字符串开始
    匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
    z匹配字符串结束
    G匹配最后匹配完成的位置。
    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
    B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
    , , 等.匹配一个换行符。匹配一个制表符。等
    1...9匹配第n个分组的子表达式。
    10匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

    正则表达式实例

    字符匹配

    实例描述
    python匹配 "python".

    字符类

    实例描述
    [Pp]ython匹配 "Python" 或 "python"
    rub[ye]匹配 "ruby" 或 "rube"
    [aeiou]匹配中括号内的任意一个字母
    [0-9]匹配任何数字。类似于 [0123456789]
    [a-z]匹配任何小写字母
    [A-Z]匹配任何大写字母
    [a-zA-Z0-9]匹配任何字母及数字
    [^aeiou]除了 aeiou 字母以外的所有字符
    [^0-9]匹配除了数字外的字符

    特殊字符类

    实例描述
    .匹配除 " " 之外的任何单个字符。要匹配包括 ' ' 在内的任何字符,请使用象 '[. ]' 的模式。
    d匹配一个数字字符。等价于 [0-9]。
    D匹配一个非数字字符。等价于 [^0-9]。
    s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。
    S匹配任何非空白字符。等价于 [^ f v]。
    w匹配包括下划线的任何单词字符。等价于 '[A-Za-z0-9_]'。
    W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。


    python操作mysql数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

    Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:

    • GadFly
    • mSQL
    • MySQL
    • PostgreSQL
    • Microsoft SQL Server 2000
    • Informix
    • Interbase
    • Oracle
    • Sybase

    你可以访问 Python数据库接口及API 查看详细的支持数据库列表。

    不同的数据库你需要下载不同的 DB API 模块,例如你需要访问 Oracle 数据库和 Mysql 数据,你需要下载 Oracle 和 MySQL 数据库模块。

    DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。

    Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。

    Python DB-API 使用流程:

    • 引入 API 模块。
    • 获取与数据库的连接。
    • 执行 SQL 语句和存储过程。
    • 关闭数据库连接。

    什么是 MySQLdb?

    MySQLdb 是用于 Python 链接 Mysql 数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。


    如何安装 MySQLdb?

    为了用 DB-API 编写 MySQL 脚本,必须确保已经安装了 MySQL。复制以下代码,并执行:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb

    如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:

    Traceback (most recent call last):  File "test.py", line 3, in <module>    import MySQLdbImportError: No module named MySQLdb

    安装 MySQLdb,请访问 http://sourceforge.net/projects/mysql-python ,(Linux 平台可以访问:https://pypi.python.org/pypi/MySQL-python) 从这里可选择适合您的平台的安装包,分为预编译的二进制文件和源代码安装包。

    如果您选择二进制文件发行版本的话,安装过程基本安装提示即可完成。如果从源代码进行安装的话,则需要切换到 MySQLdb 发行版本的顶级目录,并键入下列命令:

    $ gunzip MySQL-python-1.2.2.tar.gz$ tar -xvf MySQL-python-1.2.2.tar$ cd MySQL-python-1.2.2$ python setup.py build$ python setup.py install

    注意:请确保您有 root 权限来安装上述模块。


    数据库连接

    连接数据库前,请先确认以下事项:

    • 您已经创建了数据库 TESTDB.
    • 在 TESTDB 数据库中您已经创建了表 EMPLOYEE
    • EMPLOYEE 表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
    • 连接数据库 TESTDB 使用的用户名为 "testuser" ,密码为 "test123",你可以可以自己设定或者直接使用 root 用户名及其密码,Mysql 数据库用户授权请使用 Grant 命令。
    • 在你的机子上已经安装了 Python MySQLdb 模块。
    • 如果您对 sql 语句不熟悉,可以访问我们的 SQL基础教程

    实例:

    以下实例链接 Mysql 的 TESTDB 数据库:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 使用execute方法执行SQL语句cursor.execute("SELECT VERSION()")# 使用 fetchone() 方法获取一条数据库。data = cursor.fetchone()print "Database version : %s " % data# 关闭数据库连接db.close()

    执行以上脚本输出结果如下:

    Database version : 5.0.45

    创建数据库表

    如果数据库连接存在我们可以使用 execute() 方法来为数据库创建表,如下所示创建表 EMPLOYEE:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# 如果数据表已经存在使用 execute() 方法删除表。cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")# 创建数据表SQL语句sql = """CREATE TABLE EMPLOYEE (         FIRST_NAME  CHAR(20) NOT NULL,         LAST_NAME  CHAR(20),         AGE INT,           SEX CHAR(1),         INCOME FLOAT )"""cursor.execute(sql)# 关闭数据库连接db.close()

    数据库插入操作

    以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句sql = """INSERT INTO EMPLOYEE(FIRST_NAME,         LAST_NAME, AGE, SEX, INCOME)         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""try:   # 执行sql语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # Rollback in case there is any error   db.rollback()# 关闭数据库连接db.close()

    以上例子也可以写成如下形式:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 插入语句sql = "INSERT INTO EMPLOYEE(FIRST_NAME,        LAST_NAME, AGE, SEX, INCOME)        VALUES ('%s', '%s', '%d', '%c', '%d' )" %        ('Mac', 'Mohan', 20, 'M', 2000)try:   # 执行sql语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭数据库连接db.close()

    实例:

    以下代码使用变量向 SQL 语句中传递参数:

    ..................................user_id = "test123"password = "password"con.execute('insert into Login values("%s", "%s")' %              (user_id, password))..................................

    数据库查询操作

    Python 查询 Mysql 使用 fetchone() 方法获取单条数据, 使用 fetchall() 方法获取多条数据。

    • fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
    • fetchall(): 接收全部的返回结果行.
    • rowcount:  这是一个只读属性,并返回执行 execute() 方法后影响的行数。

    实例:

    查询 EMPLOYEE 表中 salary(工资)字段大于 1000 的所有数据:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 查询语句sql = "SELECT * FROM EMPLOYEE        WHERE INCOME > '%d'" % (1000)try:   # 执行SQL语句   cursor.execute(sql)   # 获取所有记录列表   results = cursor.fetchall()   for row in results:      fname = row[0]      lname = row[1]      age = row[2]      sex = row[3]      income = row[4]      # 打印结果      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" %              (fname, lname, age, sex, income )except:   print "Error: unable to fecth data"# 关闭数据库连接db.close()

    以上脚本执行结果如下:

    fname=Mac, lname=Mohan, age=20, sex=M, income=2000

    数据库更新操作

    更新操作用于更新数据表的的数据,以下实例将 TESTDB 表中的 SEX 字段全部修改为 'M',AGE 字段递增 1:

    # encoding: utf-8#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 更新语句sql = "UPDATE EMPLOYEE SET AGE = AGE + 1        WHERE SEX = '%c'" % ('M')try:   # 执行SQL语句   cursor.execute(sql)   # 提交到数据库执行   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭数据库连接db.close()

    删除操作

    删除操作用于删除数据表中的数据,以下实例演示了删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据:

    #!/usr/bin/python# -*- coding: UTF-8 -*-import MySQLdb# 打开数据库连接db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )# 使用cursor()方法获取操作游标 cursor = db.cursor()# SQL 删除语句sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)try:   # 执行SQL语句   cursor.execute(sql)   # 提交修改   db.commit()except:   # 发生错误时回滚   db.rollback()# 关闭连接db.close()

    执行事务

    事务机制可以确保数据一致性。

    事务应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。

    • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
    • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    • 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。

    实例:

    # SQL删除记录语句sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)try:   # 执行SQL语句   cursor.execute(sql)   # 向数据库提交   db.commit()except:   # 发生错误时回滚   db.rollback()

    对于支持事务的数据库, 在 Python 数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。

    commit() 方法游标的所有更新操作,rollback() 方法回滚当前游标的所有操作。每一个方法都开始了一个新的事务。


    错误处理

    DB API 中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常:

    异常描述
    Warning当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
    Error警告以外所有其他错误类。必须是 StandardError 的子类。
    InterfaceError当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是 Error 的子类。
    DatabaseError和数据库有关的错误发生时触发。 必须是 Error 的子类。
    DataError当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是 DatabaseError 的子类。
    OperationalError指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是 DatabaseError 的子类。
    IntegrityError完整性相关的错误,例如外键检查失败等。必须是 DatabaseError 子类。
    InternalError数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是 DatabaseError 子类。
    ProgrammingError程序错误,例如数据表(table)没找到或已存在、SQL 语句语法错误、 参数数量错误等等。必须是 DatabaseError 的子类。
    NotSupportedError不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用 .rollback() 函数,然而数据库并不支持事务或者事务已关闭。 必须是  DatabaseError 的子类。

    Python 网络编程

    Python 提供了两个级别访问的网络服务。:

    • 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。
    • 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

    什么是 Socket?

    Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。


    socket()函数

    Python 中,我们用 socket()函数来创建套接字,语法格式如下:

    socket.socket([family[, type[, proto]]])

    参数

    • family: 套接字家族可以使 AF_UNIX 或者 AF_INET
    • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM
    • protocol: 一般不填默认为 0.

    Socket 对象(内建)方法

    函数描述
    服务器端套接字
    s.bind()绑定地址(host,port)到套接字, 在 AF_INET 下, 以元组(host,port)的形式表示地址。
    s.listen()开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,大部分应用程序设为 5 就可以了。
    s.accept()被动接受 TCP 客户端连接,(阻塞式)等待连接的到来
    客户端套接字
    s.connect()主动初始化 TCP 服务器连接,。一般 address 的格式为元组(hostname, port),如果连接出错,返回 socket.error 错误。
    s.connect_ex()connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常
    公共用途的套接字函数
    s.recv()接收 TCP 数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量。flag 提供有关消息的其他信息,通常可以忽略。
    s.send()发送 TCP 数据,将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于 string 的字节大小。
    s.sendall()完整发送 TCP 数据,完整发送 TCP 数据。将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回 None,失败则抛出异常。
    s.recvform()接收 UDP 数据,与 recv() 类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。
    s.sendto()发送 UDP 数据,将数据发送到套接字,address 是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。
    s.close()关闭套接字
    s.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
    s.getsockname()返回套接字自己的地址。通常是一个元组 (ipaddr,port)
    s.setsockopt(level,optname,value)设置给定套接字选项的值。
    s.getsockopt(level,optname[.buflen])返回套接字选项的值。
    s.settimeout(timeout)设置套接字操作的超时期,timeout 是一个浮点数,单位是秒。值为 None 表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 connect())
    s.gettimeout()返回当前超时期的值,单位是秒,如果没有设置超时期,则返回 None。
    s.fileno()返回套接字的文件描述符。
    s.setblocking(flag)如果 flag 为 0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常。
    s.makefile()创建一个与该套接字相关连的文件

    简单实例

    服务端

    我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。

    现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port (端口)

    接着,我们调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。

    完整代码如下:

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:server.pyimport socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接while True:    c, addr = s.accept()     # 建立客户端连接。    print '连接地址:', addr    c.send('欢迎访问W3Cschool教程!')    c.close()                # 关闭连接

    客户端

    接下来我们写一个简单的客户端实例连接到以上创建的服务。端口号为 12345。

    socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname 端口为 port 的服务商。连接后我们就可以从服务端后期数据,记住,操作完成后需要关闭连接。

    完整代码如下:

    #!/usr/bin/python# -*- coding: UTF-8 -*-# 文件名:client.pyimport socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口好s.connect((host, port))print s.recv(1024)s.close()  

    现在我们打开连个终端,第一个终端执行 server.py 文件:

    $ python server.py

    第二个终端执行 client.py 文件:

    $ python client.py 欢迎访问W3Cschool教程!

    这是我们再打开第一个终端,就会看到有以下信息输出:

    连接地址: ('192.168.0.118', 62461)

    Python Internet 模块

    以下列出了 Python 网络编程的一些重要模块:

    协议功能用处端口号Python 模块
    HTTP网页访问80httplib, urllib, xmlrpclib
    NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
    FTP文件传输20ftplib, urllib
    SMTP发送邮件25smtplib
    POP3接收邮件110poplib
    IMAP4获取邮件143imaplib
    Telnet命令行23telnetlib
    Gopher信息查找70gopherlib, urllib

    更多内容可以参阅官网的 Python Socket Library and Modules

    Python 使用 SMTP 发送邮件

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

    python 的 smtplib 提供了一种很方便的途径发送电子邮件。它对 smtp 协议进行了简单的封装。

    Python 创建 SMTP 对象语法如下:

    import smtplibsmtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

    参数说明:

    • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: 51coolma.cn,这个是可选参数。
    • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为 25。
    • local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

    Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

    SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

    参数说明:

    • from_addr: 邮件发送者地址。
    • to_addrs: 字符串列表,邮件发送地址。
    • msg: 发送消息

    这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

    实例

    以下是一个使用 Python 发送邮件简单的实例:

    #!/usr/bin/pythonimport smtplibsender = 'from@fromdomain.com'receivers = ['to@todomain.com']message = """From: From Person <from@fromdomain.com>To: To Person <to@todomain.com>Subject: SMTP e-mail testThis is a test e-mail message."""try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, receivers, message)            print "Successfully sent email"except SMTPException:   print "Error: unable to send email"

    使用 Python 发送 HTML 格式的邮件

    Python 发送 HTML 格式的邮件与发送纯文本消息的邮件不同之处就是将 MIMEText 中 _subtype 设置为 html。具体代码如下:

    import smtplib  from email.mime.text import MIMEText  mailto_list=["YYY@YYY.com"] mail_host="smtp.XXX.com"  #设置服务器mail_user="XXX"    #用户名mail_pass="XXXX"   #口令 mail_postfix="XXX.com"  #发件箱的后缀  def send_mail(to_list,sub,content):  #to_list:收件人;sub:主题;content:邮件内容    me="hello"+"<"+mail_user+"@"+mail_postfix+">"   #这里的hello可以任意设置,收到信后,将按照设置显示    msg = MIMEText(content,_subtype='html',_charset='gb2312')    #创建一个实例,这里设置为html格式邮件    msg['Subject'] = sub    #设置主题    msg['From'] = me      msg['To'] = ";".join(to_list)      try:          s = smtplib.SMTP()          s.connect(mail_host)  #连接smtp服务器        s.login(mail_user,mail_pass)  #登陆服务器        s.sendmail(me, to_list, msg.as_string())  #发送邮件        s.close()          return True      except Exception, e:          print str(e)          return False  if __name__ == '__main__':      if send_mail(mailto_list,"hello","<a href='http://www.51coolma.cn/'>W3Cschool</a>"):          print "发送成功"      else:          print "发送失败"  

    或者你也可以在消息体中指定 Content-type 为 text/html,如下实例:

    #!/usr/bin/pythonimport smtplibmessage = """From: From Person <from@fromdomain.com>To: To Person <to@todomain.com>MIME-Version: 1.0Content-type: text/htmlSubject: SMTP HTML e-mail testThis is an e-mail message to be sent in HTML format<b>This is HTML message.</b><h1>This is headline.</h1>"""try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, receivers, message)            print "Successfully sent email"except SMTPException:   print "Error: unable to send email"

    Python 发送带附件的邮件

    发送带附件的邮件,首先要创建 MIMEMultipart() 实例,然后构造附件,如果有多个附件,可依次构造,最后利用 smtplib.smtp 发送。

    from email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimport smtplib#创建一个带附件的实例msg = MIMEMultipart()#构造附件1att1 = MIMEText(open('d:123.rar', 'rb').read(), 'base64', 'gb2312')att1["Content-Type"] = 'application/octet-stream'att1["Content-Disposition"] = 'attachment; filename="123.doc"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(att1)#构造附件2att2 = MIMEText(open('d:123.txt', 'rb').read(), 'base64', 'gb2312')att2["Content-Type"] = 'application/octet-stream'att2["Content-Disposition"] = 'attachment; filename="123.txt"'msg.attach(att2)#加邮件头msg['to'] = 'YYY@YYY.com'msg['from'] = 'XXX@XXX.com'msg['subject'] = 'hello world'#发送邮件try:    server = smtplib.SMTP()    server.connect('smtp.XXX.com')    server.login('XXX','XXXXX')#XXX为用户名,XXXXX为密码    server.sendmail(msg['from'], msg['to'],msg.as_string())    server.quit()    print '发送成功'except Exception, e:      print str(e) 

    以下实例指定了 Content-type header 为 multipart/mixed,并发送 /tmp/test.txt 文本文件:

    #!/usr/bin/pythonimport smtplibimport base64filename = "/tmp/test.txt"# 读取文件内容并使用 base64 编码fo = open(filename, "rb")filecontent = fo.read()encodedcontent = base64.b64encode(filecontent)  # base64sender = 'webmaster@tutorialpoint.com'reciever = 'amrood.admin@gmail.com'marker = "AUNIQUEMARKER"body ="""This is a test email to send an attachement."""# 定义头部信息part1 = """From: From Person <me@fromdomain.net>To: To Person <amrood.admin@gmail.com>Subject: Sending AttachementMIME-Version: 1.0Content-Type: multipart/mixed; boundary=%s--%s""" % (marker, marker)# 定义消息动作part2 = """Content-Type: text/plainContent-Transfer-Encoding:8bit%s--%s""" % (body,marker)# 定义附近部分part3 = """Content-Type: multipart/mixed; name="%s"Content-Transfer-Encoding:base64Content-Disposition: attachment; filename=%s%s--%s--""" %(filename, filename, encodedcontent, marker)message = part1 + part2 + part3try:   smtpObj = smtplib.SMTP('localhost')   smtpObj.sendmail(sender, reciever, message)   print "Successfully sent email"except Exception:   print "Error: unable to send email"

    Python 多线程

    多线程类似于同时执行多个不同程序,多线程运行有如下优点:

    • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
    • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
    • 程序的运行速度可能加快
    • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

    线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    每个线程都有他自己的一组 CPU 寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

    指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

    • 线程可以被抢占(中断)。
    • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

    开始学习 Python 线程

    Python 中使用线程有两种方式:函数或者用类来包装线程对象。

    函数式:调用 thread 模块中的 start_new_thread() 函数来产生新线程。语法如下:

    thread.start_new_thread ( function, args[, kwargs] )

    参数说明:

    • function - 线程函数。
    • args - 传递给线程函数的参数,他必须是个 tuple 类型。
    • kwargs - 可选参数。

    实例:

    #!/usr/bin/python# -*- coding: UTF-8 -*-import threadimport time# 为线程定义一个函数def print_time( threadName, delay):   count = 0   while count < 5:      time.sleep(delay)      count += 1      print "%s: %s" % ( threadName, time.ctime(time.time()) )# 创建两个线程try:   thread.start_new_thread( print_time, ("Thread-1", 2, ) )   thread.start_new_thread( print_time, ("Thread-2", 4, ) )except:   print "Error: unable to start thread"while 1:   pass

    执行以上程序输出结果如下:

    Thread-1: Thu Jan 22 15:42:17 2009Thread-1: Thu Jan 22 15:42:19 2009Thread-2: Thu Jan 22 15:42:19 2009Thread-1: Thu Jan 22 15:42:21 2009Thread-2: Thu Jan 22 15:42:23 2009Thread-1: Thu Jan 22 15:42:23 2009Thread-1: Thu Jan 22 15:42:25 2009Thread-2: Thu Jan 22 15:42:27 2009Thread-2: Thu Jan 22 15:42:31 2009Thread-2: Thu Jan 22 15:42:35 2009

    线程的结束一般依靠线程函数的自然结束;也可以在线程函数中调用 thread.exit(),他抛出 SystemExit exception,达到退出线程的目的。


    线程模块

    Python 通过两个标准库 thread 和 threading 提供对线程的支持。thread 提供了低级别的、原始的线程以及一个简单的锁。

    thread 模块提供的其他方法:

    • threading.currentThread(): 返回当前的线程变量。
    • threading.enumerate(): 返回一个包含正在运行的线程的 list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    • threading.activeCount(): 返回正在运行的线程数量,与 len(threading.enumerate()) 有相同的结果。

    除了使用方法外,线程模块同样提供了 Thread 类来处理线程,Thread 类提供了以下方法:

    • run():  用以表示线程活动的方法。
    • start(): 启动线程活动。

    • join([time]):  等待至线程中止。这阻塞调用线程直至线程的 join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
    • isAlive():  返回线程是否活动的。
    • getName():  返回线程名。
    • setName():  设置线程名。

    使用 Threading 模块创建线程

    使用 Threading 模块创建线程,直接从 threading.Thread 继承,然后重写 __init__ 方法和 run() 方法:

    #coding=utf-8#!/usr/bin/pythonimport threadingimport timeexitFlag = 0class myThread (threading.Thread):   #继承父类threading.Thread    def __init__(self, threadID, name, counter):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.counter = counter    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数         print "Starting " + self.name        print_time(self.name, self.counter, 5)        print "Exiting " + self.namedef print_time(threadName, delay, counter):    while counter:        if exitFlag:            thread.exit()        time.sleep(delay)        print "%s: %s" % (threadName, time.ctime(time.time()))        counter -= 1# 创建新线程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 开启线程thread1.start()thread2.start()print "Exiting Main Thread"

    以上程序执行结果如下;

    Starting Thread-1Starting Thread-2Exiting Main ThreadThread-1: Thu Mar 21 09:10:03 2013Thread-1: Thu Mar 21 09:10:04 2013Thread-2: Thu Mar 21 09:10:04 2013Thread-1: Thu Mar 21 09:10:05 2013Thread-1: Thu Mar 21 09:10:06 2013Thread-2: Thu Mar 21 09:10:06 2013Thread-1: Thu Mar 21 09:10:07 2013Exiting Thread-1Thread-2: Thu Mar 21 09:10:08 2013Thread-2: Thu Mar 21 09:10:10 2013Thread-2: Thu Mar 21 09:10:12 2013Exiting Thread-2

    线程同步

    如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

    使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:

    多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。

    考虑这样一种情况:一个列表里所有元素都是 0,线程 "set" 从后向前把所有元素改成 1,而线程 "print" 负责从前往后读取列表并打印。

    那么,可能线程"set"开始改的时候,线程"print"便来打印列表了,输出就成了一半 0 一半 1,这就是数据的不同步。为了避免这种情况,引入了锁的概念。

    锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如 "print" 获得锁定了,那么就让线程 "set" 暂停,也就是同步阻塞;等到线程 "print" 访问完毕,释放锁以后,再让线程 "set" 继续。

    经过这样的处理,打印列表时要么全部输出 0,要么全部输出 1,不会再出现一半 0 一半 1 的尴尬场面。

    实例:

    #coding=utf-8#!/usr/bin/pythonimport threadingimport timeclass myThread (threading.Thread):    def __init__(self, threadID, name, counter):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.counter = counter    def run(self):        print "Starting " + self.name       # 获得锁,成功获得锁定后返回True       # 可选的timeout参数不填时将一直阻塞直到获得锁定       # 否则超时后将返回False        threadLock.acquire()        print_time(self.name, self.counter, 3)        # 释放锁        threadLock.release()def print_time(threadName, delay, counter):    while counter:        time.sleep(delay)        print "%s: %s" % (threadName, time.ctime(time.time()))        counter -= 1threadLock = threading.Lock()threads = []# 创建新线程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 开启新线程thread1.start()thread2.start()# 添加线程到线程列表threads.append(thread1)threads.append(thread2)# 等待所有线程完成for t in threads:    t.join()print "Exiting Main Thread"

    线程优先级队列( Queue)

    Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括 FIFO(先入先出)队列 Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列 PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

    Queue 模块中的常用方法:

    • Queue.qsize() 返回队列的大小
    • Queue.empty() 如果队列为空,返回 True, 反之 False
    • Queue.full() 如果队列满了,返回 True, 反之 False
    • Queue.full 与 maxsize 大小对应
    • Queue.get([block[, timeout]]) 获取队列,timeout  等待时间
    • Queue.get_nowait() 相当 Queue.get(False)
    • Queue.put(item) 写入队列,timeout 等待时间
    • Queue.put_nowait(item) 相当 Queue.put(item, False)
    • Queue.task_done() 在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号
    • Queue.join() 实际上意味着等到队列为空,再执行别的操作

    实例:

    #coding=utf-8#!/usr/bin/pythonimport Queueimport threadingimport timeexitFlag = 0class myThread (threading.Thread):    def __init__(self, threadID, name, q):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.q = q    def run(self):        print "Starting " + self.name        process_data(self.name, self.q)        print "Exiting " + self.namedef process_data(threadName, q):    while not exitFlag:        queueLock.acquire()        if not workQueue.empty():            data = q.get()            queueLock.release()            print "%s processing %s" % (threadName, data)        else:            queueLock.release()        time.sleep(1)threadList = ["Thread-1", "Thread-2", "Thread-3"]nameList = ["One", "Two", "Three", "Four", "Five"]queueLock = threading.Lock()workQueue = Queue.Queue(10)threads = []threadID = 1# 创建新线程for tName in threadList:    thread = myThread(threadID, tName, workQueue)    thread.start()    threads.append(thread)    threadID += 1# 填充队列queueLock.acquire()for word in nameList:    workQueue.put(word)queueLock.release()# 等待队列清空while not workQueue.empty():    pass# 通知线程是时候退出exitFlag = 1# 等待所有线程完成for t in threads:    t.join()print "Exiting Main Thread"

    以上程序执行结果:

    Starting Thread-1Starting Thread-2Starting Thread-3Thread-1 processing OneThread-2 processing TwoThread-3 processing ThreeThread-1 processing FourThread-2 processing FiveExiting Thread-3Exiting Thread-1Exiting Thread-2Exiting Main Thread

    Python XML 解析


    什么是 XML?

    XML 指可扩展标记语言(eXtensible Markup Language)。 你可以通过本站学习XML教程

    XML 被设计用来传输和存储数据。

    XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

    它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。


    python 对 XML 的解析

    常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。

    python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

    1.SAX (simple API for XML )

    pyhton 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

    2.DOM(Document Object Model)

    将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。

    3.ElementTree(元素树)

    ElementTree 就像一个轻量级的 DOM,具有方便友好的 API。代码可用性好,速度快,消耗内存少。

    注:因 DOM 需要将 XML 数据映射到内存中的树,一是比较慢,二是比较耗内存,而 SAX 流式读取 XML 文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

    本章节使用到的 XML 实例文件 movies.xml 内容如下:

    <collection shelf="New Arrivals"><movie title="Enemy Behind">   <type>War, Thriller</type>   <format>DVD</format>   <year>2003</year>   <rating>PG</rating>   <stars>10</stars>   <description>Talk about a US-Japan war</description></movie><movie title="Transformers">   <type>Anime, Science Fiction</type>   <format>DVD</format>   <year>1989</year>   <rating>R</rating>   <stars>8</stars>   <description>A schientific fiction</description></movie>   <movie title="Trigun">   <type>Anime, Action</type>   <format>DVD</format>   <episodes>4</episodes>   <rating>PG</rating>   <stars>10</stars>   <description>Vash the Stampede!</description></movie><movie title="Ishtar">   <type>Comedy</type>   <format>VHS</format>   <rating>PG</rating>   <stars>2</stars>   <description>Viewable boredom</description></movie></collection>

    python 使用 SAX 解析 xml

    SAX 是一种基于事件驱动的 API。

    利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。

    解析器负责读取 XML 文档, 并向事件处理器发送事件, 如元素开始跟元素结束事件;

    而事件处理器则负责对事件作出相应, 对传递的 XML 数据进行处理。

    • 1、对大型文件进行处理;
    • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
    • 3、想建立自己的对象模型的时候。

    在 python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。

    ContentHandler 类方法介绍

    characters(content) 方法

    调用时机:

    从行开始,遇到标签之前,存在字符,content 的值为这些字符串。

    从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。

    从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。

    标签可以是开始标签,也可以是结束标签。

    startDocument() 方法

    文档启动的时候调用。

    endDocument() 方法

    解析器到达文档结尾时调用。

    startElement(name, attrs) 方法

    遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。

    endElement(name) 方法

    遇到 XML 结束标签时调用。


    make_parser 方法

    以下方法创建一个新的解析器对象并返回。

    xml.sax.make_parser( [parser_list] )

    参数说明:

    • parser_list - 可选参数,解析器列表

    parser方法

    以下方法创建一个 SAX 解析器并解析 xml 文档:

    xml.sax.parse( xmlfile, contenthandler[, errorhandler])

    参数说明:

    • xmlfile - xml 文件名
    • contenthandler - 必须是一个 ContentHandler 的对象
    • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

    parseString 方法

    parseString 方法创建一个 XML 解析器并解析 xml 字符串:

    xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

    参数说明:

    • xmlstring - xml 字符串
    • contenthandler - 必须是一个 ContentHandler 的对象
    • errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

    Python 解析 XML 实例

    #coding=utf-8#!/usr/bin/pythonimport xml.saxclass MovieHandler( xml.sax.ContentHandler ):   def __init__(self):      self.CurrentData = ""      self.type = ""      self.format = ""      self.year = ""      self.rating = ""      self.stars = ""      self.description = ""   # 元素开始事件处理   def startElement(self, tag, attributes):      self.CurrentData = tag      if tag == "movie":         print "*****Movie*****"         title = attributes["title"]         print "Title:", title   # 元素结束事件处理   def endElement(self, tag):      if self.CurrentData == "type":         print "Type:", self.type      elif self.CurrentData == "format":         print "Format:", self.format      elif self.CurrentData == "year":         print "Year:", self.year      elif self.CurrentData == "rating":         print "Rating:", self.rating      elif self.CurrentData == "stars":         print "Stars:", self.stars      elif self.CurrentData == "description":         print "Description:", self.description      self.CurrentData = ""   # 内容事件处理   def characters(self, content):      if self.CurrentData == "type":         self.type = content      elif self.CurrentData == "format":         self.format = content      elif self.CurrentData == "year":         self.year = content      elif self.CurrentData == "rating":         self.rating = content      elif self.CurrentData == "stars":         self.stars = content      elif self.CurrentData == "description":         self.description = content  if ( __name__ == "__main__"):      # 创建一个 XMLReader   parser = xml.sax.make_parser()   # turn off namepsaces   parser.setFeature(xml.sax.handler.feature_namespaces, 0)   # 重写 ContextHandler   Handler = MovieHandler()   parser.setContentHandler( Handler )      parser.parse("movies.xml")

    以上代码执行结果如下:

    *****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom

    完整的 SAX API 文档请查阅 Python SAX APIs


    使用 xml.dom 解析 xml

    文件对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展置标语言的标准编程接口。

    一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用 DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入 xml 文件。

    python 中用x ml.dom.minidom 来解析 xml 文件,实例如下:

    #coding=utf-8#!/usr/bin/pythonfrom xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif collection.hasAttribute("shelf"):   print "Root element : %s" % collection.getAttribute("shelf")# 在集合中获取所有电影movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息for movie in movies:   print "*****Movie*****"   if movie.hasAttribute("title"):      print "Title: %s" % movie.getAttribute("title")   type = movie.getElementsByTagName('type')[0]   print "Type: %s" % type.childNodes[0].data   format = movie.getElementsByTagName('format')[0]   print "Format: %s" % format.childNodes[0].data   rating = movie.getElementsByTagName('rating')[0]   print "Rating: %s" % rating.childNodes[0].data   description = movie.getElementsByTagName('description')[0]   print "Description: %s" % description.childNodes[0].data

    以上程序执行结果如下:

    Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom

    完整的 DOM API 文档请查阅Python DOM APIs

    python GUI 编程 (Tkinter)

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:

    • Tkinter: Tkinter 模块("Tk 接口")是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
    • wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。
    • Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT 或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。

    Tkinter 编程

    Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

    由于 Tkinter 是内置到 Python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。

    注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写:

    import tkinter

    创建一个 GUI 程序

    • 1、导入 Tkinter 模块
    • 2、创建控件
    • 3、指定这个控件的 master, 即这个控件属于哪一个
    • 4、告诉 GM (geometry manager) 有一个控件产生了。

    实例:

    #!/usr/bin/pythonimport Tkintertop = Tkinter.Tk()# 进入消息循环top.mainloop()

    以上代码执行结果如下图:

    tkwindow

    实例2:

    #!/usr/bin/python# -*- coding: UTF-8 -*-from Tkinter import *           # 导入 Tkinter 库root = Tk()                     # 创建窗口对象的背景色                                # 创建两个列表li     = ['C','python','php','html','SQL','java']movie  = ['CSS','jQuery','Bootstrap']listb  = Listbox(root)          #  创建两个列表组件listb2 = Listbox(root)for item in li:                 # 第一个小部件插入数据    listb.insert(0,item)for item in movie:              # 第二个小部件插入数据    listb2.insert(0,item)listb.pack()                    # 将小部件放置到主窗口中listb2.pack()root.mainloop()                 # 进入消息循环

    以上代码执行结果如下图:

    tkinter编程



    Tkinter 组件

    Tkinter 的提供各种控件,如按钮,标签和文本框,一个 GUI 应用程序中使用。这些控件通常被称为控件或者部件。

    目前有 15 种 Tkinter 的部件。我们提出这些部件以及一个简短的介绍,在下面的表:

    控件描述
    Button按钮控件;在程序中显示按钮。
    Canvas画布控件;显示图形元素如线条或文本
    Checkbutton多选框控件;用于在程序中提供多项选择框
    Entry输入控件;用于显示简单的文本内容
    Frame框架控件;在屏幕上显示一个矩形区域,多用来作为容器
    Label标签控件;可以显示文本和位图
    Listbox列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户
    Menubutton菜单按钮控件,由于显示菜单项。
    Menu菜单控件;显示菜单栏,下拉菜单和弹出菜单
    Message消息控件;用来显示多行文本,与label比较类似
    Radiobutton单选按钮控件;显示一个单选的按钮状态
    Scale范围控件;显示一个数值刻度,为输出限定范围的数字区间
    Scrollbar滚动条控件,当内容超过可视化区域时使用,如列表框。.
    Text文本控件;用于显示多行文本
    Toplevel容器控件;用来提供一个单独的对话框,和Frame比较类似
    Spinbox输入控件;与Entry类似,但是可以指定输入范围值
    PanedWindowPanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。
    LabelFramelabelframe 是一个简单的容器控件。常用与复杂的窗口布局。
    tkMessageBox用于显示你应用程序的消息框。

    标准属性

    标准属性也就是所有控件的共同属性,如大小,字体和颜色等等。

    属性 描述
    Dimension 控件大小;
    Color 控件颜色;
    Font 控件字体;
    Anchor 锚点;
    Relief 控件样式;
    Bitmap 位图;
    Cursor 光标;

    几何管理

    Tkinter 控件有特定的几何状态管理方法,管理整个控件区域组织,一下是 Tkinter 公开的几何管理类:包、网格、位置

    几何方法 描述
    pack() 包装;
    grid() 网格;
    place() 位置;


    Python 的 3​​.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。

    为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下相容。

    许多针对早期 Python 版本设计的程式都无法在 Python 3.0 上正常执行。

    为了照顾现有程式,Python 2.6 作为一个过渡版本,基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3.0 的迁移,允许使用部分 Python 3.0 的语法与函数。

    新的Python程式建议使用 Python 3.0 版本的语法。

    除非执行环境无法安装 Python 3.0 或者程式本身使用了不支援 Python 3.0 的第三方库。目前不支援 Python 3.0 的第三方库有 Twisted, py2exe, PIL等。

    大多数第三方库都正在努力地相容 Python 3.0 版本。即使无法立即使用 Python 3.0 ,也建议编写相容Python 3.0版本的程式,然后使用 Python 2.6, Python 2.7 来执行。

    Python 3.0 的变化主要在以下几个方面:


    print 函数

    print​语句没有了,取而代之的是​print()​函数。 Python 2.6 与 Python 2.7 部分地支持这种形式的​print​语法。在 Python 2.6 与 Python 2.7 里面,以下三种形式是等价的:

    print "fish"print ("fish") #注意print后面有个空格print("fish") #print()不能带有任何其它参数

    然而,Python 2.6 实际已经支持新的​print()​语法:

    from __future__ import print_functionprint("fish", "panda", sep=', ')

    Unicode

    Python 2 有 ​ASCII str()​ 类型,​unicode()​ 是单独的,不是 ​byte​ 类型。

    现在, 在 Python 3,我们最终有了​ Unicode (utf-8)​ 字符串,以及一个字节类:​byte​ 和 ​bytearrays​。

    由于 Python3.X 源码文件默认使用​utf-8​编码,这就使得以下代码是合法的:

    >>> 编程狮 = 'W3Cschool' >>>print(编程狮) W3Cschool

    Python 2.x

    >>> str = "我爱北京天安门">>> str'xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8'>>> str = u"我爱北京天安门">>> stru'u6211u7231u5317u4eacu5929u5b89u95e8'

    Python 3.x

    >>> str = "编程狮">>> str'编程狮'

    除法运算

    Python 中的除法较其它语言显得非常高端,有套很复杂的规则。Python 中的除法有两个运算符,​/​和​//

    首先来说/除法:

    在 python 2.x 中/除法就跟我们熟悉的大多数语言,比如 Java 啊 C 啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。

    在 python 3.x 中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

    Python 2.x:

    >>> 1 / 20>>> 1.0 / 2.00.5

    Python 3.x:

    >>> 1/20.5

    而对于//除法,这种除法叫做​floor​除法,会对除法的结果自动进行一个​floor​操作,在 python 2.x 和 python 3.x 中是一致的。

    python 2.x:

    >>> -1 // 2-1

    python 3.x:

    >>> -1 // 2-1

    注意的是并不是舍弃小数部分,而是执行 ​floor​ 操作,如果要截取整数部分,那么需要使用 ​math​ 模块的​ trunc​ 函数

    python 3.x:

    >>> import math>>> math.trunc(1 / 2)0>>> math.trunc(-1 / 2)0

    异常

    在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 ​as​ 作为关键词。

    捕获异常的语法由 except exc​, ​var 改为 except exc as var

    使用语法​except (exc1, exc2) as var​可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

    1. 在 2.x 时代,所有类型的对象都是可以被直接抛出的,在 3.x 时代,只有继承自​BaseException​的对象才可以被抛出。
    2. 2.x ​raise​语句使用逗号将抛出对象类型和参数分开,3.x 取消了这种奇葩的写法,直接调用构造函数抛出对象即可。

      在 2.x 时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在 3.x 中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。


      xrange

      在 Python 2 中​ xrange() ​创建迭代对象的用法是非常流行的。比如:​ for​ 循环或者是列表/集合/字典推导式。

      这个表现十分像生成器(比如。"​惰性求值​")。但是这个 ​xrange-iterable​ 是无穷的,意味着你可以无限遍历。

      由于它的惰性求值,如果你不得仅仅不遍历它一次,​xrange() ​函数 比 ​range()​ 更快(比如 ​for​ 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

      在 Python 3 中,​range() ​是像 ​xrange()​ 那样实现以至于一个专门的​ xrange()​ 函数都不再存在(在 Python 3 中​ xrange()​ 会抛出命名异常)。

      import timeitn = 10000def test_range(n):    return for i in range(n):        passdef test_xrange(n):    for i in xrange(n):        pass   

      Python 2

      print 'Python', python_version()print '
      timing range()' %timeit test_range(n)print '
      
      timing xrange()' %timeit test_xrange(n)Python 2.7.6timing range()1000 loops, best of 3: 433 µs per looptiming xrange()1000 loops, best of 3: 350 µs per loop

      Python 3

      print('Python', python_version())print('
      timing range()')%timeit test_range(n)Python 3.4.1timing range()1000 loops, best of 3: 520 µs per loop
      print(xrange(10))---------------------------------------------------------------------------NameError                                 Traceback (most recent call last)<ipython-input-5-5d8f9b79ea70> in <module>()----> 1 print(xrange(10))NameError: name 'xrange' is not defined

      八进制字面量表示

      八进制数必须写成​0o777​,原来的形式​0777​不能用了;二进制必须写成​0b111​。

      新增了一个​bin()​函数用于将一个整数转换成二进制字串。 Python 2.6 已经支持这两种语法。

      在 Python 3.x 中,表示八进制字面量的方式只有一种,就是​0o1000​。

      python 2.x

      >>> 0o1000512>>> 01000512

      python 3.x

      >>> 01000  File "<stdin>", line 1    01000        ^SyntaxError: invalid token>>> 0o1000512

      不等运算符

      Python 2.x 中不等于有两种写法​ !=​ 和 ​<>

      Python 3.x 中去掉了​<>​, 只有​!=​一种写法,还好,我从来没有使用​<>​的习惯


      去掉了repr表达式``

      Python 2.x 中反引号​``​相当于​repr​函数的作用

      Python 3.x 中去掉了​``​这种写法,只允许使用​repr​函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用​repr​的机会很少,一般只在​debug​的时候才用,多数时候还是用​str​函数来用字符串描述对象。

      def sendMail(from_: str, to: str, title: str, body: str) -> bool:    pass

      多个模块被改名(根据PEP8)

      旧的名字新的名字
      _winregwinreg
      ConfigParserconfigparser
      copy_regcopyreg
      Queuequeue
      SocketServersocketserver
      reprreprlib

      StringIO​模块现在被合并到新的​io​模组内。 ​new​, ​md5​, ​gopherlib​等模块被删除。 Python 2.6已经支援新的​io​模组。

      httplib​, ​BaseHTTPServer​, ​CGIHTTPServer​, ​SimpleHTTPServer​, ​Cookie​, ​cookielib​被合并到​http​包内。

      取消了​exec​语句,只剩下​exec()​函数。 Python 2.6已经支援​exec()​函数。


      5.数据类型

      1)Python 3.X 去除了​long​类型,现在只有一种整型——​int​,但它的行为就像 Python 2.X 版本的​long

      2)新增了​bytes​类型,对应于 Python 2.X 版本的八位串,定义一个​bytes​字面量的方法如下:

      >>> b = b'china' >>> type(b) <type 'bytes'> 

      str​ 对象和​ bytes ​对象可以使用 ​.encode() (str -> bytes)​ 或 ​.decode() (bytes -> str)​方法相互转化。

      >>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china' 

      3)​dict​的​.keys()​、​.items​ 和​.values()​方法返回迭代器,而之前的​iterkeys()​等函数都被废弃。同时去掉的还有​ dict.has_key()​,用​ in​替代它吧 。


      相关教程


      Python IDE

      本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Python IDE。


      PyCharm

      PyCharm 是由 JetBrains 打造的一款 Python IDE。

      PyCharm 具备一般 Python IDE 的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。

      另外,PyCharm 还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm 支持 IronPython。

      PyCharm 官方下载地址:http://www.jetbrains.com/pycharm/download/

      效果图查看:

      pycharm_ui_darcula

      Sublinme Text 2

      Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,Python 的插件,代码段等。还可自定义键绑定,菜单和工具栏。

      Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。

      Sublime Text 是一个跨平台的编辑器,同时支持 Windows、Linux、Mac OS X 等操作系统。

      sublimetext

      使用 Sublinme Text 2 的插件扩展功能,你可以轻松的打造一款不错的 Python IDE,以下推荐几款插件(你可以找到更多):

      • CodeIntel:自动补全+成员/方法提示(强烈推荐)
      • SublimeREPL:用于运行和调试一些需要交互的程序(E.G. 使用了Input()的程序)
      • Bracket Highlighter:括号匹配及高亮
      • SublimeLinter:代码 pep8 格式检查

      Eclipse+Pydev

      1、安装 Eclipse

      Eclipse可以在它的官方网站 Eclipse.org 找到并下载,通常我们可以选择适合自己的Eclipse版本,比如 Eclipse Classic。下载完成后解压到到你想安装的目录中即可。

      当然在执行Eclipse之前,你必须确认安装了Java运行环境,即必须安装JRE或JDK,你可以到(http://www.java.com/en/download/manual.jsp)找到 JRE 下载并安装。

      2、安装 Pydev

      运行 Eclipse 之后,选择 help-->Install new Software,如下图所示。

      Snap1

      点击 Add,添加 pydev 的安装地址:http://pydev.org/updates/,如下图所示。

      Snap2

      完成后点击"ok",接着点击 PyDev 的"+",展开 PyDev 的节点,要等一小段时间,让它从网上获取 PyDev 的相关套件,当完成后会多出 PyDev 的相关套件在子节点里,勾选它们然后按 next 进行安装。如下图所示。

      Snap3

      安装完成后,重启 Eclipse 即可

      3、设置 Pydev

      安装完成后,还需要设置一下 PyDev,选择 Window -> Preferences 来设置 PyDev。设置 Python 的路径,从 Pydev 的 Interpreter - Python 页面选择 New

      Snap5

      会弹出一个窗口让你选择 Python 的安装位置,选择你安装 Python 的所在位置。

      Snap6

      完成之后 PyDev 就设置完成,可以开始使用。

      4、建立 Python Project:

      安装好 Eclipse+PyDev 以后,我们就可以开始使用它来开发项目了。首先要创建一个项目,选择 File -> New ->Pydev Project

      Snap7

      会弹出一个新窗口,填写 Project Name,以及项目保存地址,然后点击 next 完成项目的创建。

      Snap8

      5、创建新的 Pydev Module

      光有项目是无法执行的,接着必须创建新的 Pydev Moudle,选择 File -> New -> Pydev Module

      Snap9

      在弹出的窗口中选择文件存放位置以及 Moudle Name,注意 Name 不用加 .py,它会自动帮助我们添加。然后点击 Finish 完成创建。

      Snap10

      输入"hello world"的代码。

      Snap11

      6、执行程序

      程序写完后,我们可以开始执行程序,在上方的工具栏上面找到执行的按钮。

      Snap13

      之后会弹出一个让你选择执行方式的窗口,通常我们选择 Python Run,开始执行程序。

      Snap14


      更多 Python IDE

      当然还有非常多很棒的 Python IDE,你可以自由的选择,更多 Python IDE 请参阅:http://wiki.python.org/moin/PythonEditors

      Python JSON

      本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。


      环境配置

      在使用 Python 编码或解码 JSON 数据前,我们需要先安装 JSON 模块。本教程我们会下载 Demjson 并安装:

      $tar xvfz demjson-1.6.tar.gz$cd demjson-1.6$python setup.py install

      JSON 函数

      使用 JSON 函数需要导入 json 库:import json。

      函数描述
      json.dumps将 Python 对象编码成 JSON 字符串
      json.loads将已编码的 JSON 字符串解码为 Python 对象

      json.dumps

      json.dumps 用于将 Python 对象编码成 JSON 字符串。

      语法

      json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

      实例

      以下实例将数组编码为 JSON 格式数据:

      #!/usr/bin/pythonimport jsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json = json.dumps(data)print json

      以上代码执行结果为:

      [{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]

      使用参数让 JSON 数据格式化输出:

      >>> import json>>> print json.dumps({'a': 'W3Cschool', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': ')){    "a": "W3Cschool",    "b": 7}

      Python 原始类型向 json 类型的转化对照表:

      PythonJSON
      dictobject
      list, tuplearray
      str, unicodestring
      int, long, floatnumber
      Truetrue
      Falsefalse
      Nonenull

      json.loads

      json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。

      语法

      json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

      实例

      以下实例展示了 Python 如何解码 JSON 对象:

      #!/usr/bin/pythonimport jsonjsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = json.loads(jsonData)print text

      以上代码执行结果为:

      {u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

      json 类型转换到 Python 的类型对照表:

      JSONPython
      objectdict
      arraylist
      stringunicode
      number (int)int, long
      number (real)float
      trueTrue
      falseFalse
      nullNone

      更多内容参考:https://docs.python.org/2/library/json.html



      使用第三方库:Demjson

      Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。

      Github 地址:https://github.com/dmeranda/demjson

      官方地址:http://deron.meranda.us/python/demjson/

      环境配置

      在使用 Demjson 编码或解码 JSON 数据前,我们需要先安装 Demjson 模块。本教程我们会下载 Demjson 并安装:

      $ tar -xvzf demjson-2.2.3.tar.gz$ cd demjson-2.2.3$ python setup.py install

      更多安装介绍查看:http://deron.meranda.us/python/demjson/install

      JSON 函数

      函数描述
      encode将 Python 对象编码成 JSON 字符串
      decode将已编码的 JSON 字符串解码为 Python 对象

      encode

      Python encode() 函数用于将 Python 对象编码成 JSON 字符串。

      语法

      demjson.encode(self, obj, nest_level=0)

      实例

      以下实例将数组编码为 JSON 格式数据:

      #!/usr/bin/pythonimport demjsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]json = demjson.encode(data)print json

      以上代码执行结果为:

      [{"a":1,"b":2,"c":3,"d":4,"e":5}]

      decode

      Python 可以使用 demjson.decode() 函数解码 JSON 数据。该函数返回 Python 字段的数据类型。

      语法

      demjson.decode(self, txt)

      实例

      以下实例展示了 Python 如何解码 JSON 对象:

      #!/usr/bin/pythonimport demjsonjson = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = demjson.decode(json)print  text

      以上代码执行结果为:

      {u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

      Python 100例

      以下实例在 Python2.7 下测试通过:

      GUI 图形界面

      1.wxpython

        Python 下的 GUI 编程框架,与 MFC 的架构相似

       下载地址:http://wxpython.org/download.php

      2. PyQt

        用于 Python 的 QT 开发库

        下载地址:http://www.riverbankcomputing.com/software/pyqt/download

      Web 框架

      1. Django

      开源 web 开发框架,它鼓励快速开发,并遵循 MVC 设计

      下载地址: http://www.djangoproject.com/

      2. web2py

      一个小巧灵活的 Web 框架,虽然简单但是功能强大

      下载地址:http://web2py.com/

      科学计算

      1. Matplotlib

      用 Python 实现的类 matlab 的第三方库,用以绘制一些高质量的数学二维图形

      下载地址:

      http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.0/

      2. SciPy

      基于 Python 的 matlab 实现,旨在实现 matlab 的所有功能

      下载地址:http://pypi.python.org/pypi/scipy/

      3. NumPy

      基于 Python 的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案

      下载地址:http://pypi.python.org/pypi/numpy/

      网页处理

      1. BeautifulSoup,强大的容错功能

      网页处理非常强大的包

      http://www.crummy.com/software/BeautifulSoup/

      2. PyQuery,在 Python 中如网页的  jQuery 一样处理文档

      下载:https://pypi.python.org/pypi/pyquery

      文档:https://pythonhosted.org/pyquery/


      其他

      1. MySQLdb

      用于连接 MySQL 数据库

      下载地址:http://pypi.python.org/pypi/MySQL-python/

      2. PIL

      基于 Python 的图像处理库,功能强大,对图形文件的格式支持广泛

      下载地址:http://effbot.org/zone/pil-index.htm

      3. PyGame

      基于 Python 的多媒体开发和游戏软件开发模块

      下载地址:http://www.pygame.org/download.shtml

      4. sh 系统管理

      sh 可以让你像执行函数一样执行 shell 终端命令

      下载地址:https://pypi.python.org/pypi/sh

      5. pickle (cPickle)

      6. json

      7. random

      8. datetime


      特别介绍

      1. cx_Freeze

      方便简洁的打包工具,可跨平台!

      下载地址:http://cx-freeze.sourceforge.net/

      2. psyco

      脚本的执行效率多少有点差强人意,虽然优化起来并不是难事,但如果有简单的方法,近乎不用修改源代码,那当然值得去关注一下。psyco 的神奇在于它只需要在代码的入口处调用短短两行代码,性能就能提升 40% 或更多,真可谓是立竿见影!

      如果你的客户觉得你的程序有点慢,敬请不要急着去优化代码,psyco 或许能让他立即改变看法。psyco 堪称 Python 的 jit,有许多潜力可以挖掘,如果剩下来给你优化性能的时间已经不多,请马上去阅读它的手册,有许多招儿轻松优化性能。


      以上都是一些常用的第三方库

      更多请点击:http://pypi.python.org/pypi


      其他推荐:

      http://www.zhihu.com/question/20501628

      http://blog.csdn.net/sasoritattoo/article/details/9381361

      1.pip使用包管理

      文档: https://pip.pypa.io/en/latest/installing.html

      # 安装,可指定版本号(sudo) pip install Django==1.6.8# 升级(sudo) pip install bpython --upgrade# 一次安装多个(sudo) pip install BeautifulSoup4 fabric virtualenv# 从文本中安装,文本中为包名,一行一个,可以指定版本号(sudo) pip install –r requirements.txt# 删除(sudo) pip uninstall xlrd# 导出当前已经安装包pip freeze > requirements.txt

      2. virtualenv独立Python环境管理

      文档:  http://virtualenvwrapper.readthedocs.org/en/latest/

      virtualenv 是一个创建独立环境的包,Pythonvirtualenvwrapper 是一个更好用的 Pythonvirtualenv

      # 安装:(sudo) pip install virtualenv virtualenvwrapper# 修改.bash_profile 或 .zshrc(如果你用 zsh 的话),添加以下语句export WORKON_HOME=$HOME/.virtualenvsexport PROJECT_HOME=$HOME/workspacesource /usr/local/bin/virtualenvwrapper.sh

      mkvirtualenv  ENV:创建运行环境ENV

      rmvirtualenv  ENV:删除运行环境ENV

      mkproject  mic:创建 mic 项目和运行环境 mic

      mktmpenv :创建临时运行环境

      workon  bsp: 工作在 bsp 运行环境

      lsvirtualenv : 管理者的运行环境

      lssitepackages : 当前环境安装了的包

      创建的环境是独立的,互不干扰,不需要 sudo 包就可以使用 pip 来进行的管理。

      下面是使用演示图:


      3.面料管理和应用发布

      官网: http://www.fabfile.org/

      文档: http ://docs.fabfile.org/

      Fabric:应用程序部署或系统管理任务

      #coding:utf-8from fabric.api import *# 服务器列表env.hosts = ['user@server1','user2@server2']def ls_home():    with cd('/home/bae/'):        run('ls')'''常用命令lcd(dir): 进入本机某目录local(cmd): 本机上执行命令cd(dir): 进入服务器某目录run(cmd):服务器上执行命令'''

      把上面的文件保存成 fabfile.py 在终端上进入该文件的目录,执行

      fab 函数名比如:fab ls_home

      更多使用方法请参见官方文档。

      领取免费资料

      扫描下方二维码或打开微信搜一搜“51coolma编程狮”关注公众号回复关键词【Python123】或者【Python资料包】免费领取 Python 学习资料,包含软件安装包,电子书、思维导图等

      51coolma编程狮微信公众号

      1. python 中的字符串简介与常用函数

      在 python 中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改

      字符串是我们后面需要学习的稍大一点的对象类别--序列的第一个代表

      在字符串章节所说到的关于序列的操作,后面的列表与元组一样适用

      字符串常用的一些操作与函数

      操作解释
      s=''空字符串
      s="abc'd"双引号和单引号相同
      s='abc '转义序列,使用变量完全显示字符,只有使用 print 函数才能够显示转义
      s="""aaaaa"""三重引号字符串块
      s=r' empspam'Raw 字符串
      s=b'abc'python 3.x 的字节字符串
      s=u'bac'unicode 字符串
      s1+s2合并
      s*3重复
      s[i]索引
      s[i:j]分片
      len(s)求长度
      “a %s parrot” % kind字符串格式化表达式
      "a {0} parrot".format(kind)字符串格式化方法
      s.find('xxx')搜索
      s.rstrip()移除空格
      s.replace('xxx','xxx')替换
      s.endswith('xxx')以 xxx 结尾
      'xxx'.join(strlist)出入分隔符
      s.encode('latin-1')改变编码
      for x in s:print(x)迭代
      ‘xxx’ in s 成员关系
      [c*2 for c in s]成员关系
      map(ord,s)成员关系

      2. python 字符串常量

      1.单双引号字符串是一样的

        >>> 'abc',"abc"    ('abc''abc')    >>>   

      当你的 python 照着上面的例子来写,这个时候单双引号字符串是一样的。两者可以互换。

      我们甚至可以在单双引号直接引入对方

        >>> 'abc"d',"abc'd"    ('abc"d'"abc'd")  

      在任意表达式中,python会自动合并相连的字符串,尽管它们之间没有通过+连接

        >>> 'abc"d',"abc'd"    ('abc"d'"abc'd")  

      还有,就像上面的几个例子,在字符串中间加上逗号,最后形成的是元组而不是字符串

      2.使用转义字符表示特殊字符

        >>> a='abc
      def
      '    >>> a    'abc
      def
      '    >>> print(a)   abc    def        >>>   

      看上面的例子,字符串之间加上转义字符,如果我们直接用变量打印,他会把所有字符都打印出来,但是如果使用 print 打印,转义字符会从原来的字符串变成二进制值,例如: 代表制表符等等

      常见的转义字符:

      转义意义
      连续,接着上面一行
      反斜杠
      '单引号
      "双引号
      a响铃
      倒退
      f换页
      换行
      返回
      水平制表符
      v垂直制表符
      N{id}unicode 数据库 id
      uhhhhunicode16 位的十六进制值
      Uhhhhunicode32位的十六进制值
      xhh十六进制值
      ooo八进制值
      Null
      other不转义

      3.raw 字符串抑制转义

      有很多时候我们需要打开文件等,那么就需要输入路径,特别是 window 的路径,大多使用反斜杠,这个时候就会出现问题

      例如:

      handler=open('c: b123.txt','w')  

      这个时候就出问题了,本来是打开 nb123 这个文本文件,但是由于前面有个反斜杠,在转义当中是换行,引起歧义

      所以,我们需要把路径改成下面的样子:

        handler=open(r'c:
      b123.txt','w')    handler=open('c:
      b123.txt','w')  

      这个时候就是合法的,使用r来抑制转义,或者使用双反斜杠

      4.使用三重双引号来输入多字符串

       >>> a="""aaabbb   ccdcdef'ddfdfd"""    >>> a    "aaabbb
      ccdcdef'ddfdfd"  

      它常用于文档字符串,或者注释大段的代码

      3. Python 字符串的一般使用

      1. 基本操作

      1)使用 + 连接

        >>> "abc"+"efg"    'abcefg'    >>> a="abc"    >>> b="efg"    >>> c=a+b    >>> c    'abcefg'    >>>   

      2)使用 * 重复

       >>> "abc"*3    'abcabcabc'    >>> "abc
      "*3    'abc
      abc
      abc
      '    >>> print("abc
      "*3)    abc    abc    abc        >>>   

      3)字符串不能使用 + 连接数字

        >>> "abc"+9    Traceback (most recent call last):      File "", line 1in         "abc"+9    TypeError: Can't convert 'int' object to str implicitly  

      4)使用 for 来迭代

       >>> a="abcdefg"    >>> for x in a:print(x)        a    b    c    d    e    f    g  

      5)使用 in 来找字符,后面我们还会说到 str.find() 方法,跟 in 非常相似

        >>> a="abcdefg"    >>> "h" in a    False    >>> "abc" in a    True    >>>   

      2. 索引与分片

      1)索引

      字符串可以通过索引来查找想要的字符,而且索引分成正负,通过不同的查询方向来查找

        >>> a="abcdefg"    >>> a[0],a[1],a[5]    ('a''b''f')    >>> a[-2],a[-1],a[-5]    ('f''g''c')    >>>   

      2)分片,说白了就是提取字符串的某些部分,而且当索引使用负数则返回空

        >>> a="abcdefg"    >>> a[1:]    'bcdefg'    >>> a[1:3]    'bc'    >>> a[-1:3]    ''    >>>   

      我使用一张图来说明一下这个分片是怎么分的,以 a[1:3] 为例子

      从图上面我们比较清楚情况,对于 1,他是把指针放到a的后面,从 b 开始数,a 不算,然后后面的 3,他是把指针放到 d 的前面,不算 d

      所以返回的只有 bc

      还有需要特殊说明一些例子:

      a[1:] 从第二个字符开始到结束

      a[:3] 从第一个字符开始到第二个字符,也就是第三个字符前

      a[:] 复制所有字符

      其实还有第三个参数,步进,说白了,就是跳着选,就是要看跳几个而已

        >>> a="abcdefghijklmn"   >>> a[2:8:2]   'ceg'    >>> a[::3]    'adgjm'    >>>   

      a[2:8:2] 代表从第三个字符开始抽取,到第八个之前也就是第七个,然后每隔 2 个挑一个出来

      a[::3]代表从所有字符中每隔3个挑一个出来

      如果步进是复数,则反着挑

      3. 字符串转换 str()与 repr()

        >>> str(42)    '42'    >>> repr(43)    '43'  

      区别,在使用 print 的时候,repr 多了一对单引号

        >>> print(str('aaa'),repr('aaa'))    aaa 'aaa'  

      4. 修改字符串

      字符串是不可以修改的,那么怎么修改呢?

      其实过程是我们从一个字符串里面抽取某些字符,然后在加上其他的字符,形成新的字符串对象

       >>> a="abcdefghijklmn"    >>> id(a)    24338048    >>> b=a[1:5]+" 
       this is a str"   >>> id(b)    24342896   >>> b    'bcde 
       this is a str'    >>> print(b)    bcde     this is a str   >>>   

      4. Python 修改字符串实例总结

      我们知道 python 里面字符串是不可原处直接修改的,为了是原来的字符串修改过来,我们有一下方法:

      1. 分片和合并

        >>> a='abcde'    >>> b='fghij'    >>> c=a[1:3]+b[2:5]+' end'    >>> c    'bchij end'    >>>   

      2. replace()

        >>> a='aaabbbcccddd'    >>> a.replace ('aaa','xxx')    'xxxbbbcccddd'    >>>   

      3. 结合 find() 和分片

        >>> a='aaaxbbbcccxddd'    >>> where = a.find ('x')    >>> where    3    >>> a[:where]+'ttttt'+a[where:]    'aaatttttxbbbcccxddd'    >>>   

      上面的三种方法,虽然都修改了源字符串,其实它们没有直接在原处修改,只是重新创建一个新的字符串对象

      4. 使用可修改的列表

      可能你需要修改超长文本多个地方,这时候上面的方法性能不好,所以需要转换为可以修改的对象-列表

        >>> a='aaaxbbbcccxddd'    >>> b=list(a)    >>> b    ['a''a''a''x''b''b''b''c''c''c''x''d''d''d']    >>> b[2]='x'    >>> b[7]='x'    >>> b    ['a''a''x''x''b''b''b''x''c''c''x''d''d''d']    >>> a=''.join (b)    >>> a    'aaxxbbbxccxddd'    >>>   

      5. Python 文本解析

      这一章节我们简单的聊聊文本解析的两种方法:

      1. 分片,通过分片,记录偏移处,然后提取想要的字符串

      例子:

        >>> line='aaa bbb ccc'    >>> col1=line[0:3]    >>> col3=line[8:]    >>> col1    'aaa'    >>> col3    'ccc'    >>>   

      2. split()

        >>> line='aaa bbb ccc'    >>> a=line.split (' ')    >>> a    ['aaa''bbb''ccc']    >>> a[0]    'aaa'    >>> a[1]    'bbb'    >>> a[2]    'ccc'    >>>   
        >>> line='aaa,bbb,ccc'    >>> a=line.split (',')    >>> a    ['aaa''bbb''ccc']    >>>   

      使用 split 方法,根据特征码提取不同的字符

      虽然上面的两种方法对于平常文本解析的潜力有限,但是它们对于我们平常编程的时候值的传递有着不少的用处

      例如 json 字符串就是其中一个比较典型的例子,使用 {} [] , 三种符号,区分开各种对象

      6. Python 字符串格式化表达式

      字符串格式化允许在一个单个的步骤中对一个字符串执行多个特定类型的替换

      特别是给用户提示的时候,格式化非常方便

      实现方法:

      1. 格式化表达式,类似于 c 语言的 printf

      在表达式中,我们使用 % 二进制操作符

        >>> print('this is %d %s bird' % (1,'dead'))    this is 1 dead bird  

      举上面的例子说明(注意我们下面所说的 %,都是以字符串和元组中间的那个为准)

      在 % 的左边放置一个字符串,字符串里面放置了一个或者多个使用 % 开头的嵌入对象

      在 % 的右边放入一个(或多个,嵌入元组当中)对象,这些对象将插入到左边的转换目标位置上

        >>> name='ray'    >>> 'my name is %s' % name    'my name is ray'    >>> '%d %s %d you' % (1,'spam',4)    '1 spam 4 you'    >>> '%s---%s---%s' % (42,3.14,[1,2,3])    '42---3.14---[1, 2, 3]'    >>>   

      当插入多个对象时,需要把他们放到一个元组里面

      2. 高级格式化表达式

      字符串格式化代码列表

      代码意义
      s字符串(或者任何对象)
      rs, 但是用 repr,而不是 str
      c字符
      d十进制整数
      i整数
      u无号整数
      o八进制整数
      x十六进制整数
      Xx,但打印大写
      e浮点指数
      Ee,但打印大写
      f浮点十进制
      F浮点十进制
      g浮点e或f
      G浮点e或f
      %常量%

      %[(name)][flags][width][.pression]typecode

      例子

        >>> x=1234    >>> res='integers:...%d...%-6d...%06d' % (x,x,x)    >>> res    'integers:...1234...1234  ...001234'    >>>   

      %e, %f, %g 对于浮点数的打印是有所区别的

        >>> x=1.23456789    >>> x    1.23456789    >>> '%e|%f|%g' % (x,x,x)    '1.234568e+00|1.234568|1.23457'    >>>   

      3. 基于字典的格式化表达式

        >>> 'my name is %(name)s,my age is %(age)d' % {'name':'ray','age':30}    'my name is ray,my age is 30'    >>>   

      说白了就是给每个替换位置命名,这样代码看起来更加明了

      7. Python 字符串格式化方法(1)

      承接上一章节,我们这一节来说说字符串格式化的另一种方法,就是调用 format()

        >>> template='{0},{1} and {2}'    >>> template.format ('a','b','c')    'a,b and c'    >>> template='{name1},{name2} and {name3}'    >>> template.format (name1='a',name2='b',name3='c')    'a,b and c'   >>> template='{name1},{0} and {name2}'    >>> template.format ('a',name1='b',name2='c')    'b,a and c'    >>>   

      这里根据上面的例子说明一下

      1. 替换的位置可以使用下标的来标记

      2. 替换的位置可以使用名称来替换

      下面我们来说说,在方法里面添加属性

        >>>import sys    >>> 'my {1[spam]} runs {0.platform}'.format(sys,{'spam':                             'laptop'})    'my laptop runs win32'    >>>   
        >>> 'my {config[spam]} runs {sys.platform}'.format(sys=sys,config={'spam':'laptop'})    'my laptop runs win32'    >>>   

      上面两个例子里面,第一处读取了字符串,第二处读取 sys 里面的 platform 属性

      下面再举一个例子,说明在表达式里面使用偏移量

        >>> aList=list('abcde')    >>> aList    ['a''b''c''d''e']    >>> 'first={0[0]} third={0[2]}'.format (aList)    'first=a third=c'    >>>   

      注意:在使用偏移量的时候只能够是正整数,不能够使用负数,不能够使用代表区间正整数

        >>> aList=list('abcde')        >>> aList    ['a''b''c''d''e']    >>> 'first={0[0]} third={0[-1]}'.format (aList)    Traceback (most recent call last):      File "", line 1in         'first={0[0]} third={0[-1]}'.format (aList)    TypeError: list indices must be integers, not str    >>> 'first={0[0]} third={0[1:3]}'.format (aList)    Traceback (most recent call last):      File "", line 1in         'first={0[0]} third={0[1:3]}'.format (aList)    TypeError: list indices must be integers, not str    >>>   

      7. python 字符串格式化方法(2)

      紧接着上一章节,这一章节我们聊聊怎样添加具体格式化

      就是指定替换字段的大小、对齐方式和特定的类型编码,结构如下:

      {fieldname!conversionflag:formatspec}

      fieldname 指定参数的一个数字或者关键字,后面可选 .name 或者 [index] 引用

      conversionflag 可以是 r/s/a 或者是在该值上对 repr/str/ascii 内置函数的一次调用

      formatspec 指定如何表示该值,如字段宽带、对齐方式、补零、小数点精度等,并以一个可选的数据类型编码结束

        >>> '{0:10}={1:10}'.format ('abcde',1.234566789)    'abcde     =1.234566789'    >>> '{0:10}={1:3}'.format ('abcde',1.234566789)    'abcde     =1.234566789'    >>> '{0:10}={1:3}'.format ('abcde',123456678.9)    'abcde     =123456678.9'    >>> '{0:.format ('abcde',123456678.9)    'abcde     =123456678.9'    >>> '{0:>10}={1:3}'.format ('abcde',123456678.9)    '     abcde=123456678.9'    >>> import sys    >>> '{0.platform:>10}={1:3}'.format (sys,123456678.9)    '     win32=123456678.9'  

      上面举了一些例子

      {0:10} 表示一个 10 字节宽的字段的参数

      {0:<10} 表示一个左对齐的 10 字节宽的字段的参数

      {0:>10} 表示一个右对齐的 10 字节宽的字段的参数

      {0.platform} 读取 sys 模块的属性

      下面再举一些例子

        >>> '{0:e},{1:.3e},{2:g}'.format (3.141592,3.141592,3.141592)    '3.141592e+00,3.142e+00,3.14159'    >>> '{0:f},{1:.2f},{2:06.2f}'.format (3.141592,3.141592,3.141592)    '3.141592,3.14,003.14'    >>>   

      {0:e} 代表使用科学计数法来表示

      {1:.3e} 只保留三位小数的科学计数法来表示

      {2:g} 使用 g 来表示浮点数

      {1:.2f} 保留两位小数的浮点数

      {2:06.2f} 六字节款的保留两位小数不足宽度补零的字符串

      除了上面的十进制,还支持八进制、十六进制

        >>> '{0:X},{1:o},{2:b}'.format (255,255,255)    'FF,377,11111111'    >>> bin(255),int('11111111',2),0b11111111    ('0b11111111'255255)  

      还支持在 format 里面嵌入表达式,动态获取

        >>> '{0:f},{1:.2f},{2:06.2f}'.format (1/3,1/3,1/3)    '0.333333,0.33,000.33'  

      python 字符串对齐

      场景:

      字符串对齐

      python 提供非常容易的方法,使得字符串对齐

        >>> print("abc".center (30,'-'))    -------------abc--------------                           >>> print("abc".ljust (30)+'|')    abc                           |    >>> print("abc".rjust (30))                               abc    >>>   

      分别是 center,ljust,rjust

      三个方法默认填充是空格,也可以使用其他字符填充

      python文本 字符与字符值转换

      场景:

      将字符转换成 ascii 或者 unicode 编码

      在转换过程中,注意使用 ord 和 chr 方法

        >>> print(ord('a'))    97    >>> print(chr(97))    a    >>>   

      有时候需要反转过来使用:

        >>> print(str(ord('a')))    97    >>> print(chr(ord('a')))    a    >>>   

      这个时候需要注意 str() 与 chr() 之间的区别:str 是把返回的对象直接转为字符串,而 chr 则是把返回的对象转换为对应的 ascii 码的字符串。

      python 文本 字符串开头或者结尾匹配

      场景:

      字符串开头或者结尾匹配,一般是使用在匹配文件类型或者 url

      一般使用 startwith 或者 endwith

        >>> a='http://www.51coolma.cn/vip'    >>> a.startswith ('http')    True  

      注意:这两个方法里面的参数可以是 str,也可以是元组,但是不可以是列表和字典

        >>> a='http://www.51coolma.cn/vip'    >>> a.startswith (('http','ftp'))    True  

      如果是列表或者字典,则报错

        >>> a='http://www.51coolma.cn/vip'    >>> a.startswith (['http','ftp'])    Traceback (most recent call last):      File "", line 1in         a.startswith (['http','ftp'])    TypeError: startswith first arg must be str or a tuple of str, not list    >>>   

      其实,除了上面的方法, 也可以使用切片来实现,只不过代码看上去没那么好看而已

        >>> a='http://www.51coolma.cn/vip'    >>> a[0:4]=='http'    True    >>>   

      当然,我们也可以用正则表达式来做,但是理解上面就稍微难度有点。

        >>> import re    >>> url = 'http://www.python.org'    >>> re.match('http:|https:|ftp:', url)    05), match='http:'>    >>> help(re.match )    Help on function match in module re:        match(pattern, string, flags=0)        Try to apply the pattern at the start of the string, returning        a match object, or None if no match was found.       >>>   


      python 文本 单独处理字符串每个字符的方法汇总

      场景:

      用每次处理一个字符的方式处理字符串

      方法:

      1. 使用 list(str)

        >>> a='abcdefg'    >>> list(a)    ['a''b''c''d''e''f''g']    >>> aList=list(a)    >>> for item in aList:        print(item)#这里可以加入其他的操作,我们这里只是单纯使用print                a    b    c    d    e    f    g    >>>   

      2. 使用 for 遍历字符串

        >>> a='abcdefg'    >>> for item in a :        print(item)#这里可以加入其他的操作,我们这里只是单纯使用print                a    b    c    d    e    f    g    >>>   

      3. 使用 for 解析字符串到 list 里面

        >>> a='abcdefg'    >>> result=[item for item in a]    >>> result    ['a''b''c''d''e''f''g']    >>>   

      python文本 判断对象里面是否是类字符串

      场景:

      判断对象里面是否是类字符串

      一般立刻会想到使用 type() 来实现

        >>> def isExactlyAString(obj):        return type(obj) is type('')        >>> isExactlyAString(1)    False    >>> isExactlyAString('1')    True    >>>   

      还有

        >>> def isAString(obj):        try :obj+''        except:return False        else:return True                >>> isAString(1)    False   >>> isAString('1')    True    >>> isAString({1})    False    >>> isAString(['1'])    False    >>>   

      虽然思路上和方法使用上都没用问题,但是如果从 python 的特性出发,我们可以找到更好的方法:isinstance(obj, str)

        >>> def isAString(obj):        return isinstance(obj,str)        >>> isAString(1)    False   >>> isAString('1')    True    >>>   

      str 作为 python3 里面唯一的一个字符串类,我们可以检测字符串是否是 str 的实例

      python 文本 去掉字符串前后空格

      场景:

      去掉字符串前后空格

      可以使用 strip,lstrip,rstrip 方法

        >>> a="abc".center (30)    >>> a    '             abc              '    >>> b=a.lstrip ()    >>> b    'abc              '    >>> c=a.rstrip ()    >>> c    '             abc'    >>> d=a.strip ()    >>> d    'abc'    >>>   

      这三个方法默认是去掉空格,也可以通过参数去掉其他字符,等价与 replace

        >>> a="abc"    >>> b=a.strip ('a')    >>> b    'bc'    >>> c=a.replace ('a','')    >>> c    'bc'    >>>   

      python文本 拼接、合并字符串

      场景:

      拼接、合并字符串

      在这个场景中,我们首先想到的当然是使用 + 或者 += 将两个字符串连接起来

        >>> a='a'    >>> b='b'    >>> c=a+b    >>> c    'ab'    >>>   

      如果整个程序只有两个字符串需要拼接,那没有问题

      但是如果程序里面大量存在拼接,甚至需要循环拼接,这个时候性能问题就会出现

      原因:字符串是不可原地修改的,改变一个字符串就是创建一个新的字符串替代旧的,如果当有 N 个字符串需要改动,那么就是创建 N 个字符串,然后再丢掉 N 个旧的字符串,分配一个大字符串空间并且填充这个字符串所需的时间大致正比于这个字符串的长度

      因此,我们推荐使用 .join 方法,如果是有些字符串不是一开始就到位,可以使用 list 暂存,然后再 join

      例如:

        >>> a='a'    >>> b='b'    >>> c=a.join (b)    >>> c    'b'    >>>   

      python文本 字符串逐字符反转以及逐单词反转

      场景:

      字符串逐字符反转以及逐单词反转

      首先来看字符串逐字符反转,由于 python 提供了非常有用的切片,所以只需要一句就可以搞定了

        >>> a='abc edf degd'    >>> a[::-1]    'dged fde cba'    >>>   

      然后我们来看住单词反转

      1. 同样的我们也可以使用切片

        >>> a='abc edf degd'    >>> a.split ()[::-1]    ['degd''edf''abc']  

      2. 可以使用原生方法 reverse

        >>> a='abc edf degd'    >>> result=a.split()    >>> result    ['abc''edf''degd']    >>> result.reverse()    >>> result    ['degd''edf''abc']    >>> result=' '.join (result)    >>> result    'degd edf abc'    >>>   

      在反转的过程中,我意外发现 join 的另外使用方法

        >>> a='abcd'    >>> ' '.join (a)    'a b c d'    >>> a='abc edf degd'    >>> ' '.join (a)    'a b c   e d f   d e g d'    >>>   

      它可以快速的再每个字符中间加上我们赋值的字符

        >>> '+'.join (a)    'a+b+c+ +e+d+f+ +d+e+g+d'    >>>   

      综上所有,还是使用切片的方法最好,最推荐使用

      python 文本 maketrans 和 translate

      场景:

      过滤字符串的某些字符,我们从例子出发

        >>> tb=str.maketrans ('abc','123')    >>> 'abcd'.translate (tb)    '123d'    >>> 'abcd+++a+b+cd'.translate (tb)    '123d+++1+2+3d'    >>>   

      1. 建立字符映射表,也就是 maketrans 方法所做的事情,它返回一个字符串的映射表,意思是:如果字符串里面出现a,那么它就会变成对应的 1,如此类推,b->2,c->3

      2. 使用 translate 方法,将字符串里面的字符改掉

      注意:

      1. 映射两遍的长度必须一致,不然报错,也就是说 'abc' 一定需要对于 '123' 或者 '234' 等,不能是 'abc' 对应 '12',这个时候就报错

        >>> tb=str.maketrans ('abc','12')    Traceback (most recent call last):      File "", line 1in         tb=str.maketrans ('abc','12')    ValueError: the first two maketrans arguments must have equal length    >>>   

      2. 还需要注意的是,字符串的 translate 方法只接受一个参数,而 bytes 的 translate 方法是可以接收两个参数,而且第二个参数可以快速实现删除方法

        >>> bytes_tb = bytes.maketrans(b'abcd', b'ABCD')    >>> b'abcdefg'.translate (bytes_tb,b'a')    b'BCDefg'    >>>   

      下面列举一些 translate 的一些应用方法:(注意:为了快速实现删除,所以下面的方法都是用 bytes 的 translate)

      修改某些字符串:

        >>> def AToB(seq,frm,to):        if len(frm)or len(frm)>len(to):return '映射字符长度不一致'        else:            bytes_tb = bytes.maketrans(frm,to)            return seq.translate (bytes_tb)                >>> AToB(b'abcd',b'a',b't1')    '映射字符长度不一致'    >>> AToB(b'abcd',b'a1',b't')    '映射字符长度不一致'    >>> AToB(b'abcd',b'a',b't')    b'tbcd'    >>>   

      删除某些字符串:

        >>> def AToB(seq,delete):        return seq.translate (None,delete)        >>> AToB(b'abcd',b'a')    b'bcd'    >>>   

      保留某些字符:

        >>> def AToB(seq,keep):        delete=seq.translate (None,keep)        return seq.translate (None,"font-family: Arial, Helvetica, sans-serif;">delete)        >>> AToB(b'abcd',b'a')    b'a'    >>>   

      <AppML> 架构


      MVC 架构

       

      <AppML> 采用了 MVC 架构

      MVC全名是Model View Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写,一种软件设计典范。

      模型(Model) 描述你的应用。

      视图(View) 显示你的数据。

      制器(Controller) 控制你的应用。

       

      Wikipedia: Model, View, Controller

       

              MVC

      模型(MODEL) - 仅仅是一个简单的XML文件

      模型描述了您的应用程序,并且可在不同的硬件 和软件平台(PC,iPhone,Tablets,等)重复使用。它不关心用户 界面(UI)或表现形式。

      模型采用xml编写,存储于web服务器中。

      <appml>

      <datasource>
        <database>
          <connection>Northwind</connection>
          <sql>SELECT CustomerName,ContactName,City,Country FROM Customers</sql>
        </database>
      </datasource>

      <filters>
      <query>
        <field label="Customer">CustomerName</field>
        <field>City</field>
        <field>Country</field>
      </query>
      <order>
        <field label="Customer">CustomerName</field>
        <field>City</field>
        <field>Country</field>
      </order>
      </filters>

      </appml>

      以上实例定义了数据源来自Northwind数据库。

      该模型允许 使用预定义的SQL获取数据。它还允许通过Customer, City, 和 Country查询数据很排序。


      视图(VIEW) - 仅仅是一个普通的HTML文件

      视图即是 UI (User Interface:用户界面)。它通常是一个显示和输入数据(可选)HTML页面:

      <!DOCTYPE html>
      <html>
      <head>
      <link rel="stylesheet" href="appml.css" />
      </head>
      <body>

      <h1>My First Web Application</h1>
      <div id="Place01"></div>

      <script src="appml.js"></script>
      <script>
      customers=new AppML("appml.html","Customers.xml");
      customers.run("Place01");
      </script>

      </body>
      </html>

      以上HTML页面使用通过执行脚本语言创建一个 AppML 对象,并将数据显示在id="Place01"的div中。

      采用了 "appml.js" 脚本文件。


      CONTROLLER(控制器) - 仅仅是一个浏览器很服务端的脚本

      服务端脚本通过以下方式控制应用:

      • 从浏览器中接收请求数据
      • 将模型很数据返回给浏览器
      • 从浏览器中接收更新数据
      • 在服务器上更新数据
      • 数据通信过程,请进行数据安全验证。

      浏览器脚本通过以下方式控制应用:

      • 当页面加载时,你可以加载<AppML> 控制器到页面上。
      • 使用控制器,你可以在页面创建 <AppML> 对象。
      • 当执行 <AppML> 对象时, 它会向服务器请求数据。
      • <AppML> 对象从服务器接受数据(使用数据模型) 。
      • <AppML> 对象 (或者你的代码) 在页面中显示你的数据。
      • (可选) web用户修改数据。
      • (可选) <AppML> 可以向服务器发送修改请求。

      典型的 Web 文件和文件夹:

      Folders


      web文件夹: Demo

      数据文件夹: Data

      图片文件夹: Images

      模型文件夹: Models

      应用: Demo.htm

      样式: Demo.css

      <AppML> 配置文件: appml_config.php (或者 .htmlx)

      <AppML> 样式文件: appml.css

      <AppML> 浏览器控制器: appml.js

      <AppML> 服务器控制器: appml.php (或者 .htmlx)


      快速、灵活的应用开发

      快速应用开发(Rapid Application Development、RAD)不仅是一种需求抽取方法,它还是是软件开发为一体的方法。 快速应用开发目的是快速发布系统方案,而技术上的优美相对发布的速度来说是次要的。

      <AppML> 提供超快速的原型设计,比传统的软件 开发方法高100倍的速度。

      应用程序原型可以直接从应用程序模型运行,无需任何编码。

      Wikipedia: Rapid Application Development

      敏捷软件开发是基于用户和开发者相互协作的基础上一步一步的基发展而来的方法。

      <AppML>应用从原型到完整的应用可以通过递增的方式一步步来编写实现。

      Wikipedia: Agile Software Development


      声明式编程

      软件开发往往无法按照预期的时间和预算完成。软件编码错误也是经常出现。 这是因为计算机代码是很难开发,测试,维护。

      编码已经 过时了。你应该更多描述做什么,而不是如何实现它。

      使用 <AppML> 你需要在模型中声明 你的应用 。

      使用 <AppML> 可以 少写或者不用编写代码

      Wikipedia: Declarative Programming


      代码先行(Code First)

      Web应用程序开发可以使用以下两种不同的方式:

      1. 代码先行(Code First):使用预编程,预先测试的代码,只增加新的应用程序说明。

      2. 契约优先(Contract First):从头开始使用完整的应用程序的说明要求 编写应用程序。

      <AppML>采用最合理的概念: 代码先行(Code First).


      面向服务的体系结构(service-oriented architecture,SOA)

      Web Service 是一个数据接口, 通过URL指定,就像一个web页面。 但它有别与web页面, 它只是一种传达信息的方式。

      一个典型的 Web Service 为页面提供了数据。

      使用 <AppML>, HTML 显示为用户界面, <AppML>提供数据。

      Original Web Services 设计使用了 XML 标志如 SOAP, WSDL, 和 UDDI。

      Modern Web Services 比如 <AppML> 应用更加简单。

      • 更容易理解 - 可以被我们阅读
      • 轻量级 - 没有不必要的代码或标记
      • 易于实施 - 没有所需的开发工具

      面向服务的体系结构(service-oriented architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。


      Web Services的优势

      • Web services 只需要少量的代码
      • Web services 被设计来处理一组有限的任务
      • Web services 使用基于HTTP的通信协议
      • Web services 独立于操作系统
      • Web services 独立于编程语言
      • Web services 可以连接不同的应用程序,系统和设备
      • Web Services 可以很容易地发布信息
      • Web Services 有利于快速应用程序开发

      例如一个Web services,可以设计一个小程序,提供其他 最新的股票的交易价格的应用程序。

      Web services使用HTTP协议与其他系统进行通信, Web服务是独立于操作系统和编程 语言。

      调用Web services的应用程序将始终使用 HTTP协议发送请求。调用应用程序将永远不会 关心其他计算机运行的操作系统或编程语言 。

      Web services可以为更多的企业创造新的可能性,因为它提供了一种简单的方法的方式 分发了大量的信息。

      比如:航班时刻表和机票预定系统。


      云计算(Cloud Computing)

      云计算(Cloud Computing)是SOA的扩展: 应用即服务(Application-as-a service), 存储即服务(Storage-as-a-service),数据即服务(Data-as-a-service)。

      对于大多数人,云计算是在web上存储数据:

      • 邮寄很日历
      • 文档和电子表格
      • 书籍,笔记,待办事项列表
      • 音乐,图片和电影
      • 数据库和应用程序

      原因很明显:

      • 有来自世界各地的访问数据
      • 与他人分享我的数据
      • 硬件升级或者崩溃

      <AppML> 可以很轻松地将数据库和应用程序放在云中。

      Python CGI 编程


       注:在pythonCGI编程方面,python2和python3的区别并不大(区别在于pythonCGI文件开头的指定解释器不同和print语句不同,不过在python27版本中也可以使用类似python3的print语句)。综合对比后小编觉得本篇文章有可取之处,所以保留本篇文章,python3 CGI编程文章内容较新,有更好的参考价值——python3CGI编程

      什么是 CGI

      CGI 目前由 NCSA 维护,NCSA 定义 CGI 如下:

      CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP 服务器,提供同客户端 HTML 页面的接口。


      网页浏览

      为了更好的了解 CGI 是如何工作的,我们可以从在网页上点击一个链接或 URL 的流程:

      • 1、使用你的浏览器访问 URL 并连接到 HTTP web 服务器。
      • 2、Web 服务器接收到请求信息后会解析 URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。
      • 3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。

      CGI 程序可以是 Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等。


      CGI 架构图

      CGI构架图


      Web 服务器支持及配置

      在你进行 CGI 编程前,确保您的 Web 服务器支持 CGI 及已经配置了 CGI 的处理程序。

      Apache 支持 CGI 配置:

      设置好 CGI 目录:

      ScriptAlias /cgi-bin/ /var/www/cgi-bin/

      所有的 HTTP 服务器执行 CGI 程序都保存在一个预先配置的目录。这个目录被称为 CGI 目录,并按照惯例,它被命名为 /var/www/cgi-bin 目录。

      CGI 文件的扩展名为 .cgi,Python也可以使用 .py 扩展名。

      默认情况下,Linux 服务器配置运行的 cgi-bin 目录中为 /var/www。

      如果你想指定其他运行 CGI 脚本的目录,可以修改 httpd.conf 配置文件,如下所示:

      <Directory "/var/www/cgi-bin">   AllowOverride None   Options +ExecCGI   Order allow,deny   Allow from all</Directory>

      在 AddHandler 中添加 .py 后缀,这样我们就可以访问 .py 结尾的 Python 脚本文件:

      AddHandler cgi-script .cgi .pl .py

      第一个 CGI 程序

      我们使用 Python 创建第一个 CGI 程序,文件名为 hellp.py,文件位于 /var/www/cgi-bin 目录中,内容如下,修改文件的权限为 755:

      #coding=utf-8#!/usr/bin/pythonprint "Content-type:text/html
      
      "print '<html>'print '<head>'print '<title>Hello Word - First CGI Program</title>'print '</head>'print '<body>'print '<h2>Hello Word! This is my first CGI program</h2>'print '</body>'print '</html>'

      以上程序在浏览器访问显示结果如下:

      Hello Word! This is my first CGI program

      这个的hello.py脚本是一个简单的Python脚本,脚本第一行的输出内容"Content-type:text/html "发送到浏览器并告知浏览器显示的内容类型为"text/html"。


      HTTP 头部

      hello.py 文件内容中的" Content-type:text/html "即为 HTTP 头部的一部分,它会发送给浏览器告诉浏览器文件的内容类型。

      HTTP 头部的格式如下:

      HTTP 字段名: 字段内容

      例如:

      Content-type: text/html

      以下表格介绍了 CGI 程序中 HTTP 头部经常使用的信息:

      描述
      Content-type:请求的与实体对应的 MIME 信息。例如: Content-type:text/html
      Expires: Date响应过期的日期和时间
      Location: URL用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源
      Last-modified: Date请求资源的最后修改时间
      Content-length: N请求的内容长度
      Set-Cookie: String设置 Http Cookie

      CGI 环境变量

      所有的 CGI 程序都接收以下的环境变量,这些变量在 CGI 程序中发挥了重要的作用:

      变量名描述
      CONTENT_TYPE这个环境变量的值指示所传递来的信息的 MIME 类型。目前,环境变量 CONTENT_TYPE 一般都是:application/x-www-form-urlencoded,他表示数据来自于 HTML 表单。
      CONTENT_LENGTH如果服务器与 CGI 程序信息的传递方式是 POST,这个环境变量即使从标准输入 STDIN 中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
      HTTP_COOKIE客户机内的 COOKIE 内容。
      HTTP_USER_AGENT提供包含了版本数或其他专有数据的客户浏览器信息。
      PATH_INFO这个环境变量的值表示紧接在 CGI 程序名之后的其他路径信息。它常常作为 CGI 程序的参数出现。
      QUERY_STRING如果服务器与 CGI 程序信息的传递方式是 GET,这个环境变量的值即使所传递的信息。这个信息经跟在 CGI 程序名的后面,两者中间用一个问号'?'分隔。
      REMOTE_ADDR这个环境变量的值是发送请求的客户机的IP地址,例如上面的 192.168.1.67。这个值总是存在的。而且它是 Web 客户机需要提供给 Web 服务器的唯一标识,可以在 CGI 程序中用它来区分不同的 Web 客户机。
      REMOTE_HOST这个环境变量的值包含发送 CGI 请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
      REQUEST_METHOD提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
      SCRIPT_FILENAMECGI 脚本的完整路径
      SCRIPT_NAMECGI 脚本的的名称
      SERVER_NAME这是你的 WEB 服务器的主机名、别名或IP地址。
      SERVER_SOFTWARE这个环境变量的值包含了调用 CGI 程序的 HTTP 服务器的名称和版本号。例如,上面的值为 Apache/2.2.14(Unix)

      以下是一个简单的 CGI 脚本输出 CGI 的环境变量:

      #!/usr/bin/python# -*- coding: UTF-8 -*-# filename:test.pyimport osprint "Content-type: text/html"printprint "<meta charset="utf-8">"print "<b>环境变量</b><br>";print "<ul>"for key in os.environ.keys():    print "<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key])print "</ul>"

      GET 和 POST 方法

      浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法。

      使用 GET 方法传输数据

      GET 方法发送编码后的用户信息到服务端,数据信息包含在请求页面的 URL 上,以"?"号分割, 如下所示:

      http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

      有关 GET 请求的其他一些注释:

      • GET 请求可被缓存
      • GET 请求保留在浏览器历史记录中
      • GET 请求可被收藏为书签
      • GET 请求不应在处理敏感数据时使用
      • GET 请求有长度限制
      • GET 请求只应当用于取回数据

      简单的 url 实例:GET方法

      以下是一个简单的 URL,使用 GET 方法向 hello_get.py 程序发送两个参数:

      /cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

      以下为 hello_get.py 文件的代码:

      #coding=utf-8#!/usr/bin/python# CGI处理模块import cgi, cgitb # 创建 FieldStorage 的实例化form = cgi.FieldStorage() # 获取数据first_name = form.getvalue('first_name')last_name  = form.getvalue('last_name')print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Hello - Second CGI Program</title>"print "</head>"print "<body>"print "<h2>Hello %s %s</h2>" % (first_name, last_name)print "</body>"print "</html>"

      浏览器请求输出结果:

      Hello ZARA ALI

      简单的表单实例:GET 方法

      以下是一个通过 HTML 的表单使用 GET 方法向服务器发送两个数据,提交的服务器脚本同样是 hello_get.py 文件,代码如下:

      <form action="/cgi-bin/hello_get.py" method="get">First Name: <input type="text" name="first_name">  <br />Last Name: <input type="text" name="last_name" /><input type="submit" value="Submit" /></form>

      使用 POST 方法传递数据

      使用 POST 方法向服务器传递数据是更安全可靠的,像一些敏感信息如用户密码等需要使用 POST 传输数据。

      以下同样是 hello_get.py ,它也可以处理浏览器提交的 POST 表单数据:

      #coding=utf-8#!/usr/bin/python# 引入 CGI 模块 import cgi, cgitb # 创建 FieldStorage 实例form = cgi.FieldStorage() # 获取表单数据first_name = form.getvalue('first_name')last_name  = form.getvalue('last_name')print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Hello - Second CGI Program</title>"print "</head>"print "<body>"print "<h2>Hello %s %s</h2>" % (first_name, last_name)print "</body>"print "</html>"

      以下为表单通过 POST 方法向服务器脚本 hello_get.py 提交数据:

      <form action="/cgi-bin/hello_get.py" method="post">First Name: <input type="text" name="first_name"><br />Last Name: <input type="text" name="last_name" /><input type="submit" value="Submit" /></form>

      通过 CGI 程序传递 checkbox 数据

      checkbox 用于提交一个或者多个选项数据,HTML 代码如下:

      <form action="/cgi-bin/checkbox.cgi" method="POST" target="_blank"><input type="checkbox" name="maths" value="on" /> Maths<input type="checkbox" name="physics" value="on" /> Physics<input type="submit" value="Select Subject" /></form>

      以下为 checkbox.cgi 文件的代码:

      #coding=utf-8#!/usr/bin/python# 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据if form.getvalue('maths'):   math_flag = "ON"else:   math_flag = "OFF"if form.getvalue('physics'):   physics_flag = "ON"else:   physics_flag = "OFF"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Checkbox - Third CGI Program</title>"print "</head>"print "<body>"print "<h2> CheckBox Maths is : %s</h2>" % math_flagprint "<h2> CheckBox Physics is : %s</h2>" % physics_flagprint "</body>"print "</html>"

      通过 CGI 程序传递 Radio 数据

      Radio 只向服务器传递一个数据,HTML 代码如下:

      <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"><input type="radio" name="subject" value="maths" /> Maths<input type="radio" name="subject" value="physics" /> Physics<input type="submit" value="Select Subject" /></form>

      radiobutton.py 脚本代码如下:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('subject'):   subject = form.getvalue('subject')else:   subject = "Not set"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Radio - Fourth CGI Program</title>"print "</head>"print "<body>"print "<h2> Selected Subject is %s</h2>" % subjectprint "</body>"print "</html>"

      通过 CGI 程序传递 Textarea 数据

      Textarea 向服务器传递多行数据,HTML 代码如下:

      <form action="/cgi-bin/textarea.py" method="post" target="_blank"><textarea name="textcontent" cols="40" rows="4">Type your text here...</textarea><input type="submit" value="Submit" /></form>

      textarea.cgi脚本代码如下:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('textcontent'):   text_content = form.getvalue('textcontent')else:   text_content = "Not entered"print "Content-type:text/html
      
      "print "<html>"print "<head>";print "<title>Text Area - Fifth CGI Program</title>"print "</head>"print "<body>"print "<h2> Entered Text Content is %s</h2>" % text_contentprint "</body>"

      通过CGI程序传递下拉数据

      HTML下拉框代码如下:

      <form action="/cgi-bin/dropdown.py" method="post" target="_blank"><select name="dropdown"><option value="Maths" selected>Maths</option><option value="Physics">Physics</option></select><input type="submit" value="Submit"/></form>

      dropdown.py 脚本代码如下所示:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('dropdown'):   subject = form.getvalue('dropdown')else:   subject = "Not entered"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Dropdown Box - Sixth CGI Program</title>"print "</head>"print "<body>"print "<h2> Selected Subject is %s</h2>" % subjectprint "</body>"print "</html>"

      CGI 中使用 Cookie

      在 http 协议一个很大的缺点就是不作用户身份的判断,这样给编程人员带来很大的不便,

      而 cookie 功能的出现弥补了这个缺憾。

      所有 cookie 就是在客户访问脚本的同时,通过客户的浏览器,在客户硬盘上写入纪录数据 ,当下次客户访问脚本时取回数据信息,从而达到身份判别的功能,cookie 常用在密码判断中 。

      cookie 的语法

      http cookie 的发送是通过 http 头部来实现的,他早于文件的传递,头部 set-cookie 的语法如下:

      Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
      • name=name: 需要设置 cookie 的值 (name 不能使用";"和","号),有多个name值时用";"分隔例如:name1=name1;name2=name2;name3=name3。
      • expires=date: cookie 的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
      • path=path: 设置 cookie 支持的路径,如果 path 是一个路径,则 cookie 对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果 path 是一个文件,则 cookie 指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
      • domain=domain: 对 cookie 生效的域名,例如:domain="www.chinalb.com"
      • secure: 如果给出此标志,表示 cookie 只能通过 SSL 协议的 https 服务器来传递。
      • cookie 的接收是通过设置环境变量 HTTP_COOKIE 来实现的,CGI 程序可以通过检索该变量获取 cookie 信息。

      Cookie 设置

      Cookie 的设置非常简单,cookie 会在 http 头部单独发送。以下实例在 cookie 中设置了 UserID 和 Password:

      <pre>#coding=utf-8#!/usr/bin/pythonprint "Set-Cookie:UserID=XYZ;
      "print "Set-Cookie:Password=XYZ123;
      "print "Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT";
      "print "Set-Cookie:Domain=www.51coolma.cn;
      "print "Set-Cookie:Path=/perl;
      "print "Content-type:text/html
      
      "...........Rest of the HTML Content....

      以上实例使用了 Set-Cookie 头信息来设置 Cookie 信息,可选项中设置了 Cookie 的其他属性,如过期时间 Expires,域名 Domain,路径 Path。这些信息设置在 "Content-type:text/html "之前。


      检索 Cookie 信息

      Cookie 信息检索页非常简单,Cookie 信息存储在 CGI 的环境变量 HTTP_COOKIE 中,存储格式如下:

      key1=value1;key2=value2;key3=value3....

      以下是一个简单的 CGI 检索 cookie 信息的程序:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling from os import environimport cgi, cgitbif environ.has_key('HTTP_COOKIE'):   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):      (key, value ) = split(cookie, '=');      if key == "UserID":         user_id = value      if key == "Password":         password = valueprint "User ID  = %s" % user_idprint "Password = %s" % password

      以上脚本输出结果如下:

      User ID = XYZPassword = XYZ123

      文件上传实例:

      HTML 设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示:

      <!DOCTYPE html><html><head><meta charset="utf-8"><title>51coolma教程(51coolma.cn)</title></head><body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post">   <p>选中文件: <input type="file" name="filename" /></p>   <p><input type="submit" value="上传" /></p>   </form></body></html>

      save_file.py 脚本文件代码如下:

      #coding=utf-8#!/usr/bin/pythonimport cgi, osimport cgitb; cgitb.enable()form = cgi.FieldStorage()# 获取文件名fileitem = form['filename']# 检测文件是否上传if fileitem.filename:   # 设置文件路径    fn = os.path.basename(fileitem.filename)   open('/tmp/' + fn, 'wb').write(fileitem.file.read())   message = 'The file "' + fn + '" was uploaded successfully'   else:   message = 'No file was uploaded'   print """Content-Type: text/html
      <html><body>   <p>%s</p></body></html>""" % (message,)

      如果你使用的系统是 Unix/Linux,你必须替换文件分隔符,在 window 下只需要使用 open() 语句即可:

      fn = os.path.basename(fileitem.filename.replace("", "/" ))

      文件下载对话框

      如果我们需要为用户提供文件下载链接,并在用户点击链接后弹出文件下载对话框,我们通过设置 HTTP 头信息来实现这些功能,功能代码如下:

      #coding=utf-8#!/usr/bin/python# HTTP Headerprint "Content-Type:application/octet-stream; name="FileName"
      ";print "Content-Disposition: attachment; filename="FileName"
      
      ";# Actual File Content will go hear.fo = open("foo.txt", "rb")str = fo.read();print str# Close opend filefo.close()


      Python CGI 编程


       注:在pythonCGI编程方面,python2和python3的区别并不大(区别在于pythonCGI文件开头的指定解释器不同和print语句不同,不过在python27版本中也可以使用类似python3的print语句)。综合对比后小编觉得本篇文章有可取之处,所以保留本篇文章,python3 CGI编程文章内容较新,有更好的参考价值——python3CGI编程

      什么是 CGI

      CGI 目前由 NCSA 维护,NCSA 定义 CGI 如下:

      CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP 服务器,提供同客户端 HTML 页面的接口。


      网页浏览

      为了更好的了解 CGI 是如何工作的,我们可以从在网页上点击一个链接或 URL 的流程:

      • 1、使用你的浏览器访问 URL 并连接到 HTTP web 服务器。
      • 2、Web 服务器接收到请求信息后会解析 URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。
      • 3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。

      CGI 程序可以是 Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等。


      CGI 架构图

      CGI构架图


      Web 服务器支持及配置

      在你进行 CGI 编程前,确保您的 Web 服务器支持 CGI 及已经配置了 CGI 的处理程序。

      Apache 支持 CGI 配置:

      设置好 CGI 目录:

      ScriptAlias /cgi-bin/ /var/www/cgi-bin/

      所有的 HTTP 服务器执行 CGI 程序都保存在一个预先配置的目录。这个目录被称为 CGI 目录,并按照惯例,它被命名为 /var/www/cgi-bin 目录。

      CGI 文件的扩展名为 .cgi,Python也可以使用 .py 扩展名。

      默认情况下,Linux 服务器配置运行的 cgi-bin 目录中为 /var/www。

      如果你想指定其他运行 CGI 脚本的目录,可以修改 httpd.conf 配置文件,如下所示:

      <Directory "/var/www/cgi-bin">   AllowOverride None   Options +ExecCGI   Order allow,deny   Allow from all</Directory>

      在 AddHandler 中添加 .py 后缀,这样我们就可以访问 .py 结尾的 Python 脚本文件:

      AddHandler cgi-script .cgi .pl .py

      第一个 CGI 程序

      我们使用 Python 创建第一个 CGI 程序,文件名为 hellp.py,文件位于 /var/www/cgi-bin 目录中,内容如下,修改文件的权限为 755:

      #coding=utf-8#!/usr/bin/pythonprint "Content-type:text/html
      
      "print '<html>'print '<head>'print '<title>Hello Word - First CGI Program</title>'print '</head>'print '<body>'print '<h2>Hello Word! This is my first CGI program</h2>'print '</body>'print '</html>'

      以上程序在浏览器访问显示结果如下:

      Hello Word! This is my first CGI program

      这个的hello.py脚本是一个简单的Python脚本,脚本第一行的输出内容"Content-type:text/html "发送到浏览器并告知浏览器显示的内容类型为"text/html"。


      HTTP 头部

      hello.py 文件内容中的" Content-type:text/html "即为 HTTP 头部的一部分,它会发送给浏览器告诉浏览器文件的内容类型。

      HTTP 头部的格式如下:

      HTTP 字段名: 字段内容

      例如:

      Content-type: text/html

      以下表格介绍了 CGI 程序中 HTTP 头部经常使用的信息:

      描述
      Content-type:请求的与实体对应的 MIME 信息。例如: Content-type:text/html
      Expires: Date响应过期的日期和时间
      Location: URL用来重定向接收方到非请求 URL 的位置来完成请求或标识新的资源
      Last-modified: Date请求资源的最后修改时间
      Content-length: N请求的内容长度
      Set-Cookie: String设置 Http Cookie

      CGI 环境变量

      所有的 CGI 程序都接收以下的环境变量,这些变量在 CGI 程序中发挥了重要的作用:

      变量名描述
      CONTENT_TYPE这个环境变量的值指示所传递来的信息的 MIME 类型。目前,环境变量 CONTENT_TYPE 一般都是:application/x-www-form-urlencoded,他表示数据来自于 HTML 表单。
      CONTENT_LENGTH如果服务器与 CGI 程序信息的传递方式是 POST,这个环境变量即使从标准输入 STDIN 中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
      HTTP_COOKIE客户机内的 COOKIE 内容。
      HTTP_USER_AGENT提供包含了版本数或其他专有数据的客户浏览器信息。
      PATH_INFO这个环境变量的值表示紧接在 CGI 程序名之后的其他路径信息。它常常作为 CGI 程序的参数出现。
      QUERY_STRING如果服务器与 CGI 程序信息的传递方式是 GET,这个环境变量的值即使所传递的信息。这个信息经跟在 CGI 程序名的后面,两者中间用一个问号'?'分隔。
      REMOTE_ADDR这个环境变量的值是发送请求的客户机的IP地址,例如上面的 192.168.1.67。这个值总是存在的。而且它是 Web 客户机需要提供给 Web 服务器的唯一标识,可以在 CGI 程序中用它来区分不同的 Web 客户机。
      REMOTE_HOST这个环境变量的值包含发送 CGI 请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
      REQUEST_METHOD提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
      SCRIPT_FILENAMECGI 脚本的完整路径
      SCRIPT_NAMECGI 脚本的的名称
      SERVER_NAME这是你的 WEB 服务器的主机名、别名或IP地址。
      SERVER_SOFTWARE这个环境变量的值包含了调用 CGI 程序的 HTTP 服务器的名称和版本号。例如,上面的值为 Apache/2.2.14(Unix)

      以下是一个简单的 CGI 脚本输出 CGI 的环境变量:

      #!/usr/bin/python# -*- coding: UTF-8 -*-# filename:test.pyimport osprint "Content-type: text/html"printprint "<meta charset="utf-8">"print "<b>环境变量</b><br>";print "<ul>"for key in os.environ.keys():    print "<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key])print "</ul>"

      GET 和 POST 方法

      浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法。

      使用 GET 方法传输数据

      GET 方法发送编码后的用户信息到服务端,数据信息包含在请求页面的 URL 上,以"?"号分割, 如下所示:

      http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

      有关 GET 请求的其他一些注释:

      • GET 请求可被缓存
      • GET 请求保留在浏览器历史记录中
      • GET 请求可被收藏为书签
      • GET 请求不应在处理敏感数据时使用
      • GET 请求有长度限制
      • GET 请求只应当用于取回数据

      简单的 url 实例:GET方法

      以下是一个简单的 URL,使用 GET 方法向 hello_get.py 程序发送两个参数:

      /cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

      以下为 hello_get.py 文件的代码:

      #coding=utf-8#!/usr/bin/python# CGI处理模块import cgi, cgitb # 创建 FieldStorage 的实例化form = cgi.FieldStorage() # 获取数据first_name = form.getvalue('first_name')last_name  = form.getvalue('last_name')print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Hello - Second CGI Program</title>"print "</head>"print "<body>"print "<h2>Hello %s %s</h2>" % (first_name, last_name)print "</body>"print "</html>"

      浏览器请求输出结果:

      Hello ZARA ALI

      简单的表单实例:GET 方法

      以下是一个通过 HTML 的表单使用 GET 方法向服务器发送两个数据,提交的服务器脚本同样是 hello_get.py 文件,代码如下:

      <form action="/cgi-bin/hello_get.py" method="get">First Name: <input type="text" name="first_name">  <br />Last Name: <input type="text" name="last_name" /><input type="submit" value="Submit" /></form>

      使用 POST 方法传递数据

      使用 POST 方法向服务器传递数据是更安全可靠的,像一些敏感信息如用户密码等需要使用 POST 传输数据。

      以下同样是 hello_get.py ,它也可以处理浏览器提交的 POST 表单数据:

      #coding=utf-8#!/usr/bin/python# 引入 CGI 模块 import cgi, cgitb # 创建 FieldStorage 实例form = cgi.FieldStorage() # 获取表单数据first_name = form.getvalue('first_name')last_name  = form.getvalue('last_name')print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Hello - Second CGI Program</title>"print "</head>"print "<body>"print "<h2>Hello %s %s</h2>" % (first_name, last_name)print "</body>"print "</html>"

      以下为表单通过 POST 方法向服务器脚本 hello_get.py 提交数据:

      <form action="/cgi-bin/hello_get.py" method="post">First Name: <input type="text" name="first_name"><br />Last Name: <input type="text" name="last_name" /><input type="submit" value="Submit" /></form>

      通过 CGI 程序传递 checkbox 数据

      checkbox 用于提交一个或者多个选项数据,HTML 代码如下:

      <form action="/cgi-bin/checkbox.cgi" method="POST" target="_blank"><input type="checkbox" name="maths" value="on" /> Maths<input type="checkbox" name="physics" value="on" /> Physics<input type="submit" value="Select Subject" /></form>

      以下为 checkbox.cgi 文件的代码:

      #coding=utf-8#!/usr/bin/python# 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据if form.getvalue('maths'):   math_flag = "ON"else:   math_flag = "OFF"if form.getvalue('physics'):   physics_flag = "ON"else:   physics_flag = "OFF"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Checkbox - Third CGI Program</title>"print "</head>"print "<body>"print "<h2> CheckBox Maths is : %s</h2>" % math_flagprint "<h2> CheckBox Physics is : %s</h2>" % physics_flagprint "</body>"print "</html>"

      通过 CGI 程序传递 Radio 数据

      Radio 只向服务器传递一个数据,HTML 代码如下:

      <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"><input type="radio" name="subject" value="maths" /> Maths<input type="radio" name="subject" value="physics" /> Physics<input type="submit" value="Select Subject" /></form>

      radiobutton.py 脚本代码如下:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('subject'):   subject = form.getvalue('subject')else:   subject = "Not set"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Radio - Fourth CGI Program</title>"print "</head>"print "<body>"print "<h2> Selected Subject is %s</h2>" % subjectprint "</body>"print "</html>"

      通过 CGI 程序传递 Textarea 数据

      Textarea 向服务器传递多行数据,HTML 代码如下:

      <form action="/cgi-bin/textarea.py" method="post" target="_blank"><textarea name="textcontent" cols="40" rows="4">Type your text here...</textarea><input type="submit" value="Submit" /></form>

      textarea.cgi脚本代码如下:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('textcontent'):   text_content = form.getvalue('textcontent')else:   text_content = "Not entered"print "Content-type:text/html
      
      "print "<html>"print "<head>";print "<title>Text Area - Fifth CGI Program</title>"print "</head>"print "<body>"print "<h2> Entered Text Content is %s</h2>" % text_contentprint "</body>"

      通过CGI程序传递下拉数据

      HTML下拉框代码如下:

      <form action="/cgi-bin/dropdown.py" method="post" target="_blank"><select name="dropdown"><option value="Maths" selected>Maths</option><option value="Physics">Physics</option></select><input type="submit" value="Submit"/></form>

      dropdown.py 脚本代码如下所示:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fieldsif form.getvalue('dropdown'):   subject = form.getvalue('dropdown')else:   subject = "Not entered"print "Content-type:text/html
      
      "print "<html>"print "<head>"print "<title>Dropdown Box - Sixth CGI Program</title>"print "</head>"print "<body>"print "<h2> Selected Subject is %s</h2>" % subjectprint "</body>"print "</html>"

      CGI 中使用 Cookie

      在 http 协议一个很大的缺点就是不作用户身份的判断,这样给编程人员带来很大的不便,

      而 cookie 功能的出现弥补了这个缺憾。

      所有 cookie 就是在客户访问脚本的同时,通过客户的浏览器,在客户硬盘上写入纪录数据 ,当下次客户访问脚本时取回数据信息,从而达到身份判别的功能,cookie 常用在密码判断中 。

      cookie 的语法

      http cookie 的发送是通过 http 头部来实现的,他早于文件的传递,头部 set-cookie 的语法如下:

      Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
      • name=name: 需要设置 cookie 的值 (name 不能使用";"和","号),有多个name值时用";"分隔例如:name1=name1;name2=name2;name3=name3。
      • expires=date: cookie 的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"
      • path=path: 设置 cookie 支持的路径,如果 path 是一个路径,则 cookie 对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果 path 是一个文件,则 cookie 指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。
      • domain=domain: 对 cookie 生效的域名,例如:domain="www.chinalb.com"
      • secure: 如果给出此标志,表示 cookie 只能通过 SSL 协议的 https 服务器来传递。
      • cookie 的接收是通过设置环境变量 HTTP_COOKIE 来实现的,CGI 程序可以通过检索该变量获取 cookie 信息。

      Cookie 设置

      Cookie 的设置非常简单,cookie 会在 http 头部单独发送。以下实例在 cookie 中设置了 UserID 和 Password:

      <pre>#coding=utf-8#!/usr/bin/pythonprint "Set-Cookie:UserID=XYZ;
      "print "Set-Cookie:Password=XYZ123;
      "print "Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT";
      "print "Set-Cookie:Domain=www.51coolma.cn;
      "print "Set-Cookie:Path=/perl;
      "print "Content-type:text/html
      
      "...........Rest of the HTML Content....

      以上实例使用了 Set-Cookie 头信息来设置 Cookie 信息,可选项中设置了 Cookie 的其他属性,如过期时间 Expires,域名 Domain,路径 Path。这些信息设置在 "Content-type:text/html "之前。


      检索 Cookie 信息

      Cookie 信息检索页非常简单,Cookie 信息存储在 CGI 的环境变量 HTTP_COOKIE 中,存储格式如下:

      key1=value1;key2=value2;key3=value3....

      以下是一个简单的 CGI 检索 cookie 信息的程序:

      #coding=utf-8#!/usr/bin/python# Import modules for CGI handling from os import environimport cgi, cgitbif environ.has_key('HTTP_COOKIE'):   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):      (key, value ) = split(cookie, '=');      if key == "UserID":         user_id = value      if key == "Password":         password = valueprint "User ID  = %s" % user_idprint "Password = %s" % password

      以上脚本输出结果如下:

      User ID = XYZPassword = XYZ123

      文件上传实例:

      HTML 设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示:

      <!DOCTYPE html><html><head><meta charset="utf-8"><title>51coolma教程(51coolma.cn)</title></head><body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post">   <p>选中文件: <input type="file" name="filename" /></p>   <p><input type="submit" value="上传" /></p>   </form></body></html>

      save_file.py 脚本文件代码如下:

      #coding=utf-8#!/usr/bin/pythonimport cgi, osimport cgitb; cgitb.enable()form = cgi.FieldStorage()# 获取文件名fileitem = form['filename']# 检测文件是否上传if fileitem.filename:   # 设置文件路径    fn = os.path.basename(fileitem.filename)   open('/tmp/' + fn, 'wb').write(fileitem.file.read())   message = 'The file "' + fn + '" was uploaded successfully'   else:   message = 'No file was uploaded'   print """Content-Type: text/html
      <html><body>   <p>%s</p></body></html>""" % (message,)

      如果你使用的系统是 Unix/Linux,你必须替换文件分隔符,在 window 下只需要使用 open() 语句即可:

      fn = os.path.basename(fileitem.filename.replace("", "/" ))

      文件下载对话框

      如果我们需要为用户提供文件下载链接,并在用户点击链接后弹出文件下载对话框,我们通过设置 HTTP 头信息来实现这些功能,功能代码如下:

      #coding=utf-8#!/usr/bin/python# HTTP Headerprint "Content-Type:application/octet-stream; name="FileName"
      ";print "Content-Disposition: attachment; filename="FileName"
      
      ";# Actual File Content will go hear.fo = open("foo.txt", "rb")str = fo.read();print str# Close opend filefo.close()


      Python File writelines() 方法

      Python File(文件) 方法 Python File(文件) 方法


      概述

      writelines() 方法用于向文件中写入一序列的字符串。

      这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

      换行需要制定换行符 。

      语法

      writelines() 方法语法如下:

      fileObject.writelines( [ str ])

      参数

      • str -- 要写入文件的字符串序列。

      返回值

      该方法没有返回值。

      实例

      以下实例演示了 writelines() 方法的使用:

      #!/usr/bin/python# -*- coding: UTF-8 -*-# 打开文件fo = open("test.txt", "w")print "文件名为: ", fo.nameseq = ["W3Cschool教程 1
      ", "W3Cschool教程 2"]fo.writelines( seq )# 关闭文件fo.close()

      以上实例输出结果为:

      文件名为:  test.txt

      查看文件内容:

      $ cat test.txt W3Cschool教程 1W3Cschool教程 2

      Python File(文件) 方法 Python File(文件) 方法


      Python complex() 函数

      Python 内置函数 Python 内置函数

      描述

      Python complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。。

      语法

      complex 语法:

      class complex([real[, imag]])

      参数说明:

      • real:int, long, float或字符串;
      • imag:int, long, float;

      返回值

      返回一个复数。

      实例

      以下实例展示了 complex 的使用方法:

      >>>complex(1, 2)(1 + 2j)>>> complex(1) # 数字(1 + 0j)>>> complex("1") # 当做字符串处理(1 + 0j)# 注意:这个地方在"+"号两边不能有空格,也就是不能写成"1 + 2j",应该是"1+2j",否则会报错>>> complex("1+2j")(1 + 2j)

      Python 内置函数 Python 内置函数



      Python all() 函数

      Python 内置函数 Python 内置函数

      描述

      Python all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。

      元素除了是 0、空、None、False 外都算 True。

      函数等价于:

      def all(iterable):    for element in iterable:        if not element:            return False    return True

      注意:Python 2.5 以上版本可用。

      语法

      以下是 all() 方法的语法:

      all(iterable)

      参数

      • iterable -- 元组或列表。

      返回值

      如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False;

      注意:空元组、空列表返回值为True,这里要特别注意。

      实例

      以下展示了使用 all() 方法的实例:

      >>> all(['a', 'b', 'c', 'd'])  # 列表list,元素都不为空或0True>>> all(['a', 'b', '', 'd'])   # 列表list,存在一个为空的元素False>>> all([0, 1,2, 3])          # 列表list,存在一个为0的元素False   >>> all(('a', 'b', 'c', 'd'))  # 元组tuple,元素都不为空或0True>>> all(('a', 'b', '', 'd'))   # 元组tuple,存在一个为空的元素False>>> all((0, 1, 2, 3))          # 元组tuple,存在一个为0的元素False   >>> all([])             # 空列表True>>> all(())             # 空元组True

      Python 内置函数 Python 内置函数

      Python 内置函数 Python 内置函数


      描述

      Python dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

      如果参数包含方法__dir__(),该方法将被调用。

      如果参数不包含__dir__(),该方法将最大限度地收集参数信息。


      语法

      dir 语法:

      dir(object)

      参数说明:

      • object:对象、变量、类型。

      返回值

      返回模块的属性列表。


      实例

      以下实例展示了 dir 的使用方法:

      >>>dir() # 获得当前模块的属性列表['__builtins__', '__doc__', '__name__', '__package__', 'arr', 'myslice']>>> dir([ ]) # 查看列表的方法['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']>>>



      Python 内置函数 Python 内置函数