你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载) 您所在的位置:网站首页 python算法教程pdf百度云 你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载)

你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载)

#你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载)| 来源: 网络整理| 查看: 265

你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载)

发布时间:2021-07-10 08:49:42

点击下载

作者:王硕 等

出版社:电子工业出版社

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

你也能看得懂的Python算法书你也能看得懂的Python算法书试读:

前言

为什么要写这本书

算法是编程的核心,就像一台计算机的CPU,算法的好坏决定了一个系统的效率高低。

许多人认为学习编程就是学习最新的编程语言、技术和框架,其实计算机算法更重要。计算机语言和技术日新月异,但万变不离其宗的是算法。修炼好算法这门“内功”,再辅以新技术这些“招式”,才能独霸“武林”。这也是为什么像Google和Facebook这类大公司在面试中主要会考查算法问题的原因。

目前图书市场上关于算法的图书不少,经典的如《算法导论》。但是大多数算法图书太学术、太复杂,对于初学者来说门槛太高。学习算法本身就不是一件容易的事情,再加上复杂的场景和数学理论,会让算法的学习曲线更陡。因此本书的作者们就萌生了写一本让大家都能看懂的算法书的想法,以生动的语言把算法的思想过程写出来,让学习算法不再那么枯燥。

在本书的创作过程中,王硕老师迎来了人生的第一个宝宝小朗朗。于是几位作者就有了一个心愿,希望青少年朋友也学会算法,因此,在描述算法问题时,尽量用简单、通俗的形式表述,使青少年朋友也能看懂,也希望如此这般能够增加读者的学习兴趣。既然是学习算法,免不了要写代码,对于编程语言的选择,我们选择了Python这门简单易懂的语言作为本书的编程语言。对于初学编程的人来说,Python可以缩短学习编程语言的时间和降低学习编程的难度。

学习算法不易,且行且珍惜。

本书有何特色

1.以孩子的口吻,生动形象地讲解算法,提高趣味性

为了便于读者理解本书内容,提高学习效率,大部分问题都以孩子的口吻来讲解,以解决小朗朗的实际问题作为出发点引出问题,增加了趣味性和可读性。

2.涵盖核心算法知识点

本书涵盖双指针问题、哈希、深度优先遍历、广度优先遍历、回溯、贪心、动态规划、最短路径问题、分治等9大算法,帮助读者全面掌握核心算法的知识点。

3.以Python语言作为载体,降低学习难度

抛弃其他复杂的编程语言,本书采用简单的编程语言Python作为算法的载体,并在第1章介绍了Python语言的语法。

4.选择经典算法的经典问题,有较高的通用性

本书在简单介绍Python编程语言以后,选择了9大经典算法,重点讲解算法原理,并选择经典问题进行有针对性的练习。

5.提供完善的技术支持和售后服务

本书提供了专门的邮箱供读者咨询:[email protected]。读者在阅读本书的过程中有任何疑问都可以通过该邮箱获得帮助。

本书内容及知识体系

第1章 编程基础

掌握一门编程语言是学习算法的基础。学习编程语言是为了与计算机“交流”,只有正确的格式才能被计算机成功识别。学习编程语言的起点就是了解这门语言的语法。本书使用Python语言进行算法讲解,本章主要讲解Python 3的编程语法。

第2章 双指针问题“指针”是编程语言中的一个对象,它存储着一个内存空间的地址,计算机可以通过这个地址找到变量的值。也就是说,这个特定的地址指向这个特定的值。指针最大的优点在于它可以有效利用零碎的内存空间。

第3章 哈希算法

哈希算法又称散列函数算法,是一种查找算法,简单来说,就是把一些复杂的数据,通过某种函数映射关系,映射成更加易于查找的方式。但是这种映射关系有可能会发生多个关键字映射到同一地址的现象,我们称之为冲突。在这种特殊情况下,需要对关键字进行第二次或更多次的处理,在其他的大多数情况下,哈希算法可以实现在常数时间内存储和查找这些关键字。

第4章 深度优先遍历算法

深度优先遍历算法是经典的图论算法,它的搜索逻辑就和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解。

第5章 广度优先遍历算法

广度优先遍历算法与深度优先遍历算法类似,也是查询的方法之一,它从某个状态出发查询可以到达的所有状态。但不同于深度优先遍历,广度优先遍历算法总是先去查询距离初始状态最近的状态。

第6章 回溯算法

回溯算法可以被看作走迷宫,因为我们不知道出口在哪里,所以只能不断地深入,尝试不同的路线。一旦找到了出口便可以回溯到起点,辨清路线。

第7章 贪心算法

贪心算法就是遵循某种既定原则,不断地选取当前条件下最优的选择来构造每个子步骤的解决方案,直到获得问题最终的解。即在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做的仅是在某种意义上的局部最优解。

第8章 动态规划算法

动态规划算法将待求解问题拆分成一系列相互交叠的子问题,通过递推关系定义各子问题的求解策略,并随时记录子问题的解,最终获得原始问题的解,避免了对交叠子问题的重复求解。

第9章 最短路径问题

把地点看成节点,把道路看成边,整个地图就可看成一个加权图。计算加权图中两点间的最短路径是编程的一个重要问题,这一章我们会用以下几个算法解决这个问题:迪可斯特朗算法、Floyd算法、A*算法。

第10章 分治算法

分治算法的核心思想是把一个规模很大的问题化简为多个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的。

适合阅读本书的读者

需要全面学习算法的人员

需要学习Python的程序员

对编程算法感兴趣的人员

希望提高算法水平的程序员

专业培训机构的学员

阅读本书的建议

没有Python基础的读者,建议从第1章开始顺次阅读并演练每个实例。

有一定Python基础的读者,可以根据实际情况有重点地选择阅读各个模块和项目案例。

对于每个模块和案例,先自己思考一下实现的思路,然后再阅读,学习效果会更好。这样理解起来也会更加容易、更加深刻。第1章 编程基础

掌握一门编程语言是学习算法的基础。学习编程语言是为了与计算机“交流”,只有正确的格式才能被计算机成功识别。学习编程语言的起点就是了解这门语言的语法。本书使用Python语言进行算法讲解,本章主要讲解Python 3的编程语法,涉及的主要内容有如下几项。

变量:变量的类型和操作。

三大结构:循序、分支和循环。

数组:数组的概念和使用。

函数:函数的定义与调用。1.1 变量

变量在计算机语言中,可以用于存储不同的计算结果和不同类型的数据,或表示一个数值。变量是可变的,也就是说,它可以被重复赋值。

在认识变量之前,我们先来了解输入和输出,这样才能对程序输入数据或者看到运行后的结果。1.1.1 输出和输入

我们以非常经典的一项任务入手,在屏幕上输出一行文字:Hello World!

在Python 3中,实现这个任务只需要一行代码(Python中“#”后方的文字为注释,不影响程序运行,详细信息见1.1.5节最后)。

01  print("Hello World!")       #注意:编写程序时一定要用英文输入法!

运行程序,输出结果为:

Hello World!

在这一行程序中,print()是用于输出的函数,“Hello World!”是输出的数据。其中双引号代表数据是一个字符串。

我们再来看如何输入数据。如果想输入一个数字,把它除以2然后打印出来,该怎么做呢?下面的程序就实现了这个功能。

01  num=int(input("Enter a number:"))  #输入一个数字,用变量num存储

02  num=num/2              #把num除以2

03  print(num)               #输出num的值

运行程序,程序输出如下:

Enter a number:

此时可以输入任意整数。我们输入6,程序输出3后结束。

在程序的第一行中,新建了变量num来存储输入的数据。因为这个变量是用于存储一个数的,所以把它命名为num,这样比较直观易懂。只要遵守变量的命名法则(参见本小节末尾),那么可以随意为变量取名。

在第一行中,input()函数用于输入数据,括号内的字符串是提示语,就是在输入数据之前输出的那一段字符串。如果括号内没有内容(input()),则不输出任何文字,用户直接输入数据即可。而input()函数外面套着的int()函数则是用于把数据转换为int类型的函数。Input()函数返回的值默认为字符串类型(string),字符串不可以进行数学运算。所以,我们使用 int()函数先把字符串转换为整型(int),再进行赋值、运算并输出。数据类型的知识会在下一小节介绍。

程序中的“=”用于给变量赋值,不是相等的意思。“=”左边必须是一个可以被赋值的变量,“=”右边可以是一个常量、变量或函数的返回值等。赋值语句运行结束后,“=”左边的变量的值更新为“=”右边的值。与其他编程语言不同,由于 Python 中变量的类型不固定,所以被赋值的变量的数据类型同样可以被更新,如下面的程序所示。

运行这段程序,输出结果为abcd。

在这一小节中我们了解了输入和输出,也对变量的概念有了初步认识。为了避免程序出错,以下是变量命名的几项法则:

变量名中只能出现字母、数字和下画线,且第一个字符不能是数字。比如,可以将变量命名为name_6,但不能将变量命名为6_name。

不要把在Python中有特殊用途的单词作为变量名,如函数名。比如,目前我们接触过的print函数,如果把print作为一个变量名称,运行程序时又用到print函数,编译器就会报错。

下面就是一个例子:

01  print=0

02  print(print)       #print函数无法被调用,print被系统认为是变量名称了

一个变量名对应一个变量,不会有两个变量有相同的变量名。变量的名字最好和变量的功能相对应,比如一个存储平均数的变量,将它命名为average比命名为abcd要直观,这样不容易记错变量名称而导致程序出错。1.1.2 简单变量类型

Python语言中有5种标准变量类型:数字、字符串、列表、元组和字典,其中数字和字符串是比较简单的,本小节主要介绍这两种变量类型。

首先,我们来仔细了解一下变量的概念。每个变量都有一个独特的变量名,我们通过这个独特的变量名来调用这个变量的值。就像图1.1中的气球和牌子一样,人够不着气球,但是可以通过扯动牌子来拿到气球。每个牌子都对应一个单独的气球。牌子就相当于变量名,而气球就相当于变量存储的值。

现在我们知道了变量的概念,再来分类型介绍变量。

数字类型的变量是最常用的一种。数字类型还可以再细分,其中主要的两种类型为整型(int)和浮点型(float)。整型变量只能存储整数,浮点型变量则可以存储小数。图1.1 变量与变量名

例如:

01 num1=10

02 num2=10.0

在这两行程序中,num1表示的值是整数10,num2表示的值是小数10.0。尽管这两个变量所表示的数的大小是相等的,但它们并不是同一种类型的变量。不过,它们的类型是可以相互转换的。

01 num1=10

02 num2=10.99

03 num1=float(num1)

04 num2=int(num2)

05 print(num1,num2)

运行程序,输出结果为:

10.0 10

其中,10.0是输出时num1的值,10是输出时num2的值。在程序中,float函数的作用是把整型变量转换为浮点型变量,而int函数的作用是把浮点型变量转换为整型变量。如果你足够细心,会发现原本值为10.99的num2在转换为整型之后变为了10,它的值改变了。这是因为,在Python中,不存在四舍五入,取整指的是丢弃原值小数点后的部分。

这段程序中还涉及了关于print函数的新语法。我们使用print(num1,num2),在同一行输出两个值,中间用空格隔开。

这就好比用一个盒子搬运东西,本来盒子中有多个格子,每个格子都可以装一件物品。使用print(num1)加上print(num2)就是每次只用其中的一个格子来搬运东西,所以需要分成两次搬运;print(num1,num2)就是同时用两个格子装物品,一次搬运就可以完成。print函数就是一个有无数格子的箱子,只要需要就可以使用,如图1.2所示。图1.2 print函数与盒子

讲完了新语法,我们再来看看用旧语法输出两个变量时的情况。如果采用分两次print的方法来输出,结果会是两个数分别在两行:

......

05 print(num1)

06 print(num2)

运行程序,输出结果为:

10.0

10

第二种常用的数据类型是字符串,字符串就是一串字符。在Python中,两个单引号或者两个双引号之间的一串字符就是字符串。需要注意的是,如果你使用单引号来表示字符串,那么字符串中不能包含撇号。

01 text1="I'm a programmer."

02 text2='I'm a programmer.'

以上两种字符串定义方式中,第二种是不可行的。系统会认为前单引号和撇号中间的文本I为需要定义的字符串,后面字符则会被判定为非法字符,从而导致程序出错。

如果换一个思路,按照下面的方法来定义,就是可行的了。

01 text1="I'm a programmer."

02 text2='I am a programmer.'1.1.3 数学计算

在Python中,可以对数字进行加减乘除运算。其中,加对应“+”,减对应“-”,乘对应“*”,除对应“/”。

以下是Python 3中整数运算的程序:

01 print(5+2)

02 print(5-2)

03 print(5*2)

04 print(5/2)

运行程序,输出结果为:

7

3

10

2.5

值得注意的是,在Python 3中,如果整数相除的结果不是整数,Python会把运算的结果存储为浮点型的变量。

我们来看一看浮点数的运算:

01 print(0.3+0.2)

02 print(0.3-0.2)

03 print(0.3*0.2)

04 print(0.3/0.2)

运行程序,输出结果为:

0.5

0.09999999999999998

0.06

1.49999999999999998

在浮点数的运算中有时会出现第二个和第四个运算结果这样的情况。计算机内部表示数字的方式使得有时表示运算结果出现困难,最后输出一个十分近似真实结果的值。所有语言都存在这样的问题,不必担心。

除了简单的加减乘除运算,Python中还有许多内置函数,可以对数字进行更复杂的运算。调用这些函数比自己写出实现这些功能的代码要快得多,从而可以大大提高程序的效率,也可以提高程序的运行速度。下面我们来了解几个常用的数学函数。

pow函数是十分常见的一个函数,通常用于求一个数的n次方。

01 print(pow(4,2))

02 print(pow(4,2,3))

运行这段程序,输出结果为:

16

1

在这段程序中,我们见到了pow函数的两种使用方法。pow函数的使用格式为pow(x,y,z),如果括号内没有填写z,也就是只输入了两个数的话,pow函数的返回值为x的y次方。如果输入了z,那么pow的返回值就是x的y次方除以z的余数,即x**y%z。在Python中,符号“%”是取余的意思,“a%b”就是a除以b的余数。

在这段程序中,第一行输出的是4的2次方,也就是16;第二行输出的是4的2次方除以3的余数,也就是16/3的余数1。

接下来要了解的函数是abs函数和sqrt函数。

01 import math

02 num=-4

03 num=abs(num)

04 print(math.sqrt(num))

运行程序,输出结果为:

2.0

这段程序中使用了用于求绝对值的abs函数和用于求平方根的sqrt函数。我们知道,负数是没有实数根的,所以在开方之前先用abs函数把num变成非负数,再把abs函数返回的值赋给num,从而达到更新num的值的效果。第3行运行结束时num的值为4。

第4行使用sqrt函数来求num的平方根。由于sqrt函数不处于默认模块中,所以要先导入包含sqrt的math模块,使用import语句来导入。调用sqrt函数时,函数名前面要加上“math.”,表示它是math模块内的函数,这样计算机才能找到它。sqrt函数的返回值是浮点型。

Python中还有许多内置函数,在以后的学习和使用中你会逐渐接触到。1.1.4 位运算

位运算的符号是把变量当作二进制数来进行运算的。

在了解位运算之前,我们先来看一看二进制和我们平时使用的十进制有什么相似和不同之处,为熟练使用位运算打好基础。如果已经对二进制很熟悉,可以跳过这一段,直接进入讲解位运算的部分。

我们先以一个十进制数为例。

十进制数62,它的值由6*10+2*1组成。我们知道,在十进制数中,个位代表10的0次方,十位代表10的1次方,百位代表10的2次方,千位代表10的3次方,依此类推。从右到左,第n个数位上的数字代表着有多少个10的n-1次方相加。对于二进制数来说,这个规律也同样适用,只不过数字从满10进一位变成了满2进一位。从右到左,一个二进制数的第一位代表2的0次方,第二位代表2的1次方,第三位代表2的2次方,第四位代表2的3次方……但是,由于一个数位上的数只要满2就必须进位,所以二进制数只由1和0组成。

以十进制数62为例(如图1.3所示),把它化成一个二进制的数。图1.3 用十进制表示62

先把运算过程用图1.4表示出来:图1.4 用二进制表示62

为了方便理解,把得到的二进制的数每4个数位为一组,中间以空格隔开。

62=2*2*2*2*2+2*2*2*2+2*2*2+2*2+2

62=0011 1110

我们看到,62被拆分成多个2的不同次幂的和。每一个幂对应着二进制数的数位上的一个1,而那些没有出现的幂(比如2的0次方),它们的数位上则是0。

所以,二进制数中的1和0也可以被看作“是”和“否”,就像一个开关一样。像图1.5中一样,一个格子就是一盏灯,白色的格子代表灯亮起,亮起的灯就是“是”,代表这个数位上是一个1,也代表计算这个数的值时要加上这个数位。图1.5 用灯的亮灭表示二进制数

现在,把十进制数转换为二进制数之后,再试着把它转换回原来的十进制数,验证一下是否正确。

明白了二进制数的概念之后,再来了解位运算的各个符号。

第一个符号是按位与运算符&。参与运算的两个值中,只有对应数位上都是1时,那个数位的运算结果才是1,否则运算结果的对应数位是0。

用62和21来做一次与运算,从而更直观地理解按位与运算符。

01  a=62      #a=0011 1110

02  b=21      #b=0001 0101

03  c=a&b     #c=0001 0100

04  print(c)

运行程序,输出结果为:

20

在Python的语法中,我们不能直接定义二进制数,只能定义十进制数,但是进行位运算时,计算机会把十进制数转换为二进制数进行计算,再把二进制的结果转换为十进制数输出。

下面来分析一下这次位运算的过程。

首先,把a和b这两个数换算成二进制数,再把每一个数位对齐。

a : 0011 1110

b : 0001 0101

c : 0001 0100

进行按位与运算后,只有(从右到左的)第三位和第五位上,a和b的值都是1,其他位上要么只有一个1,要么就都是0。所以,结果c中只有第三位和第五位上是1,其他位都是0。把运算结果c换算成十进制数,就是20。

在介绍完位运算具体实现的过程之后,就可以继续了解其他的位运算符号了。

第二个位运算符号是按位或运算符|。它的运算方法和按位与类似,也是对换成二进制的两个数的对应数位进行运算。不同的是,两个数的数位中只要有一个是1,结果就是1。

我们来用运算过程来说明按位或运算符的使用方法:

01  a=62      #a=0011 1110

02  b=21      #b=0001 0101

03  c=a|b     #c=0011 1111

04  print(c)

运行程序,输出结果为:

63

同样把三个数的数位对齐,来看看按位或运算符的操作过程:

a : 0011 1110

b : 0001 0101

c : 0001 1111

只有前两个数位上,两个数都没有1存在,所以最终答案里只有前两位为0。最后,把答案c换算成十进制数,是63。

第三个运算符是按位异或运算符^。这次的运算规则是这样的:对应数位上的数不同时,结果中的数位为1;对应数位上的数相同时,结果中的数位为0。

直接来看一个应用按位异或运算符的例子:

01  a=62      #a=0011 1110

02  b=21      #b=0001 0101

03  c=a^b     #ans=0010 1011

04  print(c)

同样的,还是把三个数的每个数位对齐来观察按位异或运算的规律:

a : 0011 1110

b : 0001 0101

c : 0010 1011

从右到左,第一个、第二个、第四个、第六个数位上,要么是a的数位的值是1、b的数位的值是0,要么是a的数位的值是0,b的数位的值是1。就这样,最终答案就出现了。

最后两个运算符是左移和右移位运算符。左移运算符是。这两个运算符的作用,是把一个变量的值化成二进制之后,再把它的整体数位向左移或向右移指定的位数。比如,“a=2003)

04 print(year < 2018)

05 print(year ”“>=”“=18为True,那么计算机会执行print语句;反之,如果这条语句的结果是False,那么程序将会直接跳过if结构内的代码,然后结束程序。

我们来看第二个问题:输入一个整数,让计算机判断它是偶数还是奇数,然后输出结果。先想想,用已经学过的语法来写该怎么做呢?

这个问题用if语句也可以实现:

01  num=int(input("Enter a integer:"))

02  if num%2==0:       #如果num除以2余0

03    print("Even number")

04  if num%2==1:       #如果num除以2余1

05    print("Odd number")

运行程序,若输入的数字被2除的余数为0则输出是偶数;若输入的数字被2除的余数为1则输出是奇数。

上面这段程序中用到了两个if语句,但实际上一共只有两种情况,如果余数不为0就是1。为了使程序的运行速度更快,编写起来更方便,可以用if...else语句:

01  num=int(input("Enter a integer:"))

02  if num%2==0:        #如果num除以2余0

03    print("Even number")

04  else:             #if的判定结果不是True时执行else

05    print("Odd number")

这段程序和上一段程序的运行结果是一样的,但只需进行一次 if 判断,如果结果是 True就运行第一个代码块,如果是False就运行else里的第二个代码块。在同一个if...else语句中,关键词if和else应当有同样的缩进,而且都要以冒号结束。它们下面的代码块也应该有同样的缩进。

之前我们讲到了有两种分支时该如何编写程序,那么再来看本节最后一个问题:电影院规定,7岁以下儿童看电影免费,7岁到14岁的儿童半价,60岁及以上的老人也是半价,其他年龄的观众都是原价。如何才能输入一个人的年龄后判断他买票有什么优惠呢?(年龄小于0岁要输出错误提示。)

如果用学过的语法来做的话,要用到4个if语句。也就是说,就算在第一个if语句已经符合条件并打印出结果的情况下,也要继续进行剩余的判断。下面将要用到的if...elif...else语句就可以避免这种情况的发生并提高运行速度:

01  age=int(input("Enter your age:"))

02  if age < 0:

03    print("Error")

04  elif age >=0 and age=7 and age < 14)or age >=60:

07    print("Half price")

08  else:

09    print("Full price")

elif就是else if的缩写,就是在else中再判断一个新的条件。elif可以无限叠加,直到你想要判断的条件全部判断完。从上往下运行,只要有一个条件符合(True),计算机就会执行这个if或elif里面的程序,随后跳出整条语句。

只有所有判断语句都不符(False)时,程序才会运行到最后的else那里。如果不用考虑全部不符合的情况,else是可省略的。1.2.5 循环结构

循环结构是可以多次执行同一段代码的语句结构。在Python中有两种循环语句:while 语句和for语句。与Java和C不同,Python中没有do...while循环。

while 语句的结构如图1.11所示,在本次循环开始之前先对条件语句进行判断,如果条件语句的值为True则循环一次后再次进行判断。如果条件语句的值为False则循环结束。这里的条件语句和if中的条件语句是一样的。图1.11 while循环

正是由于 while 语句的这种特性,我们常常在不确定循环次数的时候使用它,或者把它写成死循环。此外,还可以用else在while循环条件为False时(此时循环结束)运行另一段代码。

for语句的结构如图1.12所示,从图中看它和while语句的结构相似,但其实它们的功能有很多不同。在for循环的开始,我们要提供一个范围,无论是一个数的大小范围还是一个列表;循环开始时,会用一个变量存储本次循环的值,每循环一次就更新一次这个变量的值。图1.12 for循环

当变量的值不在提供的范围内时,循环结束。for循环的这种特质,使得它成为我们要确定循环次数时的首选结构,它用于存储的变量也为我们编写程序提供了很多便利。

与分支结构相似,for循环也由关键字开头,用冒号结尾,内部的代码块也要有缩进。1.2.6 continue和break

continue和break这两条语句经常出现在循环结构中,它们的作用是让程序跳出这一次循环或是整个循环。由于这种非正常退出循环通常要满足对应的条件,所以 continue 和 break 一般需要配合if语句使用。

看一下示例程序来了解如何使用continue语句:

01  arr=[1,2,3,4,5,6,7,8,9,10]

02  for i in range(len(10))

03    if arr[i]%5==0:

04     continue

05    print(arr[i])

运行程序,输出结果为:

1

2

3

4

6

7

8

9

我们发现,在列表中能被5整除的数都没有被输出。这证明循环运行到能被5整除的数时就停下并且退出这一次循环。

把continue换成break之后,再次运行整个程序:

01  arr=[1,2,3,4,5,6,7,8,9,10]

02  for i in range(len(10))

03    if arr[i]%5==0:

04       break

05    print(arr[i])

运行程序,输出结果为:

1

2

3

4

在列表中出现第一个能被5整除的数之后,break就跳出了整个循环,所以数组后面的几个数就不会被输出了。1.2.7 应用循环结构

在简单认识了循环结构之后,本节将会把两种循环应用到实践中。

我们要做一个用于计算年龄的程序,让用户输入出生年份和今年的年份,相减得到他今年的年龄。但是,年龄不可能是负数,所以,如果出生年份大于今年的年份,要提醒用户输错了,并允许用户重新输入出生年份和今年的年份。

先自己想想该怎么做,再看正确答案:

运行程序,如果输入的出生年份一直大于今年,则计算机仍然执行 while 循环,会让用户一直重新输入,直到输入正确,随后执行else语句,然后结束。如果一开始的输入就正确,则不会执行while循环,直接进入else语句并输出结果。如果不想让while循环结束时再执行其他代码,可以删掉else语句。

接下来写一段计算一个数的阶乘的程序。数 n 的阶乘写作 n!,是这样计算的:n!=n×(n-1)×(n-2)×(n-3)×...3×2×1。让用户输入一个数(默认为正整数),然后输出它的阶乘,先自己想想这个问题用while循环该怎么实现,再看下面的例子:

在这段程序中,在while循环开始前先定义了两个变量:count和result。count用于计算次数,从1开始,每次循环都+1,记录本次循环为第几次。result用于存储计算结果,根据阶乘的计算方法,我们从1开始,一直连续乘到n,此时count=n,再加1后就大于n,此时跳出循环并输出结果。需要注意的是,代码中的“result*=count”和“count+=count”是“result=result*count”和“count=count+1”的简写。

在前面的内容中曾提到,在循环次数确定的情况下还可以使用 for 循环。下面的程序就是用for循环实现的,与上一段程序有同样的功能:

for循环的语法格式是“for 迭代变量 in 范围:”,和while循环一样有关键词、冒号和代码块的缩进。for循环默认迭代变量每次循环都+1,变量名称可以自己定义,常用的有i、j等,只在这个循环中有效(在循环外无法调用这个变量)。这条语句中的range是一个Python内置函数,用于定义一个列表,用作数据范围,在for循环中极其常用(当然也有for循环不需要用到range函数的情况,我们会在1.3节讲到)。它可以写为range(x),range(x,y)或 range(x,y,z)。range(x)的功能是定义一个从0到x-1的列表作为循环范围,range(x,y)是定义一个从x到y-1的列表,而range(x,y,z)则是在定义一个列表的同时,把默认的每次循环变量+1改成+z(z可以是负数)。

现在,你知道为什么第3行程序中定义的是range(1,n+1)而不是range(1,n)了吗?

前面还讲到,while循环可以用来编写死循环。直接来看程序:

这个程序永远不会自动结束,因为while后面的判断条件永远正确,所以程序会一直输出。

现在,再学习两条语句:continue 和 break。continue 的作用是“跳过这一次循环”,break的作用是“跳出整个循环”。

为了更加生动地展示它们的功能,我们尝试在上面的程序中加入这两条语句。

运行程序,输出结果为:

我们发现,程序并没有无限循环下去,而是在输出11后结束了;并且,5的倍数都没有被输出。这是因为,我们用if语句在for循环中设置了分支,如果count为5的倍数,则count+=1后continue,也就是回到while语句,直接进入下一次循环,不再执行代码块后面的程序。

而当count的值为12时,用break跳出这个循环,到达程序结尾,也没有执行程序块后面的程序。1.2.8 结构的嵌套

在1.2.7节中,我们看到了循环结构while和分支结构if的嵌套。本节会讲解另外两个结构互相嵌套的例子。

写一个用于做整数除法的程序,让用户输入被除数和除数。由于除数不能为0,所以,如果输入的除数是0,输出错误提示并结束程序。而除法的结果可能是整数或小数,在输出结果的同时,也输出结果的类型。

先自己思考一下该怎么做,再来看下面的程序:

这一段程序中用到了两个if...else语句,其中一条语句在另一条语句的内部,也就是说,第一个if语句的代码块中包含了另一条if语句。这样的写法同样适用于其他结构。

我们再来看第二个例子。在一所学校内,学生都有自己单独的学号,它们由两个两位数组成。但是,这些学号有一个规律:假设学号为ab cd,其中两位数ab不超过20,两位数cd不超过30,同时两位数的开头不能是0。要把所有的学号都输出该怎么做?

同样,先自己思考,再看下面的程序:

01  for i in range(10,21):

02    for j in range(10,31):

03     print(i,j)

用两个for循环嵌套起来,程序很快就写完了。这意味着,第一个for循环每循环一次,都要把第二个for循环全部走完。这比起把所有学号都自己枚举出来然后一起输出要快得多。1.3 列表

列表是Python中五种标准变量类型的一种。一系列按顺序排列的元素组成了列表,一个列表中可以包含字符、数字、字符串,甚至子列表。

在Python中,同一个列表中可以包含多个不同类型的元素,也就是说,不同类型的变量可以存在于同一个列表内,如图1.13所示。列

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

下载完整电子书

相关推荐 人类网络:社会位置决定命运(txt+pdf+epub+mobi电子书下载) 曾国藩全书:11代不衰的家族(共4册)(晚晴四大名臣的修身齐家治国平天下之道,全面展现曾国藩立德立功立言的巨著)(txt+pdf+epub+mobi电子书下载) 日本驱逐舰全史(txt+pdf+epub+mobi电子书下载) 亨利四世(上下篇)(txt+pdf+epub+mobi电子书下载) 供应商管理精益实战手册(图解版)(txt+pdf+epub+mobi电子书下载) 你也能看得懂的Python算法书(txt+pdf+epub+mobi电子书下载) 药师经(txt+pdf+epub+mobi电子书下载) 很经典很经典的食疗1000方(txt+pdf+epub+mobi电子书下载) 郎潜纪闻初笔(卷八)(txt+pdf+epub+mobi电子书下载) 智能Web算法(第2版)(txt+pdf+epub+mobi电子书下载) 项目经理应该知道的97件事(txt+pdf+epub+mobi电子书下载) 易经智慧大全集(超值金版)(家庭珍藏经典畅销书系)(txt+pdf+epub+mobi电子书下载) 清洁生产理论与审核实践(txt+pdf+epub+mobi电子书下载) 现代农村经营管理与案例(txt+pdf+epub+mobi电子书下载) 最好的我(txt+pdf+epub+mobi电子书下载) 世界少年文学经典文库:格兰特船长的儿女(txt+pdf+epub+mobi电子书下载) 写给青春的“告别之书”(套装共2册)(txt+pdf+epub+mobi电子书下载) 毛泽东思想和中国特色社会主义理论体系概论导学(txt+pdf+epub+mobi电子书下载) 高效学习有办法(txt+pdf+epub+mobi电子书下载) 散文随笔卷(txt+pdf+epub+mobi电子书下载) 最新文章 人生就要不断精进(txt+pdf+epub+mobi电子书下载) 做个心智成熟的人:人生可以不走弯路(txt+pdf+epub+mobi电子书下载) 跟谁都能聊不停:一看就能用的魔鬼搭讪学(txt+pdf+epub+mobi电子书下载) 赴美留学必知(txt+pdf+epub+mobi电子书下载) 我的男友(txt+pdf+epub+mobi电子书下载) 中国东北与东北亚古代交通史(txt+pdf+epub+mobi电子书下载) 幸福生活讲座(txt+pdf+epub+mobi电子书下载) 情商决定一生(txt+pdf+epub+mobi电子书下载) 夜雨寄北(txt+pdf+epub+mobi电子书下载) 让学生热爱学习(txt+pdf+epub+mobi电子书下载) On Dreams(txt+pdf+epub+mobi电子书下载) 我的史学人生(txt+pdf+epub+mobi电子书下载) Creo2.0完全学习手册(txt+pdf+epub+mobi电子书下载) 2018年陕西省军转干部安置考试《公共基础知识》题库【真题精选+章节题库+模拟试题】(txt+pdf+epub+mobi电子书下载) 假如给我三天光明(txt+pdf+epub+mobi电子书下载) 带出高效执行力(txt+pdf+epub+mobi电子书下载) 北史(四)(txt+pdf+epub+mobi电子书下载) 影响力的企业富豪(上册)(txt+pdf+epub+mobi电子书下载) 商界40年:逐鹿人(1999-2008)(txt+pdf+epub+mobi电子书下载) The Boats of the Glen Carrig(txt+pdf+epub+mobi电子书下载) © 2020 txtepub下载


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有