
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,可参考下列实例。

下列代码用来打印range( )对象内容。


上述代码执行循环迭代时,即使是执行3个循环,但是系统不用一次预留3个整数空间储存循环计数指针,而是每次循环用1个整数空间储存循环计数指针,所以可以节省系统资源。下列是range( )含step参数的应用,第1个是建立1~10的奇数序列,第2个是建立每次递减2的序列。


7-2-1 只有一个参数的range( )函数的应用
当range(n)函数搭配一个参数时:
range(n) # 它将产生0, 1, … , n-1的可迭代对象内容
下面来测试range( )方法。
程序实例ch7_10.py:输入数字,本程序会将此数字当作打印星号的数量。

执行结果

7-2-2 有2个参数的range( )函数
当range( )函数搭配2个参数时,它的语法格式如下:
range(start, end))# start是起始值,end-1是终止值
上述可以产生start起始值到end-1终止值之间每次递增1的序列,start或end可以是负整数,如果终止值小于起始值则产生空序列或称空range对象,可参考下列程序实例。

下列代码是使用负值当作起始值。

程序实例ch7_11.py:输入正整数值n,这个程序会计算从0加到n之值。

执行结果

7-2-3 有3个参数的range( )函数
当range( )函数搭配3个参数时,它的语法格式如下:
range(start, end, step) # start是起始值,end是终止值,step是间隔值
然后会从起始值开始产生等差数列,每次间隔step时产生新数值元素,到end-1为止,下列是产生2~11间的偶数。

此外,step值也可以是负值,此时起始值必须大于终止值。

7-2-4 活用range( )应用
程序设计时我们也可以直接应用range( ),可以产生程序精简的效果。
程序实例ch7_12.py:输入一个正整数n,这个程序会输出从1加到n的总和。

执行结果

上述程序笔者使用了可迭代对象的内置函数sum执行总和的计算,它的工作原理并不是一次预留储存1, 2, … 10的内存空间,然后执行运算,而是只有一个内存空间,每次将迭代的指针放在此空间,然后执行sum( )运算,可以增加工作效率并节省内存空间。
程序实例ch7_13.py:建立一个整数平方的列表,为了避免数值太大,若是输入值大于10,此大于10的数值将被设为10。

执行结果

对于上述代码而言,下面我们使用“**”代替乘方运算,同时第6和第7行使用更精简的方式。
程序实例ch7_14.py:用更精简方式设计ch7_13.py。

执行结果 与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,进阶列表生成的应用。

执行结果 与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列表值。

执行结果

程序实例ch7_17.py:在数学的使用中会碰上下列数学定义。
A * B = {(a, b)}:a 属于A元素,b属于B元素
我们可以用下列程序生成这类的列表。

执行结果

7-2-6 打印含列表元素的列表
这个小节的观念称为list unpacking,这个程序会从每个列表中拉出color和shape的列表元素值。
程序实例ch7_18.py:简化上一个程序,然后列出列表内每个元素列表值。

执行结果

7-2-7 生成含有条件的列表
这时语法如下:
新列表 = [表达式 for 项目 in 可迭代对象 if 条件式]
下列是用传统方式生成1, 3, … , 9的列表:

下列是使用Python精神,设计含有条件式的列表生成程序。
