资源预览内容
第1页 / 共281页
第2页 / 共281页
第3页 / 共281页
第4页 / 共281页
第5页 / 共281页
第6页 / 共281页
第7页 / 共281页
第8页 / 共281页
第9页 / 共281页
第10页 / 共281页
亲,该文档总共281页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第一第一第一第一章章章章 进进进进入入入入python3.5python3.5python3.5python3.5的的的的精彩精彩精彩精彩世界世界世界世界前言前言Python简介介Python安装安装2本节内容本节内容进入进入PythonPython编程世界编程世界-Python的官网网站:的官网网站:http:/www.python.org-Unix衍生系统可能已经安装了衍生系统可能已经安装了Python,在命令行对话框,在命令行对话框中键入中键入“python”即可显示版本信息。即可显示版本信息。-Windows下安装下安装Python和安装其他软件一样,很和安装其他软件一样,很easy!-编码方面:Python3.x默认utf-8。-语法方面有改动,数据类型方面有调整。-面向对象、异常处理和模块等方面也有改动。-本教学使用Python3.5。Python下载与安装下载与安装Python2.xvsPython3.xPython安装安装python官网有几个下官网有几个下载文件,有什么区文件,有什么区别?Python3.6.0a1-2016-05-17DownloadWindowsx86web-basedinstallerDownloadWindowsx86executableinstallerDownloadWindowsx86embeddablezipfileDownloadWindowsx86-64web-basedinstallerDownloadWindowsx86-64executableinstallerDownloadWindowsx86-64embeddablezipfilex86是是32位,位,x86-64是是64位。位。可以通可以通过下面下面3种途径种途径获取取python:web-basedinstaller是需要通是需要通过联网完成安装的网完成安装的executableinstaller是可是可执行文件行文件(*.exe)方式安装方式安装embeddablezipfile嵌入式版本,可以集成到其它嵌入式版本,可以集成到其它应用中用中安装好python后,在开始菜单栏中会自动添加一个名为python3.5的文件夹,点击该文件夹会有如图下图所示的一些子目录。IDLE是Python集成开发环境,也称交互模式。Python3.5是Python的命令控制台,里面只能执行Python命令。第三个是帮助文档,点击后会弹出帮助文档。最后一个是Python的模块文档。本书若无特别指出,示例都是在IDLE中执行的。进入进入PythonPython编程世界编程世界打开交互模式,如下图所示:若看到,则表示是在Python交互式环境下,在Python交互式环境下,只能输入Python代码并立刻执行。在交互式环境下输入print(Hello,world!),按回车,可以看到输出了Hello,world!。如下图,红色箭头指向为输入部分,红色框为输出。此处print后面带了括号,表示print是一个函数,单引号里面的叫字符串。如果要让Python打印出指定的文字,可以用print()函数,然后把希望打印的文字用单引号或者双引号括起来,但不能混用单引号和双引号。我们该怎么去刻意犯呢?我们以前面的“Hello,world!”为示例,如果将print(Hello,world!)修改为print(Hello,world!),去掉后面的单引号,在交互模式下测试一下。输入语句:print(Hello,world!)可以看到屏幕打印结果如下图所示,这里打印意为在屏幕上输出文本,并非通过打印机打印出来:通过这个错误提示,就能很快就知道问题的原因。温故知新,温故知新,学以致用学以致用(1)回顾一下Python的发展历程,起源和应用场景。(2)在本地安装Python最新版本,安装好后卸载,卸载后再安装,尽量关注一下各个步骤的细节。(3)尝试在不同操作系统上安装Python。(4)在“Hellworld!”示例中,尝试将print函数拼写错误,查看输出结果。(5)不要用电脑测试,自己想想print(1+2)的输出结果。WindowsWindowsWindowsWindows下运行下运行下运行下运行PythonPythonPythonPython程序程序程序程序HelloWorld.pyHelloWorld.py# -*- coding: cp936 -*- 支持汉字注释print Hello, world! # 我的第一个Python程序raw_input() # 使cmd框不立刻退出三种运行方式三种运行方式打开源文件,用PythonShell运行。双击源文件,用CMD运行。在PythonShell中直接写程序运行。进入进入PythonPython编程世界编程世界其他的其他的其他的其他的PythonPythonPythonPython集成开发环境集成开发环境集成开发环境集成开发环境1 1)开源)开源PythonWin+Win32Extensionshttp:/starship.python.net/crew/skippy/win32IPython(增强的交互式Python)http:/ipython.scipy.orgIDEStudio(IDLE以及更多)http:/starship.python.net/crew/mike/IdleEclipsehttp:/pydew.sf.enthttp:/eclipse.org2 2)商业)商业WingIDE(WinWare公司)http:/wingware.comKomodo(ActiveState公司)http:/activestate.com/Products/Komodo进入进入PythonPython编程世界编程世界PythonPython学习资源学习资源免免免免 费费费费资资资资 源源源源简明简明简明简明PythonPythonPythonPython教程教程教程教程啄木鸟社区啄木鸟社区啄木鸟社区啄木鸟社区CSDNCSDNCSDNCSDN下载下载下载下载其他其他其他其他http:/www.woodpecker.org.cn:9081/doc/abyteofpython_cn/chinese/index.htmlhttp:/wiki.woodpecker.org.cn/moin/htp:/download.csdn.nethttp:/www.python.orghttp:/corepython.comhttp:/www.diveintopython.org/PythonPython快速入门快速入门输入输出,注释输入输出,注释本本本本 章章章章主主主主 题题题题操作符,赋值,数据类型操作符,赋值,数据类型缩进,循环语句,条件语句缩进,循环语句,条件语句文件操作,错误处理文件操作,错误处理函数,类,模块函数,类,模块printprintprintprint输出,注释输出,注释输出,注释输出,注释 print (“Hello world!“) # Python Shell提示符Hello world! abs(-4) # abs(): 内建函数,取绝对值4 myString = Hello world! # 单引号、双引号成对使用 print myStringHello world! myStringHello world! # 显示结果带引号 _ # 下划线含义:表示最后一个表达式Hello world!PythonPython快速入门快速入门printprintprintprint输出,注释输出,注释输出,注释输出,注释 print (“%s is %d years old.” % (“李书豪”, 26))李书豪 is 26 years old.# %s 字符串;%d 整型;%f 浮点型# Python非常灵活,即使将数字传递给%s,也不会引发严重后果 logFile = open(myLogFile.txt, a) # 打开文件 print logFile, Python让程序员的工作更轻松。# 重定向输出符号 logFile.close() # 关闭文件PythonPython快速入门快速入门raw_input()raw_input()raw_input()raw_input()输入输入输入输入 userName = raw_input(输入登录名:)输入登录名:李书豪 print 你的登录名为, userName 你的登录名为 李书豪 # 自动加空格# raw_input():从用户那里得到数据输入; myNumber = raw_input(输入一个数字:)输入一个数字:1024 print 你输入数字的2倍是:%d % (int(myNumber) * 2)你输入数字的2倍是:2048# int() 字符串转换为整型PythonPython快速入门快速入门操作符操作符操作符操作符标准算术操作符:+ - * / /取整 %取余 *乘方 print -2 * 3 + 2010 / 4 * 2 print (-2 * 3) + (2010 / (4 * 2) # 括号增加可读性标准比较操作符: = = != 3.14 3.14 != 3.14 # 渐渐被淘汰False逻辑操作符:and or not (2 4) and (2 = 4) or (not (3 4 5)False # 3 4 5 等价于 3 4 and 4 pptname = “Introction to Python” pptName = “Python入门” height = 1.71 age = 26 n = height n *= 100 # 等价于 n = n * 100五种基本数字类型:int long bool float complex复数0102 -128 0x80 -0XA9; 12345678902010L -0xABCDEF123456L;True False; 3.1415926 -1.2E-14 10. 32.1e10;6.54+3.21j -1.23+45.6J 0+1j 99-88j -0.142857+0jPythonPython快速入门快速入门数据类型数据类型数据类型数据类型字符串字符串字符串字符串字符串:索引操作符 :切片操作符 +连接运算 *重复运算 strPython = Python strIsCool = is cool! strPython0 # 第一个字符 strPython2:5: thoP strIsCool-1 # 最后一个字符 strIsCool:2: is! strPython + + strIsCool # n:回车Python is cool! - * 30-PythonPython快速入门快速入门数据类型数据类型数据类型数据类型列表、元组、字典列表、元组、字典列表、元组、字典列表、元组、字典列表(list)和元组(tuple):可以看成普通的“数组” numberList = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 mixList = Li Shuhao, 26, 1.71 mixTuple = (Python, is, cool)# 元组可以看成只读的列表,如:mixTuple0 = C+, 出错! print mixTuple0, mixTuple1, mixTuple-1Python is cool字典(dictionary):由键值对(Key-Value)构成 myDict = name:LiShuhao, height:171, age:26 for mKey in myDict: print mKey, myDictmKey # 缩进: Tab,空格PythonPython快速入门快速入门缩进,缩进,缩进,缩进,whilewhilewhilewhile循环语句,循环语句,循环语句,循环语句,ifififif条件语句条件语句条件语句条件语句缩进:简洁、可读性好循环语句:whilewhile expression: # expression 条件表达式 while_suite # 根据条件循环执行的语句条件语句:if elif elseif expression1if expression1: # 蓝色部分蓝色部分可以单独用 if_suiteif_suiteelif expression2: elif expression2: # 绿色部分绿色部分可以省略,也可以重复多个 elif_suite elif_suiteelse expression3: # 用elif,最后必须有else else_suite # Python没有switch-casePythonPython快速入门快速入门forforforfor循环语句循环语句循环语句循环语句循环语句:for range()内建函数Python中的for循环与传统的for循环不太一样,不是计数循环,更像迭代循环,如:for nItem in 123, email, homework: print nItemfor nItem in range(5): # range(5)等价于1, 2, 3, 4, 5 print nItem, # print不自动换行方法:加逗号for nChar in myString: # myString = abc print nCharfor i in range(len(myString): # len() 字符串长度 print (%d) % (i), myStringi # 输出:(0) a PythonPython快速入门快速入门forforforfor循环语句循环语句循环语句循环语句循环语句:for enumerate()内建函数# enumerate()突破约束:索引、元素双循环for i, nChar in enumerate(myString): print (%d) % (i), myStringi列表解析:for语句squared = item * 2 for item in range(5)# 0 1 4 9 16 complexTuple = (item * 2 for item in range(10) if item % 2)# 1 9 25 49 81 PythonPython快速入门快速入门文件操作文件操作文件操作文件操作文件操作:open() file() readlines() close()handle = open(file_name, access_mode = r) # 默认 r# r:读取;w:写入;a:添加;+:读写;b:二进制访问。filename = raw_input(请输入文件名:)hFile = file(filename, r)for nLine in hFile: print nLine,hFile.close() # close()是文件对象hfile的一个属性# 属性可以是数据值,也可以是函数和方法,类、模块、文件和复数等都有属性。# 本示例适用于较小的文件,否则占用内存太大。PythonPython快速入门快速入门错误处理错误处理错误处理错误处理错误和异常:try - except# Python编译时会检查语法错误,运行时检测其他错误。# 当遇到错误,Python解释器就引发异常,并显示详细信息。try: # 你打算管理的代码段 except IOError, e: print 出错原因, e# 程序员也可以用raise有意引发一个异常PythonPython快速入门快速入门函数函数函数函数函数:def function_name(arguments): # 参数可为空,可有默认值 “optional documentation string” # 可选的函数说明语句 function_suite # 函数代码段 return fun_obj # 可以没有,自动返回None对象def addMeToMe(me): # 函数示例:神奇的 + 操作 return (me + me) # 小括号不能省略print addMeToMe(3.14) # 6.28print addMeToMe(100) # 200print addMeToMe(Python) # PythonPythonprint addMeToMe(-1, abc) # -1, abc, -1, abcPythonPython快速入门快速入门类,模块类,模块类,模块类,模块类:相关数据及逻辑的容器,构建创建真实对象的蓝图。class className(baseClasses): “optional documentation string” # 说明性文字(可选) static_member_declarations # 静态成员定义 method_declarations # 方法定义模块:一种组织形式,将有联系的代码组织到独立文件中# 模块可以包含可执行代码、函数和类。import sys # 导入方法,sys为模块名称sys.stdout.write(Hello world!)sys.platform # win32sys.version # 2.6.5 (r265:79096,PythonPython快速入门快速入门第二章第二章开启开启Python之旅之旅本章主要介绍一些Python的基本知识和一些基本概念的介绍,为后续章节学习相关内容做铺垫。2.1“旅行旅行”第一步第一步认识程序程序旅行前,我们要先熟悉地名,知道要去哪里,将会经过哪里。学习编程也一样,在学习之前要先了解程序、调试、语法错误、运行错误、语义错误等。2.1.1程序程序程序是用程序是用语言写成的。言写成的。语言分高言分高级语言和低言和低级语言。言。高高级语言翻言翻译成机器代成机器代码有两种方法:解有两种方法:解释和和编译。编译型语言则是将源代码完整的编译成目标代码后才能执行。以后在执行时就不需要编译了。下图显示了一个编译器的结构。这个有点类似我们乘坐的直达车,所有要乘车的人从起点上车,中途不搭载其他乘客。2.2数数据据类型型Python3中有六个标准的数据类型:Number(数字)、(数字)、String(字符串)、(字符串)、List(列表)、(列表)、Tuple(元(元组)、)、Sets(集合)、(集合)、Dictionary(字典)。(字典)。本节将讲解Number(数字)数据类型,其它五种数据类型由后续相关章节进行介绍。Python3支持三种不同的数值类型:整型(整型(int)、浮点型()、浮点型(float)、复数)、复数(complex)。)。2.2.1整型整型整型(int),通常被称为是整型或整数,是正或负整数,不带小数点。例如交互模式下输入如下:5151这里使用的就是整型。整型加法如下:25+2550整型减法:51-501整型乘法:51*2102整型除法:153/513.0155/513.0392156862745097此处出现除不尽的情况了。在整数除法中,除法(/)计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数,如果只想得到整数的结果,丢弃可能的分数部分,可以使用地板除(/),整数的地板除(地板除(/)永)永远是整数是整数,即使除不尽。改成如下写法:153/513155/513地板除(/)只取结果的整数部分,Python还提供一个余数运算,可以得到两个整数相除的余数。如下:153%510155%5122.2.2浮点浮点型型浮点型(float),浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示。先看示例:3.3*102336.59999999999997按预计应该一位小数,但输出结果却有这么多位小数。是因为整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差。如下输入:3.3*102+15.5352.09999999999997浮点除法:153/51.03.0155/51.03.0392156862745097浮点地板除:155/51.03.0155%51.02.02.2.3复数复数复数(complex),复数由实数部分和虚数部分构成,可以用a+bj,或者complex(a,b)表示,复数的实部a和虚部b都是浮点型。Python支持复数,Python的复数我们当前阶段使用或接触的比较少,此处就不做具体的讲解,读者有一个概念即可,有兴趣可以自行查阅相关资料。2.2.4数据数据类型型转换有时候,我们需要对数据内置的类型进行转换,数据数据类型的型的转换,你只需要将数据数据类型作型作为函函数名即可数名即可。关于数据的类型转换,有如下几个函数可以使用:int(x)将x转换为一个整数。float(x)将x转换到一个浮点数。complex(x)将x转换到一个复数,实数部分为x,虚数部分为0。complex(x,y)将x和y转换到一个复数,实数部分为x,虚数部分为y。x和y是数字表达式。int(x)示例:int(352.1)352float(x)示例:float(352.1)352.1float(int(352.1)352.0这里先把352.1取整得到整数352,再用float将352转换成浮点数352.0,这样就得到我们需要的结果。2.2.5常量常量所谓常量就是不能变的变量,比如常用的数学常数就是一个常量。在Python中,通常用全部大写的变量名表示常量。Python中有两个比较常见的常量,分别为:PI和E。PI:数学常量pi(圆周率,一般以来表示)。E:数学常量e,e即自然常数(自然常数)。这两个常量将会在后续章节中被使用,具体的用法在使用中进行体现。2.3变量和量和关关键字字编程语言最强大的功能之一是操纵变量的能力。变量(variable)是一个需要熟知的概念。如果你觉得数学是让你抓狂的话,别担心,Python中的变量很好理解。变量基本上就是代表某值的名字。2.3.1变量量在Python中,变量的使用环境非常宽松。没有在Python中,等号(=)是赋值语句,可以把任意数据类型赋值给变量。如下为定义一个名为xiaohong的变量:xiaohong=XiaoHong此操作解释:xiaohong是我们创建的变量,=是赋值语句,XiaoHong是变量值,需要用引号标记。整句话的意思为:创建变量xiaohong并赋值为XiaoHong。(注意:字符串必须以引号标记开始,并以引号标记结束。)打印变量结果:print(xiaohong)XiaoHong在使用变量前,需要对其赋值,没有值的变量是没有意义的,编译器也不会编译通过。例如我定义一个变量为abc,不赋任何值,输入及结果如下:abcTraceback(mostrecentcalllast):File,line1,inabcNameError:nameabcisnotdefined同一个变量可以反复赋值,而且可以是不同类型的变量,输入如下:a=123123a=ABCprint(a)ABC这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。和静态语言相比,动态语言更灵活,就是这个原因。当不能确定变量或数据的类型时,可以借助解释器内置的函数type进行确认。在交互模式下可以如下输入:type(Hello,world!)type(100)type(3.0)a=testtypetype(a)请不要把赋值语句的等号等同于数学的等号。比如下面的代码:a=100a=a+200在编程语言中,赋值语句先计算右侧的表达式a+200,得到结果300,再赋给变量a。由于a之前的值是100,重新赋值后,a的值变成300。我们通过交互模式验证,输入如下:a=100a=a+200print(a)300理解变量在计算机内存中的表示也非常重要。当我们写:a=ABC时,Python解释器干了两件事情:(1)在内存中创建了一个ABC的字符串;(2)在内存中创建了一个名为a的变量,并把它指向ABC。也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:a=ABCb=aa=XYZprint(b)最后一行打印出变量b的内容到底是ABC呢还是XYZ?如果从数学意义上理解,就会错误地得出b和a相同,也应该是XYZ,但实际上b的值是ABC,让我们一行一行地执行代码,就可以看到到底发生了什么事。执行a=ABC,解释器创建了字符串ABC和变量a,并把a指向ABC,如下图所示:执行b=a,解释器创建了变量b,并把b指向a指向的字符串ABC,如图2-4所示:执行a=XYZ,解释器创建了字符串XYZ,并把a的指向改为XYZ,但b并没有更改,如图2-5所示:所以,最后打印变量b的结果自然是ABC了。2.3.2变量量名称名称变量名可以是由数字或字符由数字或字符组成的任意成的任意长度的度的字符串,但必字符串,但必须以字母开以字母开头。使用大写字母是合法的,但变量名使用小写字母开头是个好主意。python是区分大小写的是区分大小写的。举个例子来说,Name和name是两个不同的变量名。交互模式中输入如下:name=studypythonishappyName=Iaggreewithyouprint(name)studypythonishappyprint(Name)Iaggreewithyou下划线“_”可以出现在变量名中。它经常用于连接多个词组。比如happy_study,do_it_with_more_practice。交互模式输入如下:happy_study=stayhungrystayfoolishprint(happy_study)stayhungrystayfoolish如果给变量取非法的名称,解释器显示语法错误。请看下面的示例:2wrongtest=justfortestSyntaxError:invalidsyntax该示例提示语法错误,错误信息为无效的语法,原因是它不是以字母开头。xiaomingme=surprisedSyntaxError:cantassigntooperator该示例提示语法错误,错误信息为不能做指定操作,原因为它包含了一个非法字符。from=fromSyntaxError:invalidsyntaxfrom是Python的一个关键字。解释器通过关键字来识别程序的结构,并且它们不能用来作为变量名称。Python3中共有33个关键字:FalseNoneTrueandasassertbreakclasscontinuedefdelelifelseexceptfinallyforfromglobalifimportinnonlocallambdaisnotorpassraisereturntrywhilewithyield2.4语句句语句是Python解释器可以运行的一个代码单元,也可以理解为可以执行的命令。我们目前已经使用过了两种语句:print打印语句和赋值语句。赋值语句有两个作用:一是建立新的变量,二是将值赋予变量。任何变量在使用时,都必须赋值。否则,被视为不存在的变量。advice=boss,wewanthavealunchtype(advice)这个语句中的advice的类型是字符串(str)类型的。一般的情况下,我们用状态图表示变量的状态。左边是变量的名称,右边是变量值,中间的箭头指向值。状态图显示了赋值语句的最终操作结果。advice=boss,wewanthavealunchmoney=99999999spend=1.11111111如上面几条语句对应的状态图如下图所示:2.5表表达达式式表达式是值、变量和操作符的组合。单独一个值也被看作一个表达式。单独的变量也可以看作一个表达式。表达式和语句一般不容易区分,很多人会将两者混在一起。那么语句和表达式之间有什么区别?表达式是某事,而语句是做某事,说的通俗点就是告诉计算机做什么。比如3*3是9,而print(3*3)打印出来是9。那么区别在哪里?比如我们在交互模式下输入如下:3*39print(3*3)9在交互模式下,其结果都是一样的。但这只是因为解释器总是把所有表达式的值打印出来而已(其内部都使用了相同的函数对结果进行呈现,后面会有细致的介绍)。一般情况下,Python不会这么做,毕竟3*3这样的表达式并不能做什么有趣的事情,而编写print(3*3)会有一个显示的。语句和表达式之间的区别在赋值时会表现的更加明显一些。因为语句不是表达式,所以没有值可供交互式解释器打印出来。比如在交互模式下输入如下:a=10010*10100打印出9的结果。赋值语句输入完成后,下面立刻出现了新的提示输入符。而表达式输入完成后,下面立刻得到了结果。不过对于赋值语句,有些东西已经变了,变量a现在绑定了一个值100。这个是语句特性的一般定义:它它们改改变了了事物事物。比如,赋值语句改变了变量,print语句改变了屏幕显示的内容。赋值语句可能是任何计算机程序设计语言中最重要的语句类型,尽管现在还难以说清它们的重要性。2.6运算符和操作运算符和操作对象象运算符和操作对象是计算机中比较常见的,任何的计算,都涉及到运算符和操作对象。本节将介绍Python中的运算符和操作对象。2.6.1什么是运算符和操作什么是运算符和操作对象象运算符我知道,我们前面学习的加(+)、减(-)、乘(*)、除(/)、地板除(/)、取余(%)等都是运算符,是一些特殊符号的集合。操作对象就是由运算符连接起来的对象。Python支持以下8种运算符:(1)算术运算符。(2)比较(关系)运算符。(3)赋值运算符。(4)逻辑运算符。(5)位运算符。(6)成员运算符。(7)身份运算符。(8)运算符优先级。2.6.2算算术运算符运算符以下变量a为10,变量b为5:运运 算算符符描述描述实例例+加:两个对象相加a+b输出结果15-减:得到负数或是一个数减去另一个数a-b输出结果5*乘:两个数相乘或是返回一个被重复若干次的字符串a*b输出结果50/除:x除以ya/b输出结果2%取模:返回除法的余数b%a输出结果0*幂:返回x的y次幂a*b为10的5次方,输出结果100000/取整除(地板除):返回商的整数部分9/2输出结果4,9.0/2.0输出结果4.0交互模式下输入:2*32/1024/1024/10244.02*64/1024/1024/102417179869184.02*32是2的32次方,这个就是32位操作系统最大支持的内存的字节数,除以第一个1024是转换为KB,1KB=1024B,除以第二个1024是转换为MB,1MB=1024KB,除以第三个1024是转换为GB,1GB=1024MB。这个结果也就意味着32位的操作系统最大只能支持4GB的内存。现在大家都趋向于选择64位的了,64位的系统能支持多大内存,自己可以算一下。2.6.3比比较运算符运算符以下变量a为10,变量b为20:运算符运算符描述描述实例例=等于:比较对象是否相等(a=b)返回False。!=不等于:比较两个对象是否不相等(a!=b)返回True.大于:返回x是否大于y(ab)返回False。小于:返回x是否小于y。(a=大于等于:返回x是否大于等于y。(a=b)返回False。=小于等于:返回x是否小于等于y。(a=b)返回True。在一些地方,会看到用1代表True,0代表False,这种是正确也是合理的表示方式,这个大家更多会理解为开和关的意思,就像我们物理中所学习的电流的打开和关闭一样。后面会有更多的地方用到用1和0代表True、False的示例。另外,在Python2中,有时可能会看到这个符号,其和!=一样,也表示不等于,在Python3中已去除,若以后有看到运算符,那应当使用的是Python2。2.6.4赋值运算符运算符以下变量a为10,变量b为20:运算符运算符描述描述实例例=简单的赋值运算符c=a+b将a+b的运算结果赋值为c+=加法加法赋值运算符运算符c+=a等效于等效于c=c+a运算符运算符描述描述实例例-=减法赋值运算符c-=a等效于c=ca*=乘法赋值运算符c*=a等效于c=c*a/=除法赋值运算符c/=a等效于c=c/a%=取模赋值运算符c%=a等效于c=c%a*=幂赋值运算符c*=a等效于c=c*a/=取取整(地板)除整(地板)除赋值运算运算符符c/=a等效于等效于c=c/a2.6.5位运算符位运算符按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下。以下变量a为60,变量b为13:运运 算算符符描述描述实例例&按位与运算符(a&b)输出结果12,二进制解释:00001100|按位或运算符(a|b)输出结果61,二进制解释:00111101按位异或运算符: (ab)输出结果49,二进制解释:00110001按位取反运算符: (a)输出结果-61,二进制解释:11000011,在一个有符号二进制数的补码形式。左移动运算符:“右边的数指定移动的位数,高位丢弃,低位补0。a右移右移动运算符运算符: a2输出出结果果15,二,二进制制解解释:000011112.6.6逻辑运算运算符符Python语言支持逻辑运算符,以下变量a为10,变量b为20:运运 算算符符逻 辑 表表达式达式描述描述实例例Andxandy布尔与-如果x为False,xandy返回False,否则它返回y的计算值。(aandb)返回20。Orxory布尔“或”-如果x是非0,它返回x的值,否则它返回y的计算值。(aorb)返回10。Notnotx布尔“非”-如果x为True,返回False。如果x为False,它返回True。not(aandb)返回Falsea=10b=3list=1,2,3,4print(ainlist)print(binlist)www.themegallery.com2.6.7成成员运算符运算符Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。运运 算算符符描述描述实例例in如果在指定的序列中找到值返回True,否则返回False。x在y序列中,如果x在y序列中返回True。notin如果在指定的序列中没有找到值返回True,否则返回False。x不在y序列中,如果x不在y序列中返回True。a=10b=3print(aisb)print(aisnotb)2.6.8身份运算符身份运算符身份运算符用于比较两个对象的存储单元运运算算符符描述描述实例例isis判断两个标识符是不是引用自一个对象xisy,如果id(x)等于id(y),is返回结果1isnotisnot用于判断两个用于判断两个标识符是不符是不是引用自是引用自不同不同对象象xisnoty,如果如果id(x)不等于不等于id(y).isnot返回返回结果果12.6.9运算符运算符优先先级以下表格列出了从最高到最低优先级的所有运算符:运算符运算符描述描述*指数(最高优先级)+-按位翻转,一元加号和减号(最后两个的方法名为+和-)*/%/乘,除,取模和取整除+-加法减法右移,左移运算符&位AND|位运算符=比较运算符=!=等于运算符=%=/=/=-=+=*=*=赋值运算符isisnot身份运算符innotin成员运算符notorand逻辑运算运算符符2.7字符串操作字符串操作字符串是Python中最常用的数据类型。我们可以使用引号(或)来创建字符串。字符串可以使用操作符+,但其功能和数学中的不一样,它会进行拼接(concatenation)操作,即将前后两个字符首尾连接起来。如:string1=hellostring2=worldprint(string1+string2)helloworld如果想让字符串之间有空格,可以建一个空字符变量,插在相应的字符串之间让它们隔开,或是在字符串中加入相应的空格。交互模式下输入如下:string1=hellostring2=worldspace=print(string1+space+string2)helloworld或者string1=hellostring2=worldprint(string1+string2)helloworld计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。在最新的Python3版本中,字符串是以UTF-8编码的,也就是说,Python3的字符串支持多语言。Python2中默认的编码格式是ASCII格式,在没修改编码格式时无法正确打印汉字,在读取中文时会报错。Python2使用中文的语法是在字符串前面加上前缀u。2.8注注释当程序变的更大更复杂时,读起来也更困难。程序的各部分之间紧密衔接,想依靠部分的代码来了解整个程序要做的,是困难的。在现实中,经常会遇到一段代码,很难弄清楚它在做什么、为什么那么做。因此,在程序中加入自然语言的笔记来解释程序在做什么,是个不错的主意。这种笔记称为注释(comments),注释必须以符号“#”开始。注释可以单独占一行,也可以放在语句行的末尾。交互模式下输入如下:#打印1+1的结果print(1+1)2print(1+1)#打印1+1的结果2比如如下的代码中注释与代码重复,毫无用处:r=10#将10赋值给r而下面这段代码注释则包含了代码中隐藏的信息,如果不加注释,很难让人看懂这个是什么意思(虽然在实际中可能可以根据上下文判定,但需要浪费不必要的思考时间)。r=10#半径,单位是米选择好的变量名,可以减少注释的需要,但长名字也会让复杂表达式更难阅读,所以这两者之间需要衡量舍取。2.9调试错误是好的,错误能帮助我们长进。(1)还记得数字类型转换吗,若用int()转换一个字符,会得到怎样的结果,尝试一下,交互模式下输入如下:int(hello)Traceback(mostrecentcalllast):File,line1,inint(hello)ValueError:invalidliteralforint()withbase10:hello这个是什么意思呢,开动你的大脑,思考一下。(2)在变量和关键字中,若变量被命名为关键字会怎样,输入如下:你好SyntaxError:invalidsyntax(3)在算术运算符中,若被除数为0,结果会怎样,输入如下:9/0Traceback(mostrecentcalllast):File,line1,in9/0ZeroDivisionError:divisionbyzero跟我们学习过的数学中的一样,被除数不能为0。2.10问题解答解答(1)关键字那么多,我都记住吗?这个可以不用去刻意记忆,随着你逐步的学习,会碰到一些常用关键字,碰多了自然就熟悉了。对于一些不常用的,碰到了再回头看是否是属于关键字。总之,关键字可以在学习和使用中慢慢记忆。(2)这么多运算符,都需要熟练使用吗?能熟练使用当然最好了,若不能都熟练使用,也要有所了解,知道怎么使用,在实际解决问题时能知道应该使用什么运算符,该怎么用。当然,也可以碰到具体问题时再详细研究,这也是一个不错的办法。(3)字符串的操作就只有这么一些吗?字符串还有很多的操作,这里只是一些简单的入门操作,具体在后面的章节会有详细介绍。2.11温故知新,学以致用温故知新,学以致用1.回顾数据类型相关概念,整型、浮点型、数据类型转换。2.回顾变量和关键字相关概念,并尝试记住这些关键字。3.回顾运算符和操作对象,并通过不断调试熟悉各种运算符。4.回顾字符串的操作及注释,了解编码方式,尝试写注释。5.小萌和小智约定,明天小智送一颗糖给小萌,并从后天起,小智每天送比前一天多一倍的糖给小萌,到第16天(包含这天),小萌一共可以收到多少颗糖?6.小萌,运算符都学完了,我来考考你,看看你学的怎样,用4个2以及各种运算符,你能得到最大的数是多少?7.结合本章所学,并查阅相关资料,看看下面的代码的输出结果是怎样的,并尝试解释其结果。habit=Python是一门很有用的编程语言n我想学好它print(habit)#你认为的结果是len(habit)#你认为的结果是练习题1.#输入a,b,c,d4个整数,计算a+b-c*d的结果2.#计算一个12.5m*16.7m的矩形房间的面积和周长3.#怎么得到9/2的小数结果4.#python计算中7*7*7*7.可以有多少种写法1.#输入a,b,c,d4个整数,计算a+b-c*d的结果a=input(pleaseinputanimber:)b=input(pleaseinputanumber:)c=input(pleaseinputanumber:)d=input(pleaseinputanumber:)print(a+b-c*d)?注意类型转换int()输出出结果:果:pleaseinputanimber:3pleaseinputanumber:3pleaseinputanumber:3pleaseinputanumber:3-32.#计算一个12.5m*16.7m的矩形房间的面积和周长a=12.5b=16.7s=a*bc=a+a+b+bprint面积是%f,周长是%f%(s,c)输出出结果是果是面积是208.750000,周长是58.4000003.#怎么得到9/2的小数结果float(9/2)4.0第一种:7*7*7*72401第二种:pow(7,4)2401第三种:7*424401第四种:eval(%s*%s*%s*%s%(7,7,7,7)2401eval参数是一个字符串,可以把这个字符串当成表达式来求值,第三第三章章列表列表和元和元组本章将引入一个新的概念:数据结构。数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些元素可以是数字或者字符。在Python中,最基本的数据结构是序列(sequence)。Python包含6种内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和xrange对象。本章重点讨论最常用的两种:列表和元组。3.1通用序列操作通用序列操作在讲解列表和元组之前,本节先介绍Python中序列的通用操作,这些操作在列表和元组中都会用到。Python中所有序列都可以进行某些特定的操作,这些操作包括:索引(indexing)、分片(sliceing)、序列相加(adding)、乘法(multiplying)、成员资格、长度、最小值和最大值。本节首先讲解对所有序列(包括元组和列表)都通用的操作。3.1.1索引索引序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字,代表它在序列中的位置,或索引,第一个索引是0,第二个索引是1,依此类推。序列中所有的元素都是有编号的从0开始递增。可以通过编号分别对序列的元素进行访问。通过编号来取元素:greeting=Hello#定义变量greeting,并赋值Hellogreeting0#根据编号取元素,使用格式为在中括号中输入所取元素编号值Hgreeting1egreeting2l序列中的元素是从0开始从左向右依自然开始从左向右依自然顺序序编号号的,对元素的访问可以通过编号访问。获取元素的方式为变量后面跟上中括号,中括号中输入所取元素的编号值,这个格式需要记住。这里的所指的里的所指的编号就是索引,可以通号就是索引,可以通过索引索引获取元素取元素。所有序列都可以通过这种方式进行索引。交互模式下输入如下:greeting-1ogreeting-2lgreeting-3lgreeting-4ePython的序列也可以从右可以从右边开始索引,最右开始索引,最右边的的一个元素的索引一个元素的索引为-1,向左开始,向左开始递减减。在Python中,从左向右索引称为正数索引,从右向左称为负数索引。使用负数索引时,Python会从最后1个元素开始计数。最后一个元素的位置编号是-1。最后一个元素的编号不是-0,这个跟数学中的概念一样的,-0=0,-0和0都是指向第一个元素。3.1.2分片分片索引用来对单个元素进行访问,使用分片可以对一定范围内的元素进行访问,分片通分片通过冒号冒号相隔的两个索引来相隔的两个索引来实现。在交互模式输入如下:number=1,2,3,4,5,6,7,8,9,10number1:3#取索引为第一和第二的元素2,3number-3:-1#负数表明是从右开始计数,取得倒数第三和倒数第二的元素8,9分片操作既支持正数索引,也支持负数索引,并且分片操作对于提取序列的一部分是很方便的。分片操作的实现需要提供两个索引作为边界,第一个索引的元第一个索引的元素是包含在分片内的,第二个则不包含在分片内。number=1,2,3,4,5,6,7,8,9,10number-3,-18,9试试使用索引0作为最后一个元素的下一个元素,输入如下:number-3:0-3代表的是倒数第三个元素,0则代表的是代表的是第一个元素,第一个元素,倒数第3个比第一个晚出现,既比第一个排在更后面,所以得到的结果是空序列。number0:#从第一个元素开始输出,输出全部结果1,2,3,4,5,6,7,8,9,10number:0#最后一个元素为第一个,输出为空number:3#取得前3个元素1,2,3若需要需要输出整个序列,可以将两个索引都出整个序列,可以将两个索引都设置置为空空。输入如下:number:#取得整个数组1,2,3,4,5,6,7,8,9,10进行分片的时候,分片的开始和结束点都需要指定(不管是直接还是间接),用这种方式取连续的元素是没有问题的,但是若要取序列中若要取序列中不不连续的元素的元素就会比较麻烦了或是不能操作。比如要取序列number中的所有奇数,以一个序列展示出来,用前面的方法就不能实现了。对于这种情况,Python为我们提供了另外一个参数步长(steplength),该参数通常是隐式设置的。在普通的分片中,步长是1分片操作就是按照这个步长逐个遍历序列的元素,遍历后返回开始和结束点之间的所有元素,也可以理解为默认步长是1,既没有设置步长时,步长隐式设置值为1。输入如下:number0:10:11,2,3,4,5,6,7,8,9,10分片包含了另外一个数字。这种方式就是步长的显式设置。这个看起来和隐式设置步长没有什么区别,得到结果和之前也是一样的。但是若将步长设置为比1大的数,那结果会怎样呢?输入如下:number0:10:21,3,5,7,9由上面输出结果我们看到,对于number序列,设置步长为2时,得到的结果就是我们前面想要的奇数序列。步长设置为大于1的数,那会得到一个跳过某些元素的序列。例如我们上面设置的步长为2,得到的序列是从开始到结束每隔1个的元素序列。比如还可以如下进行使用:number0:10:31,4,7,10number2:6:33,6number2:5:33number1:5:32,5对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而而对于于负数步数步长,则是从是从序列的尾部开始向左提取元素,直到第一个元素。正数序列的尾部开始向左提取元素,直到第一个元素。正数步步长,必,必须让开始点小于开始点小于结束点;而束点;而负数步数步长,则必必须让开始点大于开始点大于结束点。束点。3.1.3序列序列相加相加通过使用加号可以进行序列的连接操作,输入如下:1,2,3+4,5,61,2,3,4,5,6a=1,2b=5,6a+b1,2,5,6s=hello,w=worlds+whello,world数字序列数字序列可以和数字序列通过加号连接,连接后的接后的结果果还是数字序列,字符串序列是数字序列,字符串序列也可以通也可以通过加号加号连接,接,连接后的接后的结果果还是是字符串序列。字符串序列。那数字序列是否可以和字符序列相加呢?结果是怎样的,是数字序列还是字符串序列?输入如下:1,2+helloTraceback(mostrecentcalllast):File,line1,in1,2+helloTypeError:canonlyconcatenatelist(notstr)tolisttype(1,2)#取得1,2的类型为listtype(hello)#取得hello的类型为字符串数字序列和字符串序列是不能通过加号连接的。只有类型相同的序列才能通型相同的序列才能通过加号加号进行序列行序列连接接操作操作,不同类型的序列不能通过加号进行序列连接操作。3.1.4乘法乘法此处看到标题后不要误认为是数学中定义的乘法。用一个数字数字x乘以一个序列会生成新的序列乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复x次,这个就是序列中的乘法。交互模式下输入如下:hello*5hellohellohellohellohello7*107,7,7,7,7,7,7,7,7,7序列被重复了对应的次数,而不是在数学中所理解的乘法。Python中序列的乘法有什么特殊之处呢?如果要创建一个重复的序列,我们就可以像上面的示例一样乘以一个想要得到的序列长度的数字,就可以快速得到需要的列表,这样非常方便的。空列表可以简单地通过两个中括号来表示()表示里面什么东西都没有。如果要初始化一个长度为x的序列,需要使每个编码位置上都是空值,此时需要一个值来代表空值,即里面没有任何元素,我们需要使用None。None是Python的内建值,它的确切含义是“这里什么也没有”。例如我们输入如下:sq=None*5#初始化sq为含有5个None的序列sqNone,None,None,None,None序列的乘法在做一些重复操作、空列表和None初始化上的操作还是挺方便的。3.1.5成成员资格格in运算符用于检验某个条件是否为真,检查一个值是否在序列中,并返回检验结果,检验结果为真返回True,结果为假则返回False。下面我们尝试in的用法,交互模式输入如下:greeting=hello,worldwingreeting#检测w是否在字符串中TrueaingreetingFalse使用in可以很好的检测出对于的字符或数字是否在对应的列表中。3.1.6长度、最小度、最小值和最大和最大值Python为我们提供了长度、最大值和最小值的内建函数,对应的内建函数分别为len、max和min。交互模式输入如下:numbers=300,200,100,800,500len(numbers)5max(numbers)800min(numbers)100max(5,3,10,7)10min(7,0,3,-1)-1len函数返回序列中所包含的元素的数量,max函数和min函数则分别返回序列中最大和最小的元素。max和min函数的参数不是一个序列,而是以多个数字直接作为参数。3.2列列表表在前面的例子中已经用了很多次列表,通过前面的示例我们看到列表的功用是比较强大的。本节将讨论列表不同于元组和字符串的地方:列表是可变的(mutable),即列表的内容是可改变的。列表有很多比较好用、比较独特的方法。3.2.1更新列表更新列表我们在3.1节中所讲述的所有关于序列的操作,如索引、分片、相加、乘法等都适用于列表。本节将介绍一些序列中没有而列表中有的方法,这些方法的作用都是更新列表的,这些方法为:元素赋值、元素删除、分片赋值和列表方法。1.元素赋值通过编号来标记某个特定位置的元素,并对该位置元素重新赋值,如a1=10。交互模式输入如下:a=1,2,3,2,1a1=10a1,10,3,2,1a3=10a1,10,3,10,1可以可以对一个列表中的元素一个列表中的元素赋不同不同类型的型的值。输入如下:a2=hello#对编号为2的元素赋值为一个字符串a1,10,hello,10,1type(a1)#别忘了查看类型的函数的使用type(a2)需谨慎不能为一个不存在元素的位置赋值。2.增加元素由元素赋值的示例中看到,不能为一个不存在的位置赋值,这么说就是一旦初始化了一个列表,就不能再往这个列表中增加元素了,这样若需要往列表中增加元素,就非常麻烦了,需要对整个列表中的元素都复制一遍,再添加需要增加的元素,Python中有提供对应的方法来帮助我们做这件事情呢。看如下输入:tring=1,2,3tring.append(4)tring1,2,3,4可以使用append()方法来解决。append()方法是一个用于在列表末尾添加新的对象的方法。该方法的语法如下:list.append(obj)此语法中list代表的是列表,obj代表的是需要添加到list列表末尾的对象。3.删除元素上面学习了往列表中增加元素,那么是否可以往列表中删除元素呢?看如下示例:tring=a,b,c,d,elen(tring)5deltring1print(删除第二个元素:,tring)删除第二个元素:a,c,d,elen(tring)4可以使用del删除列表中的元素。4.分片赋值分片赋值是列表的一个强大的特性。先看如下示例:list(女排夺冠了)女,排,夺,冠,了boil=list(女排夺冠了)boil女,排,夺,冠,了show=list(hi,boy)showh,i,b,o,yshow3:=list(man)showh,i,m,a,n可以通过分片赋值直接对列表做变更。3.2.2嵌套列表嵌套列表前面介绍的都是单层的列表,列表是否可以嵌套列表呢?我们做如下尝试:field=a,b,cfielda,b,cnum=1,2,3num1,2,3mix=field,nummixa,b,c,1,2,3mix0a,b,cmix11,2,3在列表中可以嵌套列表,在列表中嵌套的列表取出后还是列表。3.2.3列表方法列表方法方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其它类型的对象。方法的调用方式我们前面有一个示例,调用语法如下:对象.方法(参数)由上面的语法及前面append()方法的示例我们可知:方法的定义方式是将对象放到方法名之前,两者之间用一个点号隔开,方法后面的括号中可以根据需要带上参数。除语法上的一些不同,方法调用和函数调用很类似。列表中有count、index、sort等一些比较常用的方法,下面逐一进行介绍。1.append该方法前面已经介绍,其功能是在列表的末尾添加新的对象。使用方式为如前面讲解的:list.append(obj)2.countcount()方法用于统计某个元素在列表中出某个元素在列表中出现的次数的次数。count()方法的语法如下:list.count(obj)此语法中list代表的是列表,obj代表列表中统计的对象。该方法使用示例如下:field=list(hello,world)fieldh,e,l,l,o,w,o,r,l,dprint(列表field中,字母o的个数:,field.count(o)#统计列表中字符个数列表field中,字母o的个数:2print(列表field中,字母l的个数:,field.count(l)列表field中,字母l的个数:33.extendextend()方法用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。extend()方法的语法如下:list.extend(seq)此语法中list代表的是列表,seq代表元素列表。该方法使用示例如下:a=hello,worldb=python,is,funnya.extend(b)ahello,world,python,is,funnyappend()、extend()、+、+=1.append()向列表尾部追加一个新元素追加一个新元素,列表只占一个列表只占一个索引位索引位,在原有列表上增加。2.extend()向列表尾部追加一个列表,将列表中的每个元列表中的每个元素都追加素都追加进来来,在原有列表上增加。3.+直接用+号看上去与用extend()一样的效果,但是实际上是生成了一个新的列表存这两个列表的和,只能用在两个列表相加上。4.+=效果与extend()一样,向原列表追加一个新元素,在原有列表上增加。4.indexindex()方法用于从列表中找出某个值第一个匹配项的索引位置。index()方法的语法如下:list.index(obj)此语法中list代表的是列表,obj代表查找的对象。field=hello,world,python,is,funnyprint(hello的索引位置为:,field.index(hello)hello的索引位置为:0print(python的索引位置为:,field.index(python)python的索引位置为:25.insertinsert()方法用于从列表中找出某个值第一个匹配项的索引位置。insert()方法的语法:list.insert(index,obj)此语法中list代表的是列表,index代表对象obj需要插入的索引位置,obj代表要插入列表中的对象。该方法使用示例如下:num=1,2,3print(插入之前的num:,num)插入之前的num:1,2,3num.insert(2,插入位置在2之后,3之前)print(插入之后的num:,num)插入之后的num:1,2,插入位置在2之后,3之前,36.poppop()方法用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。pop()方法的语法:list.pop(obj=list-1)field=hello,world,python,is,funnyfield.pop()#不传参数,默认移除最后一个元素funnyprint(移除元素后的field:,field)移除元素后的field:hello,world,python,isfield.pop(3)#移除编号为3的元素is7.removeremove()方法用于移除列表中某个值的第一个匹配项。remove()方法的语法:list.remove(obj)该方法使用示例如下:field=女排,精神,中国,精神,学习,精神print(移除前列表field:,field)移除前列表field:女排,精神,中国,精神,学习,精神field.remove(精神)print(移除后列表field:,field)移除后列表field:女排,中国,精神,学习,精神8.reversereverse()方法用于反向列表中元素。reverse()方法的语法:list.reverse()此语法中list代表的是列表,该方法不需要传入参数。该方法使用示例如下:num=1,2,3print(列表反转前num:,num)列表反转前num:1,2,3num.reverse()print(列表反转后:,num)列表反转后:3,2,19.sortsort()方法用于对原列表进行排序,如果指定参数,则使用参数指定的比较方法进行排序。sort()方法的语法:list.sort(func)此语法中list代表的是列表,func为可选参数,如果指定了该参数会使用该参数的方法进行排序。该方法使用示例如下:num=5,8,1,3,6num.sort()print(num调用sort方法后:,num)num调用sort方法后:1,3,5,6,810.clearclear()方法用于清空列表,类似于dela:。clear()方法的语法:list.clear()此语法中list代表的是列表,不需要传入参数。该方法使用示例如下:field=study,python,is,happyfield.clear()print(field调用clear方法后的结果:,field)field调用clear方法后的结果:11.copycopy()方法用于复制列表,类似于a:。copy()方法的语法:list.copy()此语法中list代表的是列表,不需要传入参数。该方法使用示例如下:field=study,python,is,happycopyfield=field.copy()print(复制操作结果:,copyfield)复制操作结果:study,python,is,happy操作结果和该方法的意思一样,是原原本本的拷贝操作。12.高级排序sort方法有两个可选参数key和reverse。看如下示例:field=study,python,is,happyfield.sort(key=len)#按字符串由段到长排序fieldfield.sort(key=len,reverse=True)#按字符串由长到短排序,传递两个参数fieldpython,study,happy,isis,study,happy,pythonnum=5,8,1,3,6num.sort(reverse=True)#排序后逆序num8,6,5,3,13.3元元组Python的元组与列表类似,不同之处在于元组的元素不能修改(是否记得我们前面多次提到的字符串,它也是不能修改的)。创建元组的方法很简单:如果你使用逗如果你使用逗号分隔了一些号分隔了一些值,那么你就自,那么你就自动创建了元建了元组。如下输入:1,2,3(1,2,3)hello,world(hello,world)该操作用逗号分隔了一些值,结果输出是元组。3.3.1tuple函数函数tuple函数的功能和list函数基本上是一样的:以一个序列作为参数并把它转换为元组。如果参数是元组,那么参数就会被原样返回。如下输入:tuple(hello,world)(hello,world)tuple(hello)(h,e,l,l,o)tuple(hello,world)#参数是元组(hello,world)tuple函数传入元组参数后,得到的返回值就是传入参数。3.3.2元元组基本操作基本操作和列表一样,元组也有一些基本的操作。如访问元组、修改元组、删除元组、索引和截取等操作。当然,这里的修改、删除和截取等操作和列表的操作不太一样。1.访问元组元组可以使用下标索引来访问元组中的值,看如下示例:mix=(hello,world,2015,2016)print(mix1is:,mix1)mix1is:worldnum=(1,2,3,4,5,6,7)print(num1:5is:,num1:5)num1:5is:(2,3,4,5)2.修改元组元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,看如下示例:field=(hello,world)num=(2015,2016)print(合并结果为:,field+num)合并结果为:(hello,world,2015,2016)3.删除元组元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,看如下示例:field=(hello,world)delfieldprint(删除后的结果:,field)Traceback(mostrecentcalllast):File,line1,inprint(删除后的结果:,field)NameError:namefieldisnotdefined以上实例元组被删除后,输出变量会有异常信息,输出结果告诉我们field没有定义,即field已经不存在了。4.元组索引、截取因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,看如下示例:field=(hello,world,welcome)field2welcomefield-2worldfield1:(world,welcome)3.3.3元元组内置函数内置函数Python元组提供了一些内置函数,如计算元素个数、返回最大值、最小值、列表转换等函数。len(tuple),计算元组元素个数。使用方式如下:tup=(hello,world,welcome)len(tup)3max(tuple),返回元组中元素最大值。使用方式如下:tup=(6,3,8)max(tup)8min(tuple),返回元组中元素最小值。使用方式如下:tup=(6,3,8)min(tup)3tuple(seq),将列表转换为元组。使用方式如下:field=hello,world,welcometup=tuple(field)tup(hello,world,welcome)3.4列表与元列表与元组区区别列表与元组的区别是元组的元素不能修改。元组一旦初始化就不能修改。不可变的元组有什么意义?因为元组不可变,所以代码更安全。如果可能,能用元组代替列表就尽量用元组。3.5调试在编写序列操作的程序时,难免会出现错误,以下是常见的一些错误。(1)对序列中的元素进行访问时,输入序列中不存在的编号,比如在greeting=Hello示例中,输入greeting10,会得到什么结果?输入greeting-10又会得到什么结果?交互模式下进行验证。(2)分片操作中,做分片时,索引值大于列表的最大编号时,操作会报错吗?结果是怎样的?交互模式下进行验证。3.6问题解答解答(1)通用序列操作真的是通用的吗?这个是不用质疑的,已经有很多的前辈大牛们试验过并且得出结论。若有任何问题我们可以通过自己试验来证明,毕竟计算机目前是还没有学会撒谎。(2)该怎么选择使用列表还是元组?list和tuple是Python内置的有序集合,一个可变,一个不可变。根据需要来选择使用它们,建议是如我们在它们两者的区别里所讲述的:因为元组不可变,所以代码更安全,如果可能,能用元组代替列表就尽量用元组。3.7温故知新,学以致用温故知新,学以致用本章主要讲解的是列表和元组,在本章结束前,先回顾一下如下一些概念:(1)通用序列的基本操作有哪些?(2)列表有哪些操作和方法?(3)元组有哪些基本操作?内置函数如何使用?(4)列表与元组的区别是什么?尝试思考并解决如下问题:(1)用负数步长对列表和元组进行分片。(2)请用索引取出下面list的指定元素:field=hello,world,welcome,study,Python,is,funny,good,better,best#打印hello:print(?)#打印Python:print(?)#打印best:print(?)1.定义列表:list1=life,is,short,list2=you,need,python完成以下几个要求:1)输出python及其下标list1=life,is,shortlist2=you,need,pythonprint(list2.index(python)2)在list2后追加!,在short后添加,list1=life,is,shortlist2=you,need,pythonn=list1.index(short)list1.insert(n+1,)print(list1)3)将两个字符串合并后,排序并输出其长度list1=life,is,shortlist2=you,need,pythonlist1.extend(list2)print(len(list1)print(list1,list1.sort()4)将python改为python3list1=life,is,shortlist2=you,need,pythonlist2list2.index(python)=python3print(list2)5)移除之前添加的!和,list1=life,is,short,list2=you,need,python,!list1.remove(,)list2.remove(list2list2.index(!)print(list1,list2)自己定义元组并练习常用方法(输出元组长度、指定位置元素等)第四章第四章字符串字符串我们前面已经接触过字符串,也了解了一些基本操作,对字符串的创建、索引和分片等操作已经有了初步的理解。本章将介绍字符串的格式化、分割、搜索等方法。4.1字符串基本操作字符串基本操作字符串是Python中最常用的数据类型。我们可以使用引号引号(或或)来来创建字符串建字符串。创建字符串很简单,只要为变量分配一个值即可。请看下面的例子:field=Hello#创建字符串Hello,并赋给变量field所有标准的序列操作,如索引、分片、成员资格、求长度、取最小值和最大值等操作,对字符串同样适用,我们在前面章节已经讲解了这些操作。但是,字符串是不可字符串是不可变的的,字符串做不了字符串做不了分片分片赋值的的,请看如下操作:field=justdoitfield-3:itfield-3:=nowTraceback(mostrecentcalllast):File,line1,infield-3:=nowTypeError:strobjectdoesnotsupportitemassignment怎么在一个打印语句中打印出两行?看如下输入:print(精诚所至n金石为开)精诚所至金石为开输出结果得到了两行,这里使用了转义字符n,它表示换行的意思。Python中有很多转义符:转义字符字符描述描述转义字符字符 描述描述(在行尾在行尾时) 续行符n换行反斜杠符号v纵向制表符单引号t横向制表符双引号r回车a响铃f换页b退格(Backspace)oyy八进制数,yy代表的字符,例如:o12代表换行e转义xyy十六进制数,yy代表的字符,例如:x0a代表换行000空空other其它其它的字符以普通格式的字符以普通格式输出出4.2字符串格式化字符串格式化我们目前为止对字符串的操作都是停留在赋值、重新赋值、索引、分片和打印等一些比较基本的操作上,其实字符串还有更多更好的操作方式,例如在实际的项目开发中,经常使用的字符串格式化的操作也比较常见。4.2.1字符串格式化符号字符串格式化符号字符串格式化使用字符串格式化操作符百字符串格式化操作符百分号分号%来实现。输入如下:print(hello,%s%world)hello,worldprint(小智今年%s岁了%10)小智今年10岁了在%的左边放置一个待格式化的字符串,右边则放置希望格式化的值。格式化的值可以是一个字符串或者数字。格式化字符串的%s部分称为转换说明符,它标记了需要放置转换值的位置,更通用的术语称为占位符。上面示例中s表示百分号右边的值会被格式化为字符串,s指的是str,如果不是字符串,会使用str将其转换为字符串。如示例中就将10转换为字符串了。用这种方式对大多数值都有效。Python为我们提供了如下所示的格式化符号:符号符号 描述描述符号符号 描述描述%c格式化字符及其ASCII码 %f格式化浮点数字,可指定小数点后的精度%s格式化字符串%e用科学计数法格式化浮点数%d格式化整数%E作用同%e,用科学计数法格式化浮点数%u格式化无符号整型%g%f和%e的简写%o格式化无符号八进制数%G%f和%E的简写%x格式化无符号十六进制数%p用十六进制数格式化变量的地址%X格式化无符号十六格式化无符号十六进制制数(大写)数(大写)4.2.2字符串格式化元字符串格式化元组格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型。如果右操作数是元组,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符。输入如下:print(今年是%s年,中国女排夺得本届奥运会%s,中国共获%d得枚金牌%(2016,冠军,26)今年是2016年,中国女排夺得本届奥运会冠军,中国共获26得枚金牌基本的转换说明符包括以下部分。注意,这些项的顺序是至关重要的。(1)%字符:标记转换说明符的开始。(2)转换标志(可选):-表示做对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充。(3)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。(4)点(.)后跟精度值(可选):如果转换的是实数,精度值表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将会从元组中读出。(5)转换类型:参见格式化表。4.3字符串方法字符串方法前面一章介绍了很多列表的方法,字符串的方法比列表的还要多,是因为字符串从string模块中“继承”了很多方法。因为字符串的方法比较多,这里只介绍一些特别有用的方法,全部方法见附录A。4.3.1findfind()方法检测字符串中是否包含子字符串str,如果指定beg(开始)和end(结束)范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。find()方法的语法:str.find(str,beg=0,end=len(string)此语法中str代表的是指定检索的字符串,beg代表开始索引,默认为0,end代表结束索引,默认为字符串的长度。它返回子串所在位置的最左端索引,如果没有找到则返回-1。示例如下:field=doitnowfield.find(now)6field.find(python)-14.3.2joinjoin()方法用于将序列中的元素以指定的字符连接生成一个新的字符串。join()方法的语法:str.join(sequence)示例如下:dirs=,home,data,hdfsprint(路径:,/.join(dirs)路径:/home/data/hdfsfield=1,2,3,4,5print(连接字符串列表:,mark.join(field)连接字符串列表:1+2+3+4+54.3.3lowerlower()方法转换字符串中所有大写字符为小写。lower()方法语法:str.lower()str代表的是指定检索的字符串,该方法不需要参数。返回将字符串中所有大写字符转换为小写后生成的字符串。示例如下:field=DOITNOWprint(调用lower得到字符串:,field.lower()调用lower得到字符串:doitnowgreeting=Hello,Worldprint(调用lower得到字符串:,greeting.lower()调用lower得到字符串:hello,world4.3.4upperupper()方法将字符串中的小写字母转为大写字母。upper()方法语法:str.upper()field=doitnowprint(调用upper得到字符串:,field.upper()调用upper得到字符串:DOITNOWgreeting=Hello,Worldprint(调用upper得到字符串:,greeting.upper()调用upper得到字符串:HELLO,WORLD4.3.5swapcaseswapcase()方法用于对字符串的大小写字母进行转换,将字符串中大写转换为小写,小写转换为大写。swapcase()方法的语法:str.swapcase()此语法中str代表的是指定检索的字符串,该方法不需要参数。返回大小写字母转换后生成的新字符串。示例如下:field=Justdoit,NOWprint(原字符串:,field)原字符串:Justdoit,NOWprint(调用swapcase方法后得到字符串:,field.swapcase()调用swapcase方法后得到字符串:jUSTDOIT,now4.3.6replacereplace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。replace()方法的语法:str.replace(old,new,max)此语法中str代表的是指定检索的字符串,old代表将被替换的子字符串,new代表新字符串,用于替换old子字符串,max代表可选字符串,替换不超过max次。返回字符串中的old(旧字符串)替换成new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过max次。示例如下:field=doitnow,dorightnowprint(原字符串:,field)原字符串:doitnow,dorightnowprint(新字符串:,field.replace(do,Justdo)新字符串:Justdoitnow,Justdorightnow4.3.7splitsplit()方法通过指定分隔符对字符串进行切片,如果参数num有指定值,则仅分隔num个子字符串。这是一个非常重要的字符串方法,它是join的逆方法,用来将字符串分割成序列。split()方法的语法:str.split(st=,num=string.count(str)str代表的是指定检索的字符串,st代表分隔符,默认为空格,num代表分割次数。返回分割后的字符串列表。示例如下:field=doitnowprint(不提供任何分割符分隔后的字符串:,field.split()不提供任何分割符分隔后的字符串:do,it,nowprint(根据i分隔后的字符串:,field.split(i)根据i分隔后的字符串:do,tnow4.3.8stripstrip()方法用于移除字符串头尾指定的字符(默认为空格)。strip()方法的语法:str.strip(chars)此语法中str代表的是指定检索的字符串,chars代表移除字符串头尾指定的字符。返回移除字符串头尾指定的字符生成的新字符串。该方法使用示例如下:field=-doitnow-print(原字符串:,field)原字符串:-doitnow-print(新字符串:,field.strip(-)新字符串:doitnow4.3.9translatetranslate()方法根据参数table给出的表(包含256个字符)转换字符串的字符,要过滤掉的字符放到del参数中。translate()方法的语法:str.translate(table,deletechars)此语法中str代表的是指定检索的字符串,table代表翻译表,翻译表是通过maketrans方法转换而来,deletechars代表字符串中要过滤的字符列表。返回翻译后的字符串。示例如下:intab=adfasouttab=12345trantab=str.maketrans(intab,outtab)st=justdoitprint(st调用translate方法后:,st.translate(trantab)st调用translate方法后:ju5t2oit4.4调试下面我们通过示例来进行介绍,这里通过设置的一些错误让读者来认识在编写代码过程中可能碰到的比较常见的问题,以帮助读者熟悉和解决实际遇到的问题。(1)使用格式化整数的占位符格式化字符串,结果会怎样?(2)使用%f输出圆周率的示例中,若更改为使用%d输出,结果会怎样?(3)在0填充的示例中,把010的第一个0更改为其他数字,看看输出结果;再在精度之前添加一个0或大于0或小于0的数字,看看输出结果。4.5问题解答解答(1)字符串格式化在项目实战中一般都用于做什么?一般用于做一些输入信息的格式化,比如对程序中的查询语句,经常需要查看一个查询语句查找到了多少记录,对于我们而言,不可能每次都手动去执行查询语句,这时就可以用字符串格式化语句将查询结果格式化到字符串中,再打印出来,我们只需要看打印出来的结果即可。(2)本章中所列举的字符串方法都是很常用的吗?这个要看你接触到的是什么样的工作内容,基本上来说这些都是会经常用到的,这也是大家在使用过程中慢慢发现的,是基于实战经验的积累,整体来说这些方法都是在平时使用频率比较高的。当然,也可能有一些这里没有列举出来的方法,在实际使用中也会用到不少次数,这个到时可以自己查看相关资料。4.6温故知新,学以致用温故知新,学以致用本章主要讲解的是字符串,在本章结束前,先回顾一下如下一些概念:(1)字符串有哪些基本操作?(2)字符串格式化的方式?(3)字符串比较常用的方法有哪些,该怎么使用?尝试思考并解决如下问题:小智的智商从去年的100分提升到了今年的132分,请计算小智智商提升的百分比,并用字符串格式化显示出“xx.x%”的形式,保留一位小数。练习str1=input(请输入一个人的名字:)str2=input(请输入一个地方的名字:)print(世界那么大,想去看看。.format(str1,str2)第五第五章章字字典典第三章我们通过对列表(list)的学习了解到,列表可以将值分组到一个结构中,并通过编号对其进行引用。本章将介绍一种通过名字引用值的数据结构。这种结构类型称为映射(mapping)。字典字典是Python中唯一内建的映射类型。字典指定值并没有特殊的顺序,但是都存储在一个特殊的键(Key)里。键可以是数字、字符串甚至是元组。字典是另一种可变容器模型,且可存储任意类型对象。5.1字典的使用字典的使用字典这个数据结构的功能,就如这个名字一样,可以像我们学习的时候使用汉语字典那样来使用:在使用汉语字典时,我们即可以从头到尾一页一页去查找某个字,也可以通过拼音索引或笔画索引快速找到某个字,在汉语字典中找拼音索引和笔画索引是很轻松简单的。Python中对字典进行了构造,让我们可以轻松查到某个特定的键(类似拼音或笔画索引),从而通过键找到对应的值(类似具体某个字)。假如需要创建一个可以存储学生姓名和学号的小型数据库,应该怎么做呢?我们尝试使用之前学习过的列表来实现,输入如下:students=小萌,小智,小强,小张,小李numbers=1001,1002,1003,1004,1005print(小智的学号是:,numbersstudents.index(小智)小智的学号是:1002我们希望的直接返回索引位置上的值,比如像这样:print(小智的学号是:,numbers小智)小智的学号是:10025.2创建和使用字典建和使用字典字典的创建格式如下:d=key1:value1,key2:value2字典由多个键及与其对应的值构成的对组成(把键/值对称为项)。字典的每个键/值(key/value)对用冒号用冒号(:)分割分割,每个项之间用逗号逗号(,)分割分割,整个字典包括在花括号()中。空字典空字典(不包括任何项)由两个大括号组成,如:。键必必须是唯一的是唯一的,但值则不必。值可以取任何数可以取任何数据据类型,但型,但键必必须是不可是不可变的,如字符串、数字的,如字符串、数字或元或元组。简单的字典示例:dict=小萌:1001,小智:1002,小强:1003也可以为如下形式:dict2=abc:123,98.6:375.2.1dict函数函数可以用dict函数函数,通过其他映射(比如其他字典)或者(键/值)这样的序列对建立字典。看如下输入:student=(name,小萌),(number,1001)detail=dict(student)print(学生详细信息:,detail)学生详细信息:name:小萌,number:1001print(学生姓名:,detailname)学生姓名:小萌print(学生学号:,detailnumber)学生学号:10015.2.2基本字典操作基本字典操作字典的基本操作在很多方面与序列(sequence)类似,也支持修改、删除等操作。1.修改字典修改字典向字典添加添加新内容的方法是增加新的增加新的键/值对,修改或删除已有键/值对。如下示例:student=小萌:1001,小智:1002,小强:1003student小强=1005#更新小强的学号print(小强的学号是:%(小小强)s%student)小强的学号是:1005student小张=1006#添加一个学生print(小张的学号是:%(小张)s%student)小张的学号是:10062.删除字典元素除字典元素此处的删除指的是显式式删除除,显式删除一个字典用del命令,如下示例:student=小强:1005,小萌:1001,小智:1002,小张:1006print(删除前:,student)删除前:小强:1005,小萌:1001,小智:1002,小张:1006delstudent小小张#删除键“小张”print(删除后:,student)删除后:小强:1005,小萌:1001,小智:1002除了删除键,也可以删除整个字典。3.字典字典键的特性的特性两个重要的点需要记住:(1)不允不允许同一个同一个键出出现两次两次。看如下示例:student=小萌:1001,小智:1002,小萌:1005print(学生信息:,student)学生信息:小萌:1005,小智:1002(2)键必必须不可不可变,所以可以用数字,字符串或元,所以可以用数字,字符串或元组充当,而用列表就不行充当,而用列表就不行,看如下示例:field=name:小萌,number:1001Traceback(mostrecentcalllast):File,line1,infield=name:小萌,number:1001TypeError:unhashabletype:list4.len函数函数len(dict),该函数用于计算字典元素个数,即键的的总数数。看如下示例:student=小萌:1001,小智:1002,小强:1005,小张:1006print(字典元素个数为:%d个%len(student)字典元素个数为:4个5.type函数函数type(variable),该函数返回输入的变量类型,如果输入变量是字典就返回字典类型。看如下示例:student=小萌:1001,小智:1002,小强:1005,小张:1006print(字典的类型为:,type(student)字典的类型为:5.2.3字典的格式化字符串字典的格式化字符串student=小萌:1001,小智:1002,小强:1003print(小强的学号是:%(小小强)s%student)小强的学号是:1003字典的格式化方式是在每个转换说明符中的%字符后面,加上用圆括号括起来的括号括起来的键,后面再跟上其他说明元素。字典的格式化除了增加的字符串键之外,转换说明符还是像以前一样工作。当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以获得任意数量的的转换说明符。5.2.4字典和列表的区字典和列表的区别和list比较,dict有以下几个特点:(1)查找和插入的速度极快,不会随着key的增加而变慢;(2)需要占用大量的内存,内存浪费多。List的特点是:(1)查找和插入的时间随着元素的增加而增加;(2)占用空间小,浪费内存很少。dict使用的是用空间来换取时间。dict可以用在需要高速查找的很多地方,需要牢记的第一条就是dict的key必须是不可变对象。5.3字典方法字典方法就像其他内建类型一样,字典也有方法。这些方法非常有用,但是可能不会像使用列表或者字符串那样频繁的使用。在学习本节时可以先简单浏览本节内容,了解一下有哪些方法可用,然后在需要的时候再回过头来查看特定方法的具体用法。5.3.1clear方法方法clear()方法用于删除字典内所有的除字典内所有的项。clear()方法的语法:dict.clear()此语法中dict代表的是指定字典,该方法不需要参数。该函数是个原地操作(类似于list.sort)的函数,没有任何返回值(或者说返回为None)。示例如下:student=小萌:1001,小智:1002,小强:1005,小张:1006print(字典元素个数为:%d个%len(student)字典元素个数为:4个student.clear()print(字典删除后元素个数为:%d个%len(student)字典删除后元素个数为:0个5.3.2copy方法方法copy()方法返回一个具有相同键/值对的新字典(这个方法是浅复制(shallowcopy),因为值本身是相同的,而不是副本)。copy()方法的语法:dict.copy()此语法中dict代表的是指定字典,该方法不需要参数。返回一个字典的浅复制。示例如下:student=小萌:1001,小智:1002,小强:1005,小张:1006st=student.copy()print(复制后得到的st为:,st)复制后得到的st为:小强:1005,小萌:1001,小智:1002,小张:10065.3.3fromkeys方法方法fromkeys()方法用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。fromkeys()方法的语法:dict.fromkeys(seq,value)dict代表的是指定字典,seq代表字典键值列表,value代表可选参数,设置键序列(序列(seq)的)的值。该方法返回列表。示例如下:seq=(name,age,sex)info=dict.fromkeys(seq)print(新的字典为:%s%info)新的字典为:name:None,sex:None,age:Noneinfo=dict.fromkeys(seq,10)print(新的字典为:%s%info)新的字典为:name:10,sex:10,age:105.3.4get方法方法get()方法返回指定键的值,如果值不在字典中返回默认值。get()方法的语法:dict.get(key,default=None)dict代表的是指定字典,key代表字典中要查找的键,default代表如果指定键的值不存在时,返回该默认值。返回指定返回指定键的的值,如果,如果值不在不在字典中返回默字典中返回默认值None。示例如下:student=小萌:1001,小智:1002print(小萌的学号为:%s%student.get(小萌)小萌的学号为:10015.3.5keyindict方法方法Python字典in操作符用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false。该方法的语法:keyindict此语法中dict代表的是指定字典,key代表要在字典中查找的键。如果键在字典里返回true,否则返回false。示例如下:student=小萌:1001,小智:1002print(小萌在student字典中:%s%(小萌instudent)小萌在student字典中:Trueprint(小强在student字典中:%s%(小强instudent)小强在student字典中:False5.3.6items方法方法items()方法以列表返回可遍以列表返回可遍历的的(键,值)元元组数数组。items()方法的语法:dict.items()此语法中dict代表的是指定字典,该方法不需要参数。返回可遍历的(键/值)元组数组。示例如下:student=小萌:1001,小智:1002print(调用items方法的结果:%s%student.items()调用items方法的结果:dict_items(小萌,1001),(小智,1002)5.3.7keys方法方法keys()方法以列表返回一个字典所有的方法以列表返回一个字典所有的键。keys()方法的语法:dict.keys()此语法中dict代表的是指定字典,该方法不需要参数。返回一个字典所有的键。示例如下:student=小萌:1001,小智:1002print(字典student所有的键为:%s%student.keys()字典student所有的键为:dict_keys(小萌,小智)5.3.8setdefault方法方法setdefault()方法和get()方法类似,就是获得与给定键相关联的值,如果键不存在于字典中,将会添加键并将值设为默认值。setdefault()方法的语法:dict.setdefault(key,default=None)dict代表的是指定字典,key代表查找的键值,default代表键不存在时,设置的默认键值。该方法没有任何返回值。示例如下:student=小萌:1001,小智:1002print(小强的键值为:%s%student.setdefault(小强)小强的键值为:Noneprint(小智的键值为:%s%student.setdefault(小智)小智的键值为:1002print(student字典新值为:%s%student)student字典新值为:小强:None,小萌:1001,小智:10025.3.9update方法方法update()方法把字典dict2的键/值对更新到dict里。update()方法的语法:dict.update(dict2)此语法中dict代表的是指定字典,dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。示例如下:student=小萌:1001,小智:1002student2=小李:1003print(原student字典为:%s%student)原student字典为:小萌:1001,小智:1002student.update(student2)print(新student字典为:%s%student)5.3.10values方法方法values()方法以列表形式返回字典中的所有方法以列表形式返回字典中的所有值。与返回键的列表不同的是,返回的列表中可以包含重复的元素。values()方法的语法:dict.values()此语法中dict代表的是指定字典,该方法不需要参数。返回字典中的所有值。示例如下:student=小萌:1001,小智:1002,小李:1001print(student字典所有值为:%s%list(student.values()student字典所有值为:1001,1001,10025.4调试下面我们通过示例来进行介绍,这里通过设置的一些错误让读者来认识在编写代码过程中可能碰到的比较常见的问题,以帮助读者熟悉和解决实际遇到的问题。我们来一起看看如下几个示例。(1)在使用列表根据姓名查找学号中,学号使用的是字符串表示的,更改为数字表示会怎样?(2)尝试从字典中输出一个字符宽度为10的元素?5.5问题解答解答(1)项目实战中字典用的多吗?实际项目中字典用的是比较多的,通过本章学习我们也知道,字典能存储键/值对信息,当有遇到需要通过一个值取得另一个值的情况时,字典就是一个很好的选择。特别在项目中,需要根据一个唯一标识(如id)来取得一些统计值的情况很多,就需要字典结构的支持。(2)在哪些领域使用字典比较多?基本需要使用软件的领域都会需要使用到字典结构的,毕竟这是一个基本的数据结构。(3)其他语言中有字典的说法吗?有的,字典这种数据结构在任何编程语言中都是有的,不过不同语言中的定义方式会不太一样,如在java中用的是map表示字典这种数据结构。5.6温故知新,学以致用温故知新,学以致用本章主要讲解的是字典,在本章结束前,先回顾一下如下一些概念:(1)字典如何使用?(2)如何创建字典,字典基本操作有哪些?(3)字典常用的方法有哪些,该怎么使用?尝试思考并解决如下问题:(1)用dict函数实现存储一个人的姓名、手机号和地址信息,字符串名称和值由自己定义和赋值。(2)创建一个字典,里面元素的键/值全部为字符串,再对某个元素更改,更改其值为非字符串形式,比如整数、浮点数或元组。练习dic=k1:v1,k2:v2,k3:v31、打印key值;打印values;返回一个包含所有(键,值)元组的列表;2、请在字典中添加一个键值,k4:y4,输出添加后的字典3、请在字典中删除一个键值,k1:y1,输出删除后的字典4、请获取字典中k2的值5、请获取字典中的键k6对应的值,如果键k6不存在,则不报错,并且让其返回noneprint(dic.get(k6)第六第六章章条件条件、循、循环和其他和其他语句句学习到这里,根据讲解的一些基本概念和一些数据结构,相信你已经有一定的Python基础了。本章将会从import语句开始介绍一些基本语句,然后逐步深入介绍条件语句和循环语句以及列表推导式等一些更深层次的语句的学习。6.1使用文本使用文本编辑器器到目前为止,我们的操作方式都是在Python的交互式命令行下进行的,这么操作的优点是一下就能得到操作结果,但缺点也很明显,那就是没法保存操作记录。这里推荐两款文本编辑器:一个是SublimeText,免费使用,但是不付费会弹出提示框。另一个是Notepad+,免费使用,有中文版和英文版,可根据自己的需要选择。安装好文本编辑器后,打开编辑器,输入以下代码:print(Hello,world!)保存到一个指定目录,如D:pythonworkspace,命名为hello.py。保存完后,打开命令行窗口(如windows中打开cmd命令窗口),把当前目录切换到hello.py所在目录,如下图进行操作并查看:切换到workspace目录下输入dir命令可以查看该文件夹中有哪些文件,上图中看到该文件夹下有一个名为hello.py的文件。在cmd命令窗口下输入以下命令就可以运行hello.py,如下图所示:在cmd命令中执行Python文件的命令格式为:python带py后缀的文件名,如hello.py输入命令按enter键后,即在cmd命令窗口打印出结果。6.2import的使用的使用语言的学习只有在不断深入后,才能更进一步发现其中隐藏的那些惊人的特性。即使是简单的print函数,在不断使用后也会发现其更多的使用方式,而import则将带你进入一个更快捷编程模式。6.2.1import语句句importmathr=5print(半径为5的圆的面积为:%.2f%(math.pi*r*2)保存文件名为import_test.py。在cmd命令窗口执行如下命令得到结果:D:pythonworkspacepythonimport_test.py半径为5的圆的面积为:78.54由上面的程序我们看到,使用了import语句。importmath的意思为从Python标准库中引入math.py模块,这是Python中定义的引入某一模块的方法。import的标准语法如下:importmodule1,module2,.moduleN允许一个import导入多个模块,但各个模块间需要用逗号隔开。当解释器遇到import语句时,如果模块在当前的搜索路径就会被导入。搜索路径是一个解释器会先进行搜索的所有目录的列表。使用import语句的时候,Python解释器会依次从这些目录中去寻找所引入的模块。这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。搜索路径是在Python编译或安装的时候确定的。6.2.2使用使用逗号逗号输出出我们在前面的章节已经看到非常多类似以下的示例:student=小智print(学生称呼:,student)学生称呼:小智这个其实就叫做逗号逗号输出,出,这种方式是可以种方式是可以打印多个表达式的,只要将多个表达式用逗打印多个表达式的,只要将多个表达式用逗号隔开就号隔开就行行。如下输入:greeting=大家好!intriduce=我叫小智,comefrom=我来自智慧城市。print(greeting,intriduce,comefrom)大家好!我叫小智,我来自智慧城市。6.3别样的的赋值之前我们已经介绍了很多赋值语句,在实际使用中,赋值语句还有很多特殊用法也比较常见,掌握这些用法,对于提高编程水平很有帮助。6.3.1序列解包序列解包看如下示例:x,y,z=1,2,3x,y=y,xprint(x,y,z)213x和y的值交换了,可以用来交换两个或多个变量的值。在Python中,这里交换所做的事情叫做序列解包(sequenceunpacking)或可选迭代解包,即将多个值的序列解开,然后放到变量的序列中。6.3.2链式式赋值序列解包对不同变量赋不同值时非常有用,若是要赋相同的值,用序列解包也可以实现,其实还可以使用其他方法,如链式赋值。我们看如下示例:x=y=z=10x10链式赋值(chainedassignment)是将同一个值赋给多个变量的捷径。6.3.3增量增量赋值如将x=x+1写成x+=1,这种写法在Python中叫做增量赋值(augementedassignment)。这种写法对*(乘)、/(除)、%(取模)等标准运算符都是适用的。如下示例:x=5x+=1#加x6x-=2#减x46.4语句句块语句块并非一种语句,语句块是在满足一定条件下执行一次或多次的一组语句。语句块的创建方式为在代码前放置空格缩进。同一段同一段语句句块中的每行都要保持同中的每行都要保持同样的的缩进,若没有,Python编译器回认为不属于同一语句块或是认为错误。在Python中,冒号(:)用来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)。当退回到和已经闭合的块一样的缩进量时,就表示当前块已经结束了。6.5条件条件语句句到目前为止,我们编写的程序都是简单的按语句顺序一条一条执行的。本节将介绍让程序选择执行语句的方法。6.5.1布布尔变量的作用量的作用True、False就是布尔变量。下面的值在作为布尔表达式的时候,会被解释器看作假(false):FalseNone0“”()标准值False和None、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(如空字符串、空元组和空列表)以及空的字典都为假。其他的都解释为真,包括原生的布尔值True。在Python中,标准的真值有True和False两个。在其他一些语言中,标准的真值为0(表示假)和1(表示真)。6.5.2if语句句真值可以联合使用,看如下代码:#!/usr/bin/python3#-*-coding:UTF-8-*-#if基本用法greeting=helloifgreeting=hello:print(hello)执行结果:hello如果条件(在if和冒号之间的表达式)判定为真,那么后面的语句块(本例中是print语句)就会被执行;如果条件为假,语句块就不会被执行。6.5.3else子句子句在if语句的示例中,若greeting的值不为hello,那就进不了语句块,但若想要相关的提示,比如告诉我们greeting的值不为hello,那该怎么处理?看如下输入:#!/usr/bin/python3#-*-coding:UTF-8-*-greeting=hiifgreeting=hello:print(hello)else:print(该语句块不在if中,greeting的值不是hello)输出结果:该语句块不在if中,greeting的值不是hello6.5.4elif子句子句在else子句的示例中,假如除if条件外,还有多个子条件需要进行判定,该怎么处理?Python为我们提供了一个elif语句,elif是“elseif”的简写,意思为具有条件的else子句。看如下示例:num=10ifnum10:print(num的值大于10)elif0=numx=y=1,2,3z=1,2,3x=yTruex=zTruexisyTruexiszFalse最后一个语句有些不好理解,是怎么一回事?因为is运算符是判定同一性而不是相等性的。变量x和y都被绑定到同一个列表上,而变量z被绑定在另外一个具有相同数值和顺序的列表上。它们的值可能相等,但是却不是同一个对象。更深层的可以从内存的角度思考就是,它们所指向的内存空间是不一样的,x和y指向同一块内存空间,z指向另一块内存空间。2.字符串和序列比较字符串可以按照字母顺序排列进行比较,这个我们在前面的章节已经介绍过。这里我们聊一些其他序列的比较操作。看如下输入:1,21,21,2=1,2True如果一个序列中包括其他序列元素,比较规则也同样适用于序列元素。如下输入:2,1,22,1,3True3.布尔运算符前面我们已经讲述过不少关于布尔运算的操作。但有时若要检查一个以上的条件,依我们前面的操作方式,可能要多走一些弯路。看如下操作:num=10ifnum=5:print(num的值介于5到10之间)else:print(num的值不介于5到10之间)else:print(num的值不介于5到10之间)上面的程序在写法上没有什么问题,但是走了一些不必要的弯路,可以像如下更加简便的进行编写:ifnum=5:print(num的值介于5到10之间)else:print(num的值不介于5到10之间)and运算符连接两个布尔值,并在两者都为真时返回真,否则返回假。与它同类的还有or和not两个运算符。布尔运算符有个有趣的特性:只有在需要求值时才进行求值。6.5.7断言断言在Python中,有一个和if语句工作方式非常相近的关键字,其工作方式类似如下伪代码:ifnotcondition:crashprogram在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃。一般来说,可以要求某些条件必须为真。在Python中,assert关键字能实现这个工作方式。先来看一个示例:x=3x0,xisnotzeroorassertnegativeassertx%2=0,xisnotanevennumber#提示x不是偶数Traceback(mostrecentcalllast):File,line1,inassertx%2=0,xisnotanevennumberAssertionError:xisnotanevennumber6.6循循环程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次,下图是大多数编程语言中的循环语句的执行流程的一般形式:6.6.1while循循环Python编程中while用于循环执行程序,在某条件下,循环执行某段程序,处理需要重复处理的相同任务。其语法形式为:while判断条件:执行语句执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为真(true)。当判断条件为假(false)时,循环结束。while循环的执行流程图如右图所示:流程图的意思为:首先对while条件判定,当条件为true时,会执行条件语句块,执行完语句块再判定while条件,若仍然为true,继续执行语句块,直到条件为false时,才结束。如下程序:n=1whilensorted(5,3,7,1)1,3,5,7sorted(hello,world!)!,d,e,h,l,l,l,o,o,r,wlist(reversed(hello,world!)!,d,l,r,o,w,o,l,l,e,h.join(reversed(hello,world!)!dlrow,olleh6.6.5跳出循跳出循环在前面的示例中讲过,循环会一直执行,直到条件为假或序列元素用完,才结束循环。但若我们想提前中断循环,比如循环的结果已经是我们想要的了,就不想让循环继续执行而占用资源。Python中提供了break、continue等语句可用于这种情形。1.breakbreak语句用来终止循环语句,即使循环条件中没有False条件或者序列还没被完全遍历完,也会停止执行循环语句。break语句用在while和for循环中。如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。break语句语法如下:breakbreak语句的执行流程图如右图所示:当遇到break语句时,不管执行条件是怎样的,都跳出这个循环。2.continuecontinue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。continue语句用在while和for循环中。continue语句语法格式如下:continuecontinue语句的执行流程图如右图所示:当执行过程中遇到continue语句时,不管执行条件是真是假,都跳过这次循环,进入下一次循环。6.6.6循循环中的中的else子句子句在开发过程中可能会需要当while、for等循环不满足条件时做一些相关的工作。1.while循环使用else语句在while条件语句为false时执行else的语句块,如下所示:num=0whilenumpass输出结果什么都没有做。6.8牛刀小牛刀小试猜字游猜字游戏编写写游戏内容是这样的:随便给定一个一定范围的数字,让用户去猜这个数字的多少,并输入自己猜测的数字,系统判断是否为给定数字。如果输入的猜测数字大于给定值,提示你输入的大了;如果小于给定值,则提示小了;如果等于给定数字,则提示你猜对了,并展示猜了多少次猜中了。看给的参考代码之前先思考一下,要实现这个小游戏,你会怎么做呢?importrandomsecret=random.randint(1,100)#生成随机数思考点拨:先从最简单的方向思考,有三种情况:(1)输入值小于给定值;(2)输入值等于给定值;(3)输入值大于给定值。对于情况(1)和(3),需要能继续输入,对于情况(2),输入结束。需要提供三个变量:一个记录给定值,一个记录输入值,一个记录输入了多少次,注意输入次数至少是1次。(具体代码参考书籍)importrandomse=random.randint(1,10)count=0whilecountse:print(thedataisbig)count=count+1elifa=se:print(%dtimesisright%count)breakelse:print(thedataissmall)count+=1else:print(youguessedtwomanytimes:%d%se)6.9Python程序程序调试(1)在交互模式下输入false,看看输出什么结果,并尝试解答为什么输出这样的结果。输入true、True+false呢?(2)在while或for循环中,尝试将循环语句块中的语句不对齐,看看执行结果怎样?(3)尝试如下程序执行结果是怎样的:name=xiaomengifname=xiaomeng:print(hello)elifname=xiaozhi:print(donothing)passelse:print(nothing)6.10问题解答解答(1)能不能像执行.exe文件那样执行.py文件呢?在Windows上是不行的,但是,在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释。(2)在实际项目中,条件语句用的多还是循环语句用的多?有一些项目的功能实现用条件语句更好实现,自然条件语句会使用的多些。若是使用循环语句实现更方便些,那就循环语句使用的会更多。一般不会存在哪个使用多些的问题,而是会根据自己的使用习惯和具体需求,做出更优的选择。(3)循环语句中可以嵌套循环吗?循环语句也可以像条件语句那样,嵌套循环语句。循环语句中不但可以嵌套循环语句,还可以嵌套条件语句,条件语句中也可以嵌套循环语句。6.11温故知新,学以致用温故知新,学以致用在本章结束前,先回顾一下这些概念:(1)import语句和import语句的使用(2)什么是序列解包、链式赋值和增量赋值?(3)什么是条件语句?(4)有哪些循环语句,该怎么使用,又该怎么跳出?尝试思考并解决如下问题:(1)使用本章所学,并查找相关资料,打印出九九乘法表。(2)使用本章的知识,写一个程序判断输入的年份是否为闰年。(3)写一个函数判断输入的数字是奇数还是偶数。1.输出10行内容,每行的内容都是“*”。2.输出10行内容,每行的内容都不一样,第1行一个星号,第2行2个星号,依此类推第10行10个星号。i=1while(i=10):j=1while(jprint(helloworld)helloworldtype(hello)int(12.1)12Python3内置了很多有用的函数,我们可以直接调用。要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档:https:/docs.python.org/3/library/functions.html除了到Python官网查看文档,还可以在交互式命令行通过help(abs)查看abs函数的帮助信息。在交互模式下输入:help(abs)Helponbuilt-infunctionabsinmodulebuiltins:abs(x,/)Returntheabsolutevalueoftheargument.7.2定定义函数函数Python也支持自定义函数,以下是简单的规则:(1)函数代码块以def关键词开头,后接函数标识符名称和圆括号()。(2)任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。(3)函数的第一行语句可以选择性地使用文档字符串用于存放函数说明。(4)函数内容以冒号起始,并且缩进。(5)return表达式结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。一般格式如下:def函数名(参数列表)函数名(参数列表):函数体函数体或者更直观的表示为:def(arg1,arg2,.argN):函数的名字也必须以字母开头,可以包括下划线“_”,同定义变量一样,不能把Python的关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有一个空格的缩进,以表示此语句属于这个函数的。函数体必须保持一致的缩进,因为在函数中,缩进结束的地方,表示函数结束。几点注意:(1)如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。(2)returnNone可以简写为return。(3)在Python中定义函数时,需要保持函数体中同一层级代码的缩进一致。在一个函数中还可以打印出多条语句,并能做相应的运算操作,以及打印出运算结果。7.3函数的参数函数的参数我们在7.2节中讲述了如何定义函数,但讲述的是定义简单的函数,还有一类函数是带有参数的,称为带参数的函数。本节将探讨如何定义带参的函数及其使用。调用函数时可以使用以下参数类型:(1)必须参数。(2)关键字参数。(3)默认参数。(4)可变参数。(5)组合参数。7.3.1必必须参数参数必须参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。defparamone(str):print(theparamis:,str)print(我是一个传入参数,我的值是:,str)paramone(hello,world)我们定义了一个必须传入一个参数的函数paramone(str),其传入参数为str,结果即是将hello,world这个值传给str。7.3.2关关键字参数字参数函数调用使用关键字参数来确定传入的参数值。使用关键字参数Python解释器能够用参数名匹配参数值。defpersoninfo(age,name):print(年龄:,age)print(名称:,name)returnprint(-按参数顺序传入参数-)personinfo(21,小萌)print(-不按参数顺序传入参数,指定参数名-)personinfo(name=小萌,age=21)print(-按参数顺序传入参数,并指定参数名-)personinfo(age=21,name=小萌)7.3.3默默认参数参数调用函数时,如果没有传递参数,则会使用默认参数。所谓使用默认参数,就是我们在定义函数时,给参数一个默认值,当没有给调用该函数时的该参数赋值时,调用的函数就使用这个默认的值。defdefaultparam(name,age=23):print(hi,我叫:,name)print(我今年:,age)returndefaultparam(小萌)对于默认参数:(1)不管有多少个默认参数,默认参数都不能在必须参数之前。(2)不管有多少个默认参数,若不传入默认参数值,都会使用默认值。(3)若要更改某一个默认参数的值,而不想传入其他默认参数,且其位置不是第一个默认参数,可以通过参数名来更改想要更改的默认参数的值。(4)若有一个默认参数是通过传入参数名更改参数值,则其他任何想要更改的默认参数都需要传入参数名来更改参数值,否则报错。(5)更改默认参数的值时,传入默认参数的顺序不需要根据定义的函数中的默认参数的顺序进行传入,不过最好同时传入参数名,否则容易出现执行结果与预期不一致的情况。7.3.4可可变参数参数如果需要一个函数能处理比当初声明时更多的参数,这些参数叫做可变参数,和前面所述两种参数不同,可变函数声明时不会命名。基本语法如下:deffunctionname(formal_args,*var_args_tuple):函数_文档字符串function_suitereturnexpression加了星号(*)的变量名会存放所有未命名的变量参数。如果变量参数在函数调用时没有指定参数,它就是一个空元组。我们也可以不向可变函数传递未命名的变量。通过实例来说明可变函数的使用,定义如下函数并执行:defpersoninfo(arg,*vartuple):print(arg)forvarinvartuple:print(我属于不定长参数部分:,var)returnprint(-不带可变参数-)personinfo(小萌)print(-带上两个可变参数-)personinfo(小萌,21,beijing)print(-带上五个可变参数-)personinfo(小萌,21,beijing,123,shanghai,happy)7.3.5组合参数合参数在Python中定义函数,可以用必须参数、关键字参数、默认参数和可变关键字参数,这4种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必须参数、默认参数、可变参数和关键字参数。下面我们来介绍组合参数的使用,请看如下函数定义:defexp(p1,p2,df=0,*vart,*kw):print(p1=,p1,p2=,p2,df=,df,vart=,vart,kw=,kw)exp(1,2)exp(1,2,c=3)exp(1,2,3,a,b)exp(1,2,3,abc,x=9)7.4执行流程行流程为了保证函数的定义先于其首次调用时执行,我们需要知道中语句的执行顺序,即执行流程。执行总是从程序的第一行代码开始的,从上到下,从左到右,按顺序依次执行第一条语句。函数定义并不会改变程序的执行流程,但应该注意函数代码块中的语句并不是立即就执行的,而是等到函数被程序调用时才会执行。函数调用可以看作程序执行流程中的一个迂回路径,遇到函数调用时,并不会直接继续执行下一条语句,而是跳到函数体的第一行,继续执行完函数代码块的所有语句,再跳回到原来离开的地方。7.5形参和形参和实参参前面已经讲述过函数的参数,本节将给大家介绍Python函数的两种类型参数,一种是函数定义里的形参,一种是调用函数时传入的实参。经常在使用一些内置函数的时候,我们需要传入参数,比如:调用math.sin时,需要传入一个整型数字作为实参,还有的函数需要多个参数,像math.pow就需要2个参数,一个是基数(base)和指数(exponent)。在函数的内部,实参会被赋值给形参。例如我们前面所定义的如下函数:#!/usr/bin/python3#-*-coding:UTF-8-*-defpersoninfo(age,name):print(年龄:,age)print(名称:,name)return在该函数中,函数名personinfo后面的参数列表age和name就是实参,在函数体中分别将age和name值传递给了age和name,函数体中的age和name就是形参。7.6变量作用域量作用域作用域简单说就是一个变量的命名空间。在Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的,代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。变量的作用域决定了哪一部分程序可以访问哪个特定的变量名称。在Python中有两种最基本的变量作用域:(1)局部变量。(2)全局变量。7.6.1局部局部变量量在函数内定义的变量名,只能被函数内部引用,不能在函数外引用这个变量名,这个变量的作用域就是局部的,也叫它为局部变量。定义的变量如果在函数体中是第一次出现,那么它就是局部变量。看如下函数定义:deffunc():x=100printx在func函数中,x是在函数体中被定义的,并且是第一次出现,x就是局部变量。局部变量只能在函数体中被访问,超出函数体的范围,访问报错。7.6.2全局全局变量量在函数外,一段代码最始开所赋值的变量,它可以被多个函数引用,这就是全局变量。全局变量可以在整个程序范围内访问。total=0;#这是一个全局变量defsum(arg1,arg2):total=arg1+arg2;#total在这里是局部变量.print(函数内是局部变量:,total)returntotaldeftotalprint():print(total的值是,total)returntotal7.7有返回有返回值和无返回和无返回值函数函数若定义函数时没有使用return语句,会默认返回一个None,要返回一个None,可以只写一个return,但要返回具体的数值,就需要使用return后面加上需要返回的内容。所以对于函数定义来说,使用return语句可以向外提供该函数执行的一些结果。而对于函数的调用者来说,是否可以使用函数中执行的一些操作结果,就在于函数是否使用了return语句返回了对应的执行结果。在Python中,有一部分函数会产生结果,如数学函数,我们一般称这种函数为有返回值函数(fruitfulfunction);对于另一些函数,会执行一些动作,但不返回任何值,我们称这类函数为无返回值函数。当调用有返回值函数时,可以使用返回的结果做相关操作,而使用无返回值或返回None的函数时,就只能得到一个None值。7.8为什么要有函数什么要有函数为什么要有函数,定义函数的好处到底在哪里?在此对函数的好处概括如下:(1)新建一个函数,可以让我们有机会给一组语句命名,成为一个代码块,这样更有利我们阅读代码,而且这样组织后的代码更容易调试。(2)函数方法可以减少重复代码的使用,让程序代码总行数变的更少,在之后如果我们需要修改代码,只需要改很少的地方就可以。(3)将一个很长的代码片段,拆分成几个函数之后,可以对每一个函数进行单独的调试,单个函数调试通过后,再将它们组合起来形成一个完整的产品。(4)一个设计良好的函数,可以在很多程序中复用,不需要重复编写。7.9返回函数返回函数函数可以有返回值,但除了返回值,函数中是否可以返回函数?看如下函数的定义:defcalc_sum(*args):ax=0forninargs:ax=ax+nreturnax定义了一个可变参数的求和函数,该函数允许传入多个参数,最后返回所求得的和。看如下函数的定义:defsum_late(*args):defcalc_sum():ax=0forninargs:ax=ax+nreturnaxreturncalc_sum此处返回了一个函数。对于此处定义的函数,我们没有返回求和的结果,而是返回一个求和函数。7.10递归函数函数前面刚学习了在函数中返回函数,前面也学习了可以在一个函数中调用另外一个函数,但函数是否可以调用自己呢?答案是可以的,如果一个函数在内部调用自身,这个函数就称作递归函数。递归的简单定义如下:defrecurision():returnrecursion()递归函数应该满足如下条件:(1)当函数直接返回值时有基本实例(最小可能性问题)。(2)递归实例,包括一个或多个问题最小部分的递归调用。计算阶乘n!=1x2x3x.xn,用函数fact(n)表示,可以看出:fact(n)=n!=1x2x3x.x(n-1)xn=(n-1)!xn=fact(n-1)xnfact(n)可以表示为nxfact(n-1),只有n=1时需要特殊处理。fact(n)用递归的方式的函数定义如下:#!/usr/bin/python3#-*-coding:UTF-8-*-deffact(n):ifn=1:return1returnn*fact(n-1)7.11匿名函数匿名函数Python使用lambda来创建匿名函数。lambda只是一个表达式,函数体比def简单很多。lambda的主体是一个表达式,而不是一个代码块。lambda函数只包含一个语句:lambdaarg1,arg2,.argn:expression使用def语句求两个数之和示例:deffunc(x,y):returnx+y使用lambda表达式求两个数之和示例:lambdax,y:x+y一般应该在如下情况下多往匿名函数的方向考虑:(1)程序一次行使用,不需要定义函数名时,用匿名函数可以节省内存中变量定义空间。(2)如果想让程序更加简洁时,使用匿名函数可以做到。当然,匿名函数有几个规则要记住:(1)一般也就一行表达式,必须有返回值。(2)不能有return。(3)可以没有参数,可以有一个或多个参数。7.12偏偏函函数数偏函数是从Python2.5引入的一个概念,通过functools模块被用户调用。要注意,这里的偏函数和数学意义上的偏函数不一样。偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数后续的参数,除非使用关键字参数。7.13牛刀小牛刀小试经典排序之快典排序之快速排序速排序实现快速排序(quicksort)是一种分治排序算法。该算法首先选取一个划分元素;接着重排列表将其划分为三个部分:left(小于划分元素pivot的部分)、划分元素pivot、right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上;然后分别对left和right两个部分进行递归排序。划分元素的选取直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一个元素作为划分元素;划分过程根据划分元素重排列表,是快速排序算法的关键所在。快速排序算法的优点是:平均情况下的时间复杂度为O(nlogn)。快速排序算法的缺点是:它是不稳定的排序算法,最坏情况下的时间复杂度为O(n)。具体代码参考书中示例。7.14调试前面章节对调试的介绍都是基于刻意犯错进行的,本章开始将介绍一些调试的技巧。将一个大程序分解为小函数,自然而然地引入了调试的检查点。如果一个函数不能正常工作,可以从以下3点优先考虑:(1)函数获得的实参有问题,某个前置条件没有达到。(2)函数本身有问题,某个后置条件没有达到。(3)函数的返回值有问题,或者使用的方式不对。7.15问题解答解答(1)len()、count()、sum()这几个计算函数有什么区别?(2)函数在项目中使用的多吗?(3)如何灵活使用函数?7.16温故知新,学以致用温故知新,学以致用本章主要讲解的是函数定义、函数参数、变量作用域、函数递归等内容,在本章结束前,先回顾一下这些概念:(1)如何定义函数?(2)函数有哪些参数类型?(3)什么是形参和实参?(4)变量的作用域有哪些?(5)怎么使用递归函数?尝试思考并解决如下问题:1.请利用Python内置的hex()函数把一个整数转换成十六进制表示的字符串。2.请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax2+bx+c=0的两个解。练习题1.函数写出菲波那切数列。函数写出菲波那切数列。2.写个字符串,通写个字符串,通过遍遍历的方式的方式计算字符串算字符串的的长度度defjlen(str):x=0foriinstr:x+=1printu该字符串的字符串的长度度为:,xreturnxjlen(xiegezifuchuan)3.写入不定个数的字符串拼接第一个和最后一个字符串写入不定个数的字符串拼接第一个和最后一个字符串defsplicing(*args):returnargs0+args-1printsplicing(1,2,3)4.定定义一个函数,一个函数,输入不定个数的数字,返回所有数字的和入不定个数的数字,返回所有数字的和defsumofdigits(*args):x=0foriinargs:x+=ireturnxprintsumofdigits(1,2,3,4,5)5.传入多个参数,以入多个参数,以list返回返回defreturnlist(*args):li=foriinargs:li.append(i)returnliprintreturnlist(1,2,3,4)Questions&Answers
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号