- Python王者归来
- 洪锦魁
- 1832字
- 2020-08-28 21:54:53
7-2 range( )函数
Python可以使用range( )函数产生一个等差序列,我们又称这等差序列为可迭代对象(iterable object),也可以称是range对象。由于range( )是产生等差序列,我们可以直接使用,将此等差序列当作循环的计数器。
在前一小节我们使用”for var in 可迭代对象”当作循环,这时会使用可迭代对象元素当作循环指针,如果是要迭代对象内的元素,这是好方法,但是如果只是要执行普通的循环迭代,由于可迭代对象占用内存空间,所以这类循环需要占用较多系统资源。这时我们应该直接使用range( )对象,这类迭代只有迭代时的计数指针需要内存,所以可以节省内存空间,range( )的用法与列表的切片(slice)类似。
range(start, stop, step)
上述stop是唯一必须的值,等差序列是产生stop的前一个值。例如:如果省略start,所产生等差序列范围是从0至stop-1。step的预设是1,所以预设等差序列是递增1。如果将step设为2,等差序列是递增2。如果将step设为-1,则是产生递减的等差序列。
由range( )产生的可迭代等差对象的数据类型是range,可参考下列实例。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51531.jpg?sign=1739298951-V9gl0z9wSUgwGel59C13rl6wQGlWck9i-0-9c0179d722582dbadaade5823e53247a)
下列代码用来打印range( )对象内容。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51534.jpg?sign=1739298951-wBZrG7gTOh8n3QWSVp4nHtonubCo797x-0-05458ef89b2958a88656f299cbe163a6)
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51535.jpg?sign=1739298951-stvC10QaIae3OMFxxDRx8cTKN2dp8bXO-0-aaa941c9c1cff4e43262aa28519a7c56)
上述代码执行循环迭代时,即使是执行3个循环,但是系统不用一次预留3个整数空间储存循环计数指针,而是每次循环用1个整数空间储存循环计数指针,所以可以节省系统资源。下列是range( )含step参数的应用,第1个是建立1~10的奇数序列,第2个是建立每次递减2的序列。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51538.jpg?sign=1739298951-UEhjQChf3Oc0vYsNgJREkuTKjBOw0kk5-0-ea5d38d7b9b078ea6001404a1e465c8d)
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51539.jpg?sign=1739298951-JNiTffbZBGa6h2wKHeQq5jRyylzqp5nD-0-046d72a431880d8e74a3b406fa4fae0e)
7-2-1 只有一个参数的range( )函数的应用
当range(n)函数搭配一个参数时:
range(n) # 它将产生0, 1, … , n-1的可迭代对象内容
下面来测试range( )方法。
程序实例ch7_10.py:输入数字,本程序会将此数字当作打印星号的数量。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51948.jpg?sign=1739298951-kMN0Clu0UHB67CzvAsS1sPswmtjByof9-0-95f933d51f3b461a531130cc8711b5a7)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51954.jpg?sign=1739298951-4aOjjJiFvZ0kQS0cpRgxpyVIoBVbQyC8-0-cb1a1e1b7e50ffe3484500c1516988ff)
7-2-2 有2个参数的range( )函数
当range( )函数搭配2个参数时,它的语法格式如下:
range(start, end))# start是起始值,end-1是终止值
上述可以产生start起始值到end-1终止值之间每次递增1的序列,start或end可以是负整数,如果终止值小于起始值则产生空序列或称空range对象,可参考下列程序实例。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51971.jpg?sign=1739298951-G1XMBw8P5ZUveLCGofv1hL1Ep266W2bU-0-3feb6762e95c950fc3dbaf8e18665894)
下列代码是使用负值当作起始值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51965.jpg?sign=1739298951-YcBiatPZVQaxj5sQRtO0Q0aUeNS2YKIz-0-a295d0fab95717a5426121c40b070148)
程序实例ch7_11.py:输入正整数值n,这个程序会计算从0加到n之值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51968.jpg?sign=1739298951-t50bIprAXpNinCaeKtMyBR6eH4n4lLBd-0-b69fedbeac7db777071d61898368f78e)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51977.jpg?sign=1739298951-xFGRUPzWxXSSy53axDUyPjNNz9XDMEcP-0-20397257b936e07dcb0b692d69306fae)
7-2-3 有3个参数的range( )函数
当range( )函数搭配3个参数时,它的语法格式如下:
range(start, end, step) # start是起始值,end是终止值,step是间隔值
然后会从起始值开始产生等差数列,每次间隔step时产生新数值元素,到end-1为止,下列是产生2~11间的偶数。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51959.jpg?sign=1739298951-Pd6xiWKe8ENn2wLvWNuveQrcvwg2apJJ-0-d3248f9e8ee37cf86e035813602ab988)
此外,step值也可以是负值,此时起始值必须大于终止值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51962.jpg?sign=1739298951-mA3nXTeamiyBKRgf34SPGjaTYZb9E1KT-0-3fc8f1b14f3baa3abf7db2919ae59b50)
7-2-4 活用range( )应用
程序设计时我们也可以直接应用range( ),可以产生程序精简的效果。
程序实例ch7_12.py:输入一个正整数n,这个程序会输出从1加到n的总和。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52388.jpg?sign=1739298951-hK5d34UA9FsGYbYP1yuSWs9HdeQHTpxH-0-3c608124bdcded049e37682895f570c2)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52417.jpg?sign=1739298951-2mifo1SBJPbSG2n9HRt7SjIGl4RWuci1-0-7c7d7d9683f5d51770af89214e6eb2e5)
上述程序笔者使用了可迭代对象的内置函数sum执行总和的计算,它的工作原理并不是一次预留储存1, 2, … 10的内存空间,然后执行运算,而是只有一个内存空间,每次将迭代的指针放在此空间,然后执行sum( )运算,可以增加工作效率并节省内存空间。
程序实例ch7_13.py:建立一个整数平方的列表,为了避免数值太大,若是输入值大于10,此大于10的数值将被设为10。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52420.jpg?sign=1739298951-r3KCVrBsfF85FwUJvIqpNKOLZYhpcDRw-0-deeae58f3ff16d82904971f06339d94e)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52394.jpg?sign=1739298951-TDKUomPoO3C9NBpst5R9YNOyqhAFIZSi-0-88979c02447eb7c0d54128a595ecf1bf)
对于上述代码而言,下面我们使用“**”代替乘方运算,同时第6和第7行使用更精简的方式。
程序实例ch7_14.py:用更精简方式设计ch7_13.py。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52397.jpg?sign=1739298951-ebhInoSIqs8iujKcXlxvg5q6OPUwY6kV-0-29dec6ba77dee900e723b12bef9a6456)
执行结果 与ch7_13.py相同。
7-2-5 列表生成(list generator)的应用
其实我们还可以进一步简化程序实例ch7_14.py,这个方式是将for循环与加入列表的代码浓缩为一行,对上述程序而言,可以将第5和6行浓缩为一行,在说明实例前先看基本语法。基本语法如下:
新列表 = [表达式 for 项目 in 可迭代对象]
上述语法观念是,将每个可迭代对象套入表达式,每次产生一个列表元素。如果将第5~6行转成上述语法,内容如下:
square = [num ** 2 for num in range(1, n+1)]
此外,用这种方式设计时,我们可以省略第2行(建立空列表)。
程序实例ch7_15.py:重新设计ch7_14.py,进阶列表生成的应用。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52401.jpg?sign=1739298951-AZiXH7Qq35RLJo4cJFbmkShIcWajm8rm-0-fdc64ee65b2f71d35d129f377b882cd1)
执行结果 与ch7_14.py相同。
程序实例ch7_16.py:毕达哥拉斯直角三角形(A Pythagorean triple)定义,其实这是中学数学的勾股定理,基本观念是直角三角形两边长的平方和等于斜边的平方,如下:
a2 + b2 = c2 # c是斜边长
这个定理我们可以用(a, b, c)方式表达,最著名的实例是(3,4,5),小括号是数组的表达方式,我们尚未介绍,所以本节使用[a,b,c]列表表示。这个程序会生成0~19间符合定义的a、b、c列表值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52825.jpg?sign=1739298951-qmWqCDXq0YOVvnGC7JYoBQA8oc1ZmyxQ-0-f1123eab7055480d6146e1e54134cecf)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52831.jpg?sign=1739298951-nujBUzoYnCjwKTx39tGgfaR8Lax3uf9g-0-6b7fb5f37d006b3421b135ed73508df4)
程序实例ch7_17.py:在数学的使用中会碰上下列数学定义。
A * B = {(a, b)}:a 属于A元素,b属于B元素
我们可以用下列程序生成这类的列表。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52834.jpg?sign=1739298951-JPbpu4oOhoHUEB6qOslgoukB2rj4oGM9-0-55864781602d7d78201f8b0e91c1d4d3)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52840.jpg?sign=1739298951-cmnL2VK65oGJuqYHv7aaehvzIrXsslq3-0-142cf186411b623e49ab7ba268b6a0c9)
7-2-6 打印含列表元素的列表
这个小节的观念称为list unpacking,这个程序会从每个列表中拉出color和shape的列表元素值。
程序实例ch7_18.py:简化上一个程序,然后列出列表内每个元素列表值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52844.jpg?sign=1739298951-lD3STfhNp0dDefFIHdIWmIC8jN78GO2F-0-009c958bbce44cdf6e3224edf19f2779)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52850.jpg?sign=1739298951-HtZ1ljcgrHqsgow4koNEXdzSj18gT6Rf-0-5a871b467f218ef66273ddc14b3e5864)
7-2-7 生成含有条件的列表
这时语法如下:
新列表 = [表达式 for 项目 in 可迭代对象 if 条件式]
下列是用传统方式生成1, 3, … , 9的列表:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52854.jpg?sign=1739298951-hcCoZLqYfaPr22S9PHF2U2iyP6ZeVx3C-0-6c65f2c9ba9e2298f2006acb04c786fc)
下列是使用Python精神,设计含有条件式的列表生成程序。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52857.jpg?sign=1739298951-ZSXXlVF5KfvLmEpu8xz2oL0Q7oRzY5zZ-0-90216b0b58b738d10f8f097fe3b1d3e4)