Python高效开发实战:Django、Tornado、Flask、Twisted(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-15 17:34:10

点击下载

作者:刘长龙

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python高效开发实战:Django、Tornado、Flask、Twisted

Python高效开发实战:Django、Tornado、Flask、Twisted试读:

前言

有些人想学Python,却不知如何下手;有些人已经学会Python的基本语法,却不知如何使用Python进行网站设计和开发;有些人实践过个别Python网络框架,却因为Python框架过多而无法融会贯通:本书就是为他们准备的一本指南。正所谓知识来源于实践,本书严格遵守这一原则,对每个知识点都进行了示例分析,并在第3篇精选了4个不同应用场景的网络项目,帮助读者真正掌握和运用Python及其周边框架。

为什么要读这本书

如果你不知道本书能否帮到你,或者你不知道是否要选择本书,那么请先想想在平时的学习或工作中是否遇到过这些问题:

● 有一个很好的设计网站的想法,想用Python实现却无从着手;

● 刚学习了编程语言的if、for、while等各种语法,却不知道利用编程语言到底能做些什么;

● 精通C、C++等后台编程语言,却跟不上互联网蓬勃发展的新技术;

● 学了美工画图、网页设计,却不懂数据库和网站搭建;

● 觉得Django、Tornado、Flask、Twisted这些框架的在线资料过于晦涩难懂;

● 知道各种Python Web框架,却不知道自己的项目适合哪一种;

● 学过W3CSchool中的Python课程,却不知道如何使用框架提高开发效率;

● 会开发网站程序,却不知道如何集成Nginx等Web服务器;

● 听说过SSL,让自己的网站支持HTTPS/SSL却力不从心;

● 学过网络编程,却还是不知道IPv6和IPv4的区别;

● 会网络数据库开发,却分不清楚PostgreSQL、SQLite、Oracle、MySQL、SQL Server的区别;

● 纠结于高网络流量时使用什么框架开发网站最好。

如果这其中有些是你正在困惑的地方,那么本书也许能帮到你;如果通过学习本书能帮你解决实际问题,那么笔者也就实现了写作本书的目标。

本书的编写特点

1.零基础要求

在学习本书之前不需要具备任何计算机专业背景,任何有志于Python 及Web站点设计的读者都能利用本书从头学起。本书在基础和实践部分都有大量实例,代码短小精练,紧扣所讲要点的本质,以加深读者的印象;同时结合笔者多年使用Python语言的开发经验,阐述了很多代码编写技巧,读者可将代码复制到自己的机器上进行实验,自行实践和演练。

2.合理的章节安排

本书首先讲解了Python编程语言、网络和数据库基础知识、前端页面基础等知识点,然后详细讲解了Django、Tornado、Flask、Twisted这4大主流的Python Web开发框架,最后通过项目实践帮助读者综合运用之前学到的知识。

3.最新的框架版本

主流Python Web框架都是开源软件,并且仍随着计算机软硬件的进步处于不断发展中,所以使用Python框架的开发者必须紧跟最新的框架版本!本书讲解的4个Web框架都基于最新的框架版本,使得读者能马上将其运用在当前开发环境中。这是一本内容新颖、全面的Python Web框架应用实战教材。

4.内容全面

本书使得Python开发者不再局限于某个Web 框架,一起学习这些框架有助于在学习的过程中举一反三、融会贯通。读者学完本书后可以成为Python Web编程方面的集大成者,对不同网络应用场景的设计和开发都能做到得心应手。

5.中小示例、项目案例,一个都不能少

根据作者多年的项目经验,本书通过将典型的示例与知识点加以整合,让读者对每章的知识点都有整体把握。最后4章介绍的项目案例不仅可以让读者在实际应用中更加熟练地掌握前面讲到的知识点,更能让读者了解前端开发中由轮廓到细节的完整实现流程。

本书以Python Web实战为主,所有代码均通过笔者上机调试,力求读者能学得懂、练得会。

本书的内容安排

本书共3篇13章,内容覆盖编程基础、Web框架详解及开发实战。

第1篇(第1~4章)打好Python基础

系统学习Python编程语言,并且掌握进行网络开发必备的网络基础、数据库设计、HTML、CSS、JavaScript等知识。本篇不仅适合新手学习,对有经验的开发者同样适用。

第2篇(第5~9章)详解主流Python Web框架

详细讲述了Django、Tornado、Flask、Twisted这4大主流Python Web框架的开发方法,在其中穿插学习Python虚环境、Nginx服务器、SQLAlchemy、HTML模板、HTML5 WebSocket等通用组件和技术。站在框架这个巨人的肩膀上,我们不仅可以提高开发效率,还可以实现多人协同、风格统一。

第3篇(第10~13章)实战项目

分别应用4大主流框架实践开发不同类型的网站项目应用,模拟场景覆盖社交网站、聊天室、信息管理系统、物联网消息网关等各个方面,在其中还加入了JavaScript、CSS、jQuery、Bootstrap等前端关键技术的应用,使得读者通过深入浅出的学习和实践成为全能开发者。

笔者按照自身近20年的学习和开发经验编排了本书的章节顺序,所以推荐按顺序从第1章学习到第13章,尤其不能遗漏第1篇基础部分的内容。时间特别紧迫或者只想精通个别Python Web框架的读者,也可以在阅读第1篇后直接阅读所需框架在第2篇和第3篇中的相应部分。

本书知识点图

本书面对的读者

● Python编程技术爱好者

● Django、Tornado、Flask、Twisted项目参与者

● 网站设计人员

● 网站开发人员

● 网站后台开发人员

● Web前端开发入门者

● 想由网页设计拓展为后台开发的设计者

● 由单机软件开发转向Web开发的技术人员

● 全栈开发人员

● 大中专院校的学生及各种IT培训学校的学生

● 希望自己动手设计站点原型的需求分析人员

编者推荐

本书的写作目的是确保读者能运用一些工具、框架、已有代码来提高开发效率和节约人力成本,确保读者能活学活用本书所讲解的内容。通过阅读本书,读者能知道如何设计一个网站、如何选择Python Web框架,以及如何快速使用框架进行应用开发。全书包含大量的实战案例和开发技巧,总结了使用Python进行Web开发时的优秀实践(Django、Tornado、Flask、Twisted、SQLAlchemy、Nginx、JavaScript、jQuery),讨论了各种实际问题的解决方案,是目前市场上全面实践Python Web开发的书籍。

致谢

笔者要把本书献给笔者的父母、岳父、岳母、妻子和孩子,感谢他们一直鼓励笔者,没有他们的支持,笔者无法做到这一切;还要感谢笔者的朋友和同事,感谢他们对笔者不断地鼓励和帮助。笔者非常幸运,能够和这些聪明、投入的人一起工作和交流。第1篇打好Python基础第1章 Python基础知识第2章 Web编程之网络基础第3章 客户端的编程技术第4章 数据库及ORM第1章Python基础知识

目前,国内外信息化建设已经进入以Web和Cloud应用为基础核心的阶段。Python作为解释性的计算机程序设计语言,由于其在开发效率上的优势,越来越多的企业和开发者将其作为全新Web应用的首选开发语言。掌握Python语言本身是用Python进行Web开发的基础。本章涉及的主要内容如下。

● Python综述:了解Python,学习其安装、编辑环境。

● 基本数据类型:掌握数值、字符串等Python基本数据类型。

● 流程控制:掌握if、for、while等语句,学会使用函数。

● 复合数据结构:掌握集合、列表、字典等在Python中的应用。

● 函数编程:函数定义及调用、变长参数的使用、匿名函数。

● 异常:异常的概念及如何生成、处理Python异常。

● 面向对象基础:面向对象概念在Python中的应用。1.1 Python综述

Python是一种可以撰写跨平台应用程序的面向对象的程序设计语言,它具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于Web、PC、商业分析等领域,同时在全球范围内拥有众多开发者专业社群。

1.1.1 了解Python的特性及版本

1.Python的历史及特点

贵铎·范·罗萨姆(Guido Van Rossum)于1989年底首创Python,当时他还在荷兰的CWI (Centrum voor Wiskunde en Informatica,国家数学和计算机科学研究院)工作。1991年初,Python发布了第1个公开发行版。至2016年,Python已经流行并发展了25年,在各个领域有着广泛的应用,究其原因,Python的流行归结于以下几个方面。

● 解释性语言:解释性语言的程序不需要开发者进行编译,在运行程序时才被翻译成机器代码。脚本语言解释执行的特点是“随时编辑、随时生效”。计算机硬件愈发廉价,间接使得在多数商务应用中软件的运行效率不再是选择开发语言的首要标准。而企业也逐步意识到开发效率和可移植性的重要性,这使得脚本语言在软件项目中扮演着越来越重要的角色。

● 高级性:Python的高级性不是相对于汇编语言而言的,而是相对于C++、Java等高级语言而言的。Python在语言层面对开发者提供了更强大的支持。任何较具规模的应用程序都需要用到链表、字典等数据结构,在Python语言中,List、Set、Directionary等是内建于语言本身的。在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们,缩短开发时间与代码量,生产出可读性更好的代码。而在C++等语言中,这些需要通过附加的标准库来实现。

● 胶水语言:即使读者从未学习过Python,可能也知道Python是最主要的胶水语言之一。胶水语言(glue language)是用来连接软件组件的程序设计语言,这意味着Python就像一只八爪章鱼,可以连接各种主要的技术标准,比如Shell Command、Windows DLL和Web Service。在B/S应用大行其道的今天,曾经出现过几十个Python的Web开发框架,发展到现在已经形成了Django、Tornado等成熟的解决方案。

● 跨平台性:Windows、Linux、Mac 等操作系统的孰优孰劣之争由来已久,但这是一个永无止境的论题。目前已形成的共识总体可以归结为:Windows客户端简单易用,Linux胜在稳定性,Mac 提供更好的用户体验。Python 在各平台上都实现了编译解释器,使Python程序可以运行在不同的操作系统平台上。

● 健壮性:所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。一个软件能够检测自己内部的设计或者编码错误,并得到正确的执行结果,这是软件的正确性标准,但也可以说,软件有内部的保护机制,是模块级健壮的。Python的强类型机制、异常处理、垃圾的自动收集等是其程序健壮性的重要保证。使用Python的开发者不用在资源申请、回收等方面花费太多精力。

● 易学易用:Python的设计哲学是“优雅”“明确”“简单”。由于Python语言的简洁、易读及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程,例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。当然,在本书的主题Web领域,Python目前涌现了众多框架,最具代表性的就是本书将要讲解的Django、Tornado、Flask和Twisted。

说明:Python是一种解释性语言,虽然属于OpenSource的项目,但我们可以将其用于商业用途,并且可以将其放在用于商业的产品光盘中一同发售。

2.Python的当前版本

经过长时间的发展,Python同时流行两个不同的版本,它们分别是2.7.x和3.x版本,但是与其他语言不同的是,这两个主要版本之间无法实现兼容。Python 2经过25年的发展已经成熟,Python 3目前在行业内仍有较大争议。初学者经常面临先学习哪个版本的问题。因为Python的胶水语言特性,Python 2在兼容第三方库上做得比Python 3好很多,所以本书基于Python 2.7.x编写。

Python 2最重要的一个优势在于拥有众多的第三方库,可以用来做任何事情,但是Python 3没有这个优势。诚然,有很多的库已经移植到Python 3了,但是有更多的库没有移植,也不容易移植。例如,Python 2中的字节字符串(str)和Python 3中的字节字符串(bytes)之间有着功能上的差异,使得将程序从Python 3移植到第三方库支持的版本存在很大的时间风险。

同时有研究表明,Python 3运行pystone benchmark的速度比Python 2慢30%。所以Python 3仍有极大的优化空间,在字符串和整型操作上可以取得很好的优化结果。

注意:本书中的程序基于Python 2的最新版本2.7.11。

1.1.2 安装Python

只有在操作系统安装了Python环境之后,Python程序才能运行。Python安装包可以在Python官方网站https://www.python.org/downloads/下载,如图1.1所示。图1.1 Python安装包下载

Python Windows安装包以python-x.x.x.msi方式命名,其中x.x.x是所下载的版本号。直接运行该程序可以进入Python的安装界面,如图1.2所示。图1.2 Python在Windows中的安装界面

根据提示在引导界面中一直单击【Next】按钮,直到完成安装,如图1.3所示。图1.3 Python在Windows中完成安装

完成安装后需要把Python语言的执行路径加入Windows环境变量中,如图1.4所示,具体为:用鼠标右键单击【计算机】|【属性】|【高级系统设置】|【xxx的用户变量】窗口中的【Path】变量,在弹出的窗口中填入Python的安装路径,本例为C:\Python27。图1.4 在Windows中设置PATH环境变量

在操作系统中安装了Python后就可以手动运行Python程序,比如通过如下命令运行一个Python文件:C:\>python hello.py #运行名为hello.py的代码文件

说明:Python代码文件一般以*.py命名。

或者可以在Console(命令行窗口)中直接运行Python命令,以进入Python环境,如图1.5所示。图中的“>>>”是Python命令提示符,在其后可以输入任意Python命令。图1.5 Windows中启动Python环境

注意:最新的Linux和Mac系统都已自带Python解释器,无须开发者单独安装,所以本书不再赘述Python在Linux和Mac中的安装方法。

1.1.3 使用Python原生编辑器

IDLE是Python软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试Python程序。在安装Python后,开发者可以通过【Windows开始】|【Python x.x】|【IDLE】直接运行,界面如图1.6所示。图1.6 IDLE界面

图1.6中已经完成了一个“Hello World”的演示。通过IDLE,开发者可以快速进入Python环境,除了学习目的,有经验的开发者还可以用IDLE进行快速验证、测试等工作。作为一个编辑器,IDLE环境提供了如下功能。

● 一个多窗口环境,提供自动完成、自动缩进等基于Python的编辑功能。

● 语义解析、关键字高亮。

● 提供单步调试、断点、调用栈视图等功能。

常用的编辑方式如下。

● Undo:撤销上一次的修改。

● Redo:重复上一次的修改。

● Cut:将所选文本剪切至剪贴板。

● Copy:将所选文本复制到剪贴板。

● Paste:将剪贴板的文本粘贴到光标所在的位置。

● Find:在窗口中查找单词或模式。

● Find in files:在指定的文件中查找单词或模式。

● Replace:替换单词或模式。

● Go to line:将光标定位到指定的行首。

技巧:命令历史可以记录会话期间在命令行中执行过的所有命令。在提示符下,可以按Alt+P组合键找回这些命令,每按一次,IDLE就会从最近的命令开始检索命令历史,按命令使用的顺序逐个显示。按Alt+N组合键,则可以反方向遍历各个命令,即从最初的命令开始遍历。

通过菜单【Window】|【Debug Control】可以打开调试窗口,在IDLE中输入Python语句后,可以通过调试窗口中的4个控制按钮Go(执行)、Step(单步)、Over(单行执行)、Out (跳出函数)进行调试,如图1.7所示。图1.7 在IDLE中调试Python语句

1.1.4 使用Eclipse开发环境

虽然Python自带的IDLE环境提供了简单的编辑和调试Python程序的方法,但其功能简单,无法满足企业级项目开发的需求。

Python程序本身可以用任何文本编辑器来编写,从Windows记事本、Notepad++、UltraEdit,到Linux的VIM、EMACS等,有经验的开发者可以根据自己的习惯进行选择。但因为初学者本身可能缺少开发经验并熟悉Windows平台的操作,所以本书为初学者推荐一个成熟度较高的开发环境——Eclipse。使用Eclipse的PyDev插件可以搭建可视化、灵活控制、调试方法完备的Python专业开发环境。

1.安装Eclipse

Eclipse是一个在Windows环境下开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,通过插件构建开发环境。读者可以通过Eclipse官方网站https://eclipse.org/downloads/下载适合自己的操作系统的最新版本Eclipse软件包。下载后无须安装,解压后直接运行目录中的eclipse.exe即可启动,启动界面如图1.8所示。因为Eclipse基于Java和插件机制,所以启动通常需要一段时间。图1.8 Eclipse启动

注意:安装Eclipse之前必须先安装Java开发套件JDK。

首次启动Eclipse时会询问开发者项目的默认路径,确认则将【use this as the default and do not ask again】打钩,然后单击【OK】按钮即可,如图1.9所示。图1.9 Eclipse项目默认路径设置

2.安装PyDev插件

PyDev是Python在Eclipse中的环境插件,需要在Eclipse启动后进行安装。(1)单击【Help】|【Install New Software】菜单,在出现的界面中单击【Add…】按钮,在Add Repository对话框的【Name】中填写Pydev,在【Location】中填写http://pydev.org/updates,之后单击【OK】按钮,如图1.10所示。图1.10 在Eclipse中搜索Pydev(2)之后Eclipse会在线搜索PyDev并列出可安装的包,开发者需要选择【PyDev】,然后单击Install窗口中的【Next>】按钮,如图1.11所示。图1.11 在Eclipse中安装PyDev(3)之后会出现协议确认窗口,需要选择接受协议才能继续安装。在安装过程中Eclipse会自动从Internet下载安装包并安装,请读者耐心等待,如图1.12所示。图1.12 Eclipse安装软件过程(4)在安装过程中,Eclipse会跳出提示框,询问开发者是否信任PyDev,请读者选择信任使安装继续,如图1.13所示。图1.13 PyDev信任确认(5)安装完成后需要重启Eclipse才能使PyDev生效。

在进行Python开发之前需要在Eclipse中先配置Python解释器的路径,方法为:选择【Windows】|【Preferences】菜单,在出现的对话框中选择【PyDev】|【Interpreter】|【Python Interpreter】,单击对话框中的【New…】按钮,在出现的对话框中将【Interpreter Name】填写为Python,输入【Interpreter Executable】为所安装的Python解释器的完整路径名,本例中为“C:\Python27\python.exe”,如图1.14所示。对弹出的对话框逐个进行确认,即可完成对Python解释器的配置。图1.14 Python解释器配置

至此Python环境已经在Eclipse中安装完成。

3.用PyDev新建项目进行Python开发

可以通过在Eclipse中建立PyDev项目来进行Python项目开发。建立PyDev项目的方法如下。(1)在Eclipse中选择【File】|【New】|【Project…】菜单,在弹出的对话框中选择【PyDev】|【PyDev Project】,并单击【Next >】按钮,如图1.15所示。图1.15 选择Eclipse项目类型(2)在出现的PyDev项目对话框中输入项目的名字,其他选项可保持默认,单击【Finish】按钮建立项目,如图1.16所示。图1.16 新建PyDev项目

至此,已经可以使用Eclipse的强大功能进行Python开发了。

1.1.5 Python编程入门——解决“斐波那契数列”问题

在1.1.3节中,读者应该已经完成了对Python“Hello World”程序的编写。在本节中,通过解决一个被称为“斐波那契数列”的数学问题,读者可以对Python编程方法有个初步了解。

斐波那契数列的发明者是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年。斐波那契数列(Fibonacci Sequence)又被称为黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又被称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34……在数学上,斐波那契数列以递归的方法定义:F(0)=0, F(1)=1, F(n)=F(n−1)+F(n−2)(n≥2, n∈N*)。简单地归结斐波那契数列的规律为:第1个数值为0,第2个数值为1,之后的每个数值都是位于它之前的两个数值的和。【示例1-1】如下Python代码用于每隔一秒打印一个斐波那契数列数字,并且将数列保存到指定的文件中:#! /usr/bin/env python# -*- coding: utf-8 -*-import timedef fbis(num): result=[0,1] for i in range(num-2): result.append(result[-2]+result[-1]) return resultdef main(): result = fbis(10) fobj = open('C:\\ZZ_Disc_D\\Temp\\result.txt', 'w+') for i, num in enumerate(result): print u"第 %d 个数是: %d" % (i, num) fobj.write("%d"%num) time.sleep(1)if __name__ == '__main__': main()

代码解析如下。

● 一般情况下,在Python中用井号“#”标识注释行,但有两种特殊情况:当Python代码运行在Linux系统中时,“#! /usr/bin/env python”用于告诉系统Python解释器的位置;“ # -*- coding: utf-8 -*-”用于标识本文件用UTF-8格式编码。

● import语句用于导入包。本例中导入了time包,因为之后的sleep()函数位于其中。

● Python中的函数定义用def关键字完成,冒号“:”用于代码块开域。代码块通过缩进对齐表达代码逻辑而不是用大括号,因为没有了额外的字符,程序的可读性更高,而且缩进完全能够清楚地表达一个语句属于哪个代码块。本例中定义了两个函数:fbis和main。

注意:Python用缩进标识代码块,因此一个块内的每行代码的前导空格必须一致,否则执行时解析器会报错。

● 函数参数无须定义类型,比如本例中函数fbis()的参数num。

● List是Python中常用的列表类型,Python中的List类型用中括号对“[ ]”定义。本例fbis()中的result变量是list的实例,用于保存被生成的数列。

● range(num)函数用于生成从0到num-1的数字序列。

● [for … in …]语句是循环流程语句。在函数fbis()的for语句中,生成一个从0到num-2-1的循环,每个循环体中计算一个数值并加入result列表中。

● 列表变量的负数索引用于获取列表中倒数的元素,比如本例中的result[-1]意为获取result的倒数第1个元素。

● 函数main()中用参数10调用fbis()函数,生成10个斐波那契数字。

● Python的内置函数open()用于打开文件,其第1个参数是被打开的文件名,第2个参数是打开的方式,“w+”表示打开待写入的文件。函数main()将打开的文件句柄放在fobj变量中。

● enumerate()会将数组或列表组成一个索引序列,其返回值内包含两个变量的迭代器,第1个是序列号,第2个是数组、列表元素。

技巧:用enumerate生成带索引的迭代序列。

● 在Python中可以使用print语句打印输出,可以用print语句显示变量的字符串表示,或者仅使用变量名查看该变量的原始值。Python的print语句与字符串格式运算符(%)结合使用,可实现字符串替换功能,这一点和C语言中的printf()函数非常相似。字符串中的前缀“u”表示字符串用UTF-8格式编码。

注意:print中的格式运算符(%)后面的被替换变量一定要放在小括号内。

● 用文件句柄的write()函数可以向文件写入数据。类似地,文件句柄还有read()函数可以读入数据。

技巧:用open()函数打开文件,用write()函数向文件写入内容,用read()函数从文件中读出内容。

● 用time包的sleep()函数可以让程序暂停一段时间,本例中输入参数1以指定暂停1秒。

● 与其他高级语言一样,判断逻辑用if语句表达。本例中的if语句用于判断代码是被其他模块导入还是直接被执行;如果是直接被执行,则调用main()函数。

● __name__是Python的只读内置变量。在模块中访问该变量时,其随着模块的被调用方式的不同而有不同的值:当该模块被直接执行调用时,__name__的值为__main__;当该模块被其他模块用import语句调用时,该值为当前模块名。

技巧:用本例中的if __name__== '__main__': main()的方法启动main()函数是Python的常用方法。在Python中,所有内置变量都以“前带两个下画线_,后带两个下画线_”的方式命名。另一个常用的内置变量是__class__,在类内部使用时其内容为当前类名。

将代码文件保存为fbi.lpy文件,无须编译程序,直接用Python命令执行程序,其结果如图1.17所示。图1.17 执行斐波那契数列的结果1.2 数据类型

经过1.1节的学习,读者已经对Python开发有所了解,本节开始逐步学习Python的编程技巧。

数据类型的定义是一个值的集合及定义在这个集合上的一组操作。变量用来存储值的所在之处,它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。Python在声明变量时虽然无须指定数据类型,但是每个变量在被赋值时便会被赋予一种数据类型。所以,所有变量都具有数据类型,掌握数据类型是学好Python的基础。

1.2.1 Number类型

Number类型即数值类型,通常用于存储数字,是最常用的变量类型。

1.类型定义

Python中的数值类型包括如下种类:Integer、Long integer、Boolean、Double-precision floating和Complex number。(1)Integer:整型,相当于C语言中的long型,在32位机器上,整型的位宽为32位,取值范围为-231~231−1,即-2 147 483 648~2 147 483 647;在64位系统上,整型的位宽通常为64位,取值范围为-263~263−1,即-9 223 372 036 854 775 808~9 223 372 036 854 775 807。示例如下:a = 12 #正整数b = -405 #负整数c = 0x3A #十六进制表示的正整数(2)Long integer:长整型,数值后面以l或L结尾。长整型没有指定位宽,也就是说Python没有限制长整型数值的大小,但是实际上由于机器内存有限,所以开发者使用的长整数数值不可能无限大。示例如下:a = 39847520L #正数长整型b = -2398473253l #负数长整型c = 0xA32B9DDL #十六进制长整型(3)Boolean:布尔型,多用于判断场景,只有两个值:True、False。示例如下:a = False #假b= True #真(4)Double-precision floating:双精度浮点数,可以用直接的十进制或科学计数法表示,每个浮点数占8个字节。浮点数值通常都有一个小数点和一个可选的后缀e(大写或小写,表示科学计数法)。在e和指数之间可以用正(+)或负(-)表示指数的正负。示例如下:a = 1.7983 #普通小数b = -40. #相当于 -40.0c = 3e8 #科学计数法,相当于300,000,000(5)Complex number:复数,可以指不实的数字或并非表明具体数量的数字。复数由实数部分和虚数部分构成,虚数部分必须有后缀j或J。示例如下:a = 85.234+3j #以j结尾的复数b = 0-23.4J #以J结尾的复数

2.操作符

Python中的数值操作符分两类:一类是算数操作符,如加、减、乘、除;另一类是二进制比特操作符,如取反、异或等。表1.1列出了Python中的算数操作符,表1.2列出了Python中的比特操作符及其用法。表1.1 算数操作符操作符含义A + B加号;也可单独置于数字前,用于表示正数A - B减号;也可单独置于数字前,用于表示负数A * B乘号A / B除号;B不能为零,整数相除仍为整数A % B取余;结果为A除以B后取余A ** B幂操作符;结果为A的B次方A // B取整除符;结果为A除以B后的结果的整数部分not A取反操作;只用于Boolean类型A > B判断A是否大于B,结果为True或者FalseA < B判断A是否小于B,结果为True或者FalseA == B判断A与B是否相等,结果为True或者FalseA >= B判断A是否大于等于B,结果为True或者FalseA < =B判断A是否小于B,结果为True或者False表1.2 比特操作符操作符含义~A按二进制取反;按照补码规则,结果数字是-(A+1)并操作;只有两个比特位都为1时结果中的对应比特位才设1,A & B否则设零或操作;只要两个比特位有一个为1,结果中的对应位则设1,A | B否则设零异或操作;如果两个比特位相同,则结果中的对应位设零,A ^ B否则设1A >> B按比特位右移A << B按比特位左移

算数操作符的使用示例如下:a = 3 + 5.6 #结果为 8.6b = 2 ** 3 #结果为 2×2×2等于8c = 5 / 2 #结果为 2;整数相除结果需取整d = 5.0 / 2 #结果为 2.5e = 5.0 // 2 #结果为 2f = 10 % 3 #结果为 1g = not True #结果为 Falseh = a ==b #结果为 False

二进制比特操作符的使用举例如下:a = ~30 #结果为 -31b = 3 & 3 #结果为 3c = 3 & 1 #结果为 1d = 3 ^ 1 #结果为 2e = 3 << 1 #结果为 6

技巧:进行比特运算时,可以先想象这些数字的二进制形式,之后就能手到擒来。比如对于表达式3 ^ 1,其二进制形式为101 ^ 001 = 010,结果为十进制的2。

3.内置函数

除了操作符,Python中还有一组内置函数支持数值类型的变量操作。本书把这些内置函数分为两类:一类是通用函数,它们不仅适用于数值类型的变量,还适用于其他类型的变量;另一类是特定函数,它们只适用于数值类型的变量的相关操作。表1.3列出了Python中的通用函数,表1.4列出了Python中的数值类型的特定函数。表1.3 通用函数函数含义比较二者的大小,如果前者小则返回-1,前者大则返回1,相cmp(A, B)等则返回0str(A)将参数转换为可显示的字符串type(A)返回参数的类型对象bool(A)将参数转换为布尔类型int(A)将参数转换为整数类型,以十进制表达long(A)将参数转换为长整型,以十进制表达float(A)将参数转换为浮点类型Complex(A将参数转换为复数类型)表1.4 数值类型特定函数函数含义abs(A)取绝对值coerce(A, B)将A和B转换成一个类型,并生成一个原组divmod(A, B)除模操作;生成一个原组,形式为(A/B, A%B)pow(A, B)幂操作符;结果为“A的B次方”round(A)返回参数的四舍五入结果hex(A)将A转换为用十六进制表示的字符串oct(A)将A转换为用八进制表示的字符串chr(A)将A转换为ASCII字符,要求0≤A≤255ord(A)chr(A)的反函数

类型通用函数的使用示例如下:a = cmp(43, 12.32) #结果为 -1b = cmp(0, -2) #结果为 1c = cmp(0x12, 18) #结果为 0d = str(0x20) #结果为 '32'e = type(4L) #结果为 f = type(True) #结果为 g = type(45+5.4j) #结果为 h = bool("True") #输入为字符串类型,返回布尔类型TrueI = long("34") #输入为字符串类型,返回34L

数值类型特定函数的使用示例如下:a = abs(-3) #结果为 3b = coerce(24, -4.5) #结果为 (24.0, -4.5)c = divmod(5, 2) #结果为 (2, 1)d = round(5.7) #结果为 6e = hex(10) #结果为 'xA'f = chr(0x32) #结果为 '2'

1.2.2 Sequence类型簇

除了基本的数值类型,Python中的序列类型簇在Python编程中占有重要的地位,Python中的字符串(String)、元组(Tuple)、列表(List)都属于序列类型簇。可以将字符串看作由字符组成的序列类型,元祖是任意对象组成的不可修改序列类型,列表是任意对象组成的可修改序列。序列类型簇的操作方式在这些类型中共用,本节学习序列类型簇的共同技巧。

1.操作符

Python中的序列运算符包括元素提取、序列链接等,如表1.5所示。表1.5 序列运算符操作符含义A[index]获取序列中的第index个元素;index的取值从0开始A[index1 : 切片操作,获取序列中从第index1到第index2−1的子序列index2]A in B判断序列B中是否有A,如果有则返回True,否则返回False判断序列B中是否有A,如果没有则返回True,否则返回A not in BFalseA + B链接A和B,生成新的序列并返回A * number将A重复number次,生成新的序列并返回A > B判断A是否大于B,结果为True或者FalseA < B判断A是否小于B,结果为True或者FalseA == B判断A与B是否相等,结果为True或者FalseA >= B判断A是否大于等于B,结果为True或者FalseA < =B判断A是否小于B,结果为True或者False【示例1-2】序列运算符的使用示例如下:>>>a = "Hello, I like Python Web Practice! " #字符串类型>>>b = a[1] #结果为 'e'>>>b = a[7:13] #结果为 'I like'>>> print a[ :13]Hello, I like #第1个index如不写则默认为0>>> print a[14:]Python Web Practice #第2个index如不写则默认到序列结尾>>> print "like" in aTrue #'like’是a的子字符串>>>print a + "! ! "Hello, I like Python Web Practice! ! ! #字符串链接>>>print aHello, I like Python Web Practice! #变量a本身不会因为链接操作而变化>>> print 'ABC' * 3ABCABCABC #字符串重复生成>>>c = [2, 4, "apple", 5] #列表类型>>>print c[1:][4, "apple", 5] #打印从第1个到最后一个元素>>>print b + c[2]

2.内置函数

序列类型簇可以使用内置函数进行求长度、类型转换、排序等操作。序列类型内置函数如表1.6所示。表1.6 序列内置函数函数含义对序列A生成一个可枚举对象,对象中的每个元素是一个enumerate(A)二位元组,元组内容为(index, item),即(索引号,序列元素)len(A)返回序列A的长度list(A)转换为List类型max(A)A是一个序列,返回A中的最大元素lax(a, b, ….)返回所有参数中的最大元素lin(A)A是一个序列,返回A中的最小元素lin(a, b, …)返回所有参数中的最小元素reversed(A)生成A的反向序列sorted(A, func=None, 对A排序,排序规则按照参数func、key、reverse指定的key=None, 规则进行reverse=False)sum(A, init=0)对A中的元素求和tuple(A)转换为Tuple类型【示例1-3】序列内置函数的使用示例如下:>>>a = [56, 2, 1, 893, -0.4] #列表类型>>>b = len(a) #结果为 5>>>b = max(a) #结果为 893>>> b = min(a) #结果为 -0.4>>> print list(reversed(a))[-0.4, 893, 1, 2, 56] #反向序列>>> print sorted(a)[-0.4, 1, 2, 56, 893] #排序

1.2.3 String类型

字符串(String)是由零个或多个字符组成的有限序列。字符串通常以串的整体作为操作对象,例如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串及删除一个子串等。Python中的字符串是Sequence类型簇的一员,字符串以用引号包含标识,比如“Hello”‘This is fantacy! '。

技巧:在Python中双引号和单引号的意义相同,都可用于表示字符串。

1.基本使用

Python中的字符串分两种:一种是普通字符串,另一种是Unicode字符串。用引号声明的字符串是普通字符串;而在引号之前加上字母u时,Python会将其解释为Unicode字符串。【示例1-4】字符串基本使用演示如下:>>> str1 = "Hello, World! " #普通字符串>>> str2 = u"Hello, I'm Unicode! " #Unicode字符串>>> str3 = u"你好,世界!" #Unicode字符串>>>print str2 #打印字符串Hello, I'm Unicode!

技巧:如果字符串中包含汉字,则应该将其声明为Unicode字符串。【示例1-5】通过所有Sequence类型通用的切片操作可以读取字符串的部分内容:>>> str1 = "Hello, World! " #定义字符串>>> print str1[5] #读取位置为2的元素, #位置为2的元素是逗号’, '>>> print str1[7:] #读取位置从7到最后的子字符串World!【示例1-6】字符串是不可变类型,也就是说,改变一个字符串的元素需要新建一个新的字符串。如下代码演示了如何修改字符串:>>> str1 = str2 = "Hello, World! " #定义字符串>>> str1 = str1 + " I like Python! " #尾部附加内容>>>print str1Hello, World! I like Python!>>> str1 = str1[:6] + str1[-8:] #删除中间的部分内容>>>print str1Hello, Python

技巧:因为String是Sequence类型簇的成员,所以Sequence类型簇的所有操作符和函数都适用于String,本节不再重复举例。

2.字符串格式化【示例1-7】字符串格式化是按指定的规则连接、替换字符串并返回新的符合要求的字符串。比如:>>>charA = 65>>>charB = 66#将charA的内容以字符形式替换在要显示的字符串中>>>print u"ASCII码65代表:%c" % charAASCII码65代表:A#将charB的内容以数值形式替换在要显示的字符串中>>>print u"ASCII码%d代表:B" % charBASCII码66代表:B

Python中格式化字符串的表达式语法为:format_string % string_to_convert 或format_string % (string_to_convert1, str_to_convert2, …)

format_string 为格式标记字符串,其中包括固定的内容和待替换的内容,待替换的内容用格式化符号标明;string_to_convert为要格式化的字符串,如果是两个以上,则需要用小括号括起来。format_string中的可用格式化符号如表1.7所示。表1.7 格式化符号表格式化符号解释%c转为单个字符转为用repr()函数表达的字符串%r%s转为用str()函数表达的字符串%d or %i转为有符号的十进制整数%u转为无符号的十进制整数%o转为无符号的八进制整数%x转为无符号的十六进制整数,十六进制字母用小写表示%X转为无符号的十六进制整数,十六进制字母用大写表示%e转为科学计数法表达的浮点数,其中的e用小写显示%E转为科学计数法表达的浮点数,其中的E用大写显示%f or %F转为浮点数%g由Python根据数字的大小自动判断转换为%e或者%f%G由Python根据数字的大小自动判断转换为%E或者%F%%输出“%”

除了表1.7中的格式化符号,有时需要调整格式化符号的显示方法,比如调整数字的显示精度及是否输出正值符号‘+’等,表1.8列出了这些辅助符号的使用方法。表1.8 辅助格式化符号表辅助格式化符解释号定义宽度或小数点的精度*-左对齐+对正数输出正值符号“+”数字的大小不足m.n的要求时,用空格补位在八进制数前面显示零(0),在十六进制前面显示“0x”或#者“0X”(取决于用的是“x”还是“X”)0数字的大小不满足m.n的要求时,用0补位m是显示的最小总宽度,n是小数点后的位数(如果可用的m.n话)【示例1-8】结合表1.7和表1.8,对格式化字符串的方法举例如下:>>> print "%#x" % 108 #十六进制数字0x6c>>>print '%E' % 1234.567890 #科学计数法1.234568E+03>>>print 'Host: %s\tPort: %d' % ('python', 80) #多个参数Host: python Port: 80>>>print 'MM/DD/YY = %02d/%02d/%d' % (2, 1, 95) #数字前补0MM/DD/YY = 02/01/95

格式化字符串中的固定内容除了字母、数字、标点符号等可显示的字符,还可以包含不可显示字符,比如回车、缩进等。Python中称这种字符为转义字符,表1.9总结了这些转义字符。表1.9 转义字符解释转义字符解释ASCII值\a响铃(BEL)7\b退格(BS),将当前位置移到前一列8\f换页(FF),将当前位置移到下页开头12\n换行(LF),将当前位置移到下一行开头10\r回车(CR),将当前位置移到本行开头13\t水平制表(HT)(跳到下一个TAB位置)9\v垂直制表(VT)11\\代表一个反斜线字符’\'92\’代表一个单引号(撇号)字符39\”代表一个双引号字符34\?代表一个问号63\0空字符(NULL)0【示例1-9】在字符串中这些转义字符串会被解释为相应的意义,如果在字符串前面加了标示“r”,则禁用转义字符解释,示例如下:>>>print "Hi, \nToday is Friday." #转义字符’\n'Hi,Today is Friday.>>>print r"Hi, \ntoday is Friday." #用’r’禁用转义字符Hi, \ntoday is Friday.

3.内置函数

字符串作为最重要的常用类型之一,有一系列特有的内置函数,常用的如下。

● capitalize():将字符串中的第1个字符大写。

● center(width):返回一个长度至少为width的字符串,并使原字符串的内容居中。

● count(str, beg=0, end=len(string)):返回str在string里面出现的次数,可以用开始索引(beg)和结束索引(end)指定搜索的范围。

● decode(encoding='UTF-8', errors='strict'):以encoding指定的编码格式解码string。

● encode(encoding='UTF-8', errors='strict'):以encoding指定的编码格式编码string。

● endswith(obj, beg=0, end=len(string))b, e:检查字符串是否以obj结束,如果是,则返回True,否则返回False;可以用开始索引(beg)和结束索引(end)指定搜索的范围。

● expandtabs(tabsize=8):把字符串string中的Tab符号转为空格,默认的空格数tabsize是8。

● find(str, beg=0, end=len(string)):检测str是否包含在string中;可以用开始索引(beg)和结束索引(end)指定搜索的范围,找到则返回索引值,找不到则返回-1。

● index(str, beg=0, end=len(string)):跟find()类似,但是如果str不在string中,则报一个异常。

● isalnum():如果发现有一个字符并且所有字符都是字母或数字,则返回True,否则返回False。

● isalpha():如果发现有一个字符并且所有字符都是字母,则返回True,否则返回False。

● isdecimal():如果可解释为十进制数字,则返回True,否则返回False。

● isdigit():如果可解释为数字,则返回True,否则返回False。

● islower():如果字符串中的字符都是小写,则返回True,否则返回False。

● isnumeric():如果可解释为字字符,则返回True,否则返回

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载