![Python王者归来](https://wfqqreader-1252317822.image.myqcloud.com/cover/412/31794412/b_31794412.jpg)
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=1738829742-zVBUC9dp9edsr3khrWLsa43CRWah4KJr-0-6201b8d6a494aa2efc0843a9d583107c)
下列代码用来打印range( )对象内容。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51534.jpg?sign=1738829742-nz1gFf2pmXD69gvwD7MMTkO6lu3S03VS-0-760f2e9ae2212b05a5bdb99dc2fe7a3e)
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51535.jpg?sign=1738829742-ZqiTWa9WIMwIHLh6A3hKPAq1X26ZiGUl-0-47c6086f8b9e1b7a806cd2febcddff5a)
上述代码执行循环迭代时,即使是执行3个循环,但是系统不用一次预留3个整数空间储存循环计数指针,而是每次循环用1个整数空间储存循环计数指针,所以可以节省系统资源。下列是range( )含step参数的应用,第1个是建立1~10的奇数序列,第2个是建立每次递减2的序列。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51538.jpg?sign=1738829742-fsYkVDIPiZT43aQSlOx93ilL4e6QsMyu-0-bff9efd88cb4d61d97e0fb6d604d8fd3)
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P90_51539.jpg?sign=1738829742-9zkurfne74LpWjqPyvRuJziwPDgncbmv-0-e15e5a9494dcbff2041489c236a024b9)
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=1738829742-uXuvYfGs3DJaToywYwBWEFtFNAgJHHRL-0-5081c99ba4a37bdd97021de18a6fd8cc)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51954.jpg?sign=1738829742-vgHWHsUJGnkpgV8R7vD9ITdxrh6zZtAv-0-1de5b7d5174fc304e230a78e7345be89)
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=1738829742-ICqXmkoXvuiwejvufhXsCIHvoAXl4s35-0-7611e5ee68b81be032c628c9c2f583a7)
下列代码是使用负值当作起始值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51965.jpg?sign=1738829742-PK6sq1VnrD4io8sYAXBqoKhUWmz4smVx-0-23723b0b4af97747c223bfce81af3e5c)
程序实例ch7_11.py:输入正整数值n,这个程序会计算从0加到n之值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51968.jpg?sign=1738829742-adtHiP6dbY5sdo8ONLBL0Cvbcew8kL09-0-d28a5467ff5bccfcc4ea2fe68e49380f)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51977.jpg?sign=1738829742-Zn6hqaU0BK6r6X9YEglKMqifgYPaAEOt-0-ebf58d4c2fe788772f1dbdbdcd59c38a)
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=1738829742-bYSwSC97UqoyqZTTkw47ZBemiPljCA1S-0-968b1e82af4be3ddbb1d75cf80e2dc55)
此外,step值也可以是负值,此时起始值必须大于终止值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P91_51962.jpg?sign=1738829742-Tx8UBGPEuYyZbhW2thsG3YTQdFDDr8gv-0-0dc28056aa443c64154f3b48963b7256)
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=1738829742-BkeQXZYnVrxYNq8iZ78djlj3ThuAxjlH-0-c68b92fd3896e123a4ae77c7578034da)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52417.jpg?sign=1738829742-2f1o4TuQNxISdmfqAFCSr4YOaS9yWn0r-0-f641c2c54180f6da16542014fe4b7bc8)
上述程序笔者使用了可迭代对象的内置函数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=1738829742-clHCwZSPu2yP63w3RUkuiSEa78aXaLeq-0-3b8222e092f22d98fd69548e9cd96248)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52394.jpg?sign=1738829742-HtBm2nhci4nreOVkZQB4PM432ln2GCXp-0-9de9077a7364e5b485ab39689e295d52)
对于上述代码而言,下面我们使用“**”代替乘方运算,同时第6和第7行使用更精简的方式。
程序实例ch7_14.py:用更精简方式设计ch7_13.py。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P92_52397.jpg?sign=1738829742-mvRjB4Nmdh9UF9v8qNgylVqz7V3nsdVR-0-cb025d8045f69920c05727445e2e6401)
执行结果 与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=1738829742-IYGOsPk7b92SJRYcrPX69MghDx6Hbvl5-0-37accb45e91d2433fc65131506468b4c)
执行结果 与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=1738829742-SxIxvY28IKWRwG6ctHfIXcmaQtTvcggL-0-01e892fe35333bf99c22c2f8a4a5df01)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52831.jpg?sign=1738829742-WHd3MVoF545XYZVpmubPahWSlWFB44lx-0-088954049d3252ad8523313bcdb491e8)
程序实例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=1738829742-3alWzaRivqJV4h4pn2Z71Z0d3QRfMxha-0-3592b0d90a46a7df10abeea08c23eb9b)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52840.jpg?sign=1738829742-xAQYF4On03apUE4I5uoQLCLQdluH1HFJ-0-e47b2b15bfb511fc58b0c0e4d5f2a7a7)
7-2-6 打印含列表元素的列表
这个小节的观念称为list unpacking,这个程序会从每个列表中拉出color和shape的列表元素值。
程序实例ch7_18.py:简化上一个程序,然后列出列表内每个元素列表值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52844.jpg?sign=1738829742-9XLUcDTmoQuiypTxdRcahGAVdWeRu637-0-1b7c43c5b59cfd9a58c7caea5e0f24cb)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52850.jpg?sign=1738829742-rrnP99Otr6aCicfsYoe19dgu4Z3CaDDO-0-d1982fa7833f3fb20599c6438ff9b988)
7-2-7 生成含有条件的列表
这时语法如下:
新列表 = [表达式 for 项目 in 可迭代对象 if 条件式]
下列是用传统方式生成1, 3, … , 9的列表:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52854.jpg?sign=1738829742-gvAlLWVCLE3xtkulaedZkDWvjB5g1IO2-0-3c8e94d74d38156cbaf0d22020aa7dde)
下列是使用Python精神,设计含有条件式的列表生成程序。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P93_52857.jpg?sign=1738829742-XW3Es1skQxkwmlv0zbPFLsi1D5pMsok0-0-f191de044325e86e757723f3157238cc)