循环结构-for循环

循环结构允许重复执行一行或数行代码,主要有for循环和while循环等几种形式。for循环的循环次数是确定的,而while循环的次数不确定,在满足要求时一直循环或在满足要求前一直循环。本节介绍for循环。

for循环

【Excel VBA】

利用该结构按给定的次数重复操作。语法格式为:

code.vba
For Num = First To Last [Step Inc]
  执行语句
Next [Num]

当Num位于First到Last之间时运行语句。其中,Num为迭代变量,First为Num的初值,Last为Num的终值,Step为相邻循环的步长间隔。当First比Last小时,步长为正;当First比Last大时,步长取负值。

【Python】

利用for循环按给定的次数重复操作。该循环结构的语法格式为:

code.python
for 迭代变量 in 可迭代对象
    执行语句

使用for循环遍历指定的可迭代对象,即针对可迭代对象中的每个元素执行相同的操作。可迭代对象包括字符串、列表、元组、字典等,这些对象将在后面的章节中进行介绍。

下面的例子以100为间隔,在立即窗口中输出1到500的值。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。

code.vba
Sub Test1()
  Dim intA As Integer
  For intA = 1 To 500 Step 100
    Debug.Print intA
  Next
End Sub

执行程序,在立即窗口中输出结果:

code.vba
1
101
201
301
401

【Python】

本示例的py文件存放路径为Samples\ch05\Python\sam05-007.py。其中range函数在1到500范围内每隔100取一个数,组成一个可迭代的range对象。

code.python
for num in range(1,500,100):
    print(num)

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果。

code.python
>>> = RESTART: …\Samples\ch05\Python\sam05-007.py
1
101
201
301
401

下面用for循环对1到10的整数进行累加。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。

code.vba
Sub Test2()
  Dim intI As Integer
  Dim intSum As Integer  '保存累加和
  intSum = 0
  For intI = 1 To 10
    intSum = intSum + intI  '累加
  Next
  Debug.Print intSum
End Sub

执行程序,在立即窗口中输出1到10的累加和55。

【Python】

本示例的py文件存放路径为Samples\ch05\Python\sam05-008.py。

code.python
sum=0  #初值0
num=0
for num in range(11):  #num在1到10范围内逐个取值
    sum+=num  #累加
print(sum)

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示下面的结果。

code.python
>>> = RESTART: …\Samples\ ch05\Python\sam05-008.py
55

嵌套for循环

嵌套循环结构在循环结构的内部又包含有新的循环结构,可以有两层或多层循环。下面用嵌套for循环生成九九乘法表。

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\For循环.xlsm。

code.vba
Sub Test3()
  Dim intI As Integer
  Dim intJ As Integer
  For intI = 1 To 9
    For intJ = 1 To intI
      'Trim函数去掉字符串两端的空格
      Debug.Print CStr(intJ) & "*" & CStr(intI); "="; Trim(CStr(intJ * intI)); " ";
    Next intJ
    Debug.Print
  Next intI
End Sub

执行程序,在立即窗口中输出九九乘法表。

code.vba
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

【Python】

本示例的py文件存放路径为Samples\ch05\Python\sam05-009.py。

code.python
for i in range(1,10):
    s=''
    for j in range(1,i+1):
        s+=str.format('{1}*{0}={2} ',i,j,i*j)
    print(s)

第1行用for循环的迭代变量i在1至9中逐个取值,给出各乘式的第1个因子;第2行对变量s初始化为空字符串,该变量记录一行乘式;第3行用内层for循环的迭代变量在1至i之间逐个取值,作为各乘式的第2个因子,因为在1至i之间取值,最后得到的乘法表是一个下三角的形状;第4行用字符串对象的format函数格式化组装乘式,各乘式之间用空格间隔;第5行输出当前行所有乘式。最后,九九表的所有乘式就是这样一行一行生成的。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口显示与Excel VBA代码运行结果相同的九九乘法表。

Python的for…else用法

for循环还提供了一种for…else用法,else中的语句在循环正常执行完时执行。下面判断整数7是不是质数。判断一个整数是否质数的算法是用2到这个整数的区间内的每个数去作为除数去除该整数,如果该整数能被至少一个数整除,那么它不是质数,否则是质数。

本示例的py文件存放路径为Samples\ch05\Python\sam05-010.py。

code.python
n= int(input("请输入一个数字:"))
for i in range(2,n):
    if n%i==0:
        print(str(n)+"不是质数")
		break
else:
    print(str(n)+"是质数")

第1行用input函数输入一个整数;第2至7行用一个for…else结构判断给定的整数是不是质数。只要出现n能被2至n中的某个数整除的情况就中断循环,输出它不是质数,遍历完后没有出现这种情况,输出它是质数。

在Python IDLE文件脚本窗口,在"Run"菜单中单击"Run Module"选项,则IDLE命令行窗口提示"请输入一个数字:",输入5,回车,显示下面的结果:

code.python
>>> = RESTART: …\Samples\ch05\Python\sam05-010.py
请输入一个数字:5
5是质数

再次运行,输入9,回车,显示下面的结果:

code.python
>>> = RESTART: …\Samples\ch05\Python\sam05-010.py
请输入一个数字:9
9不是质数

for循环示例-求给定数据的最大值和最小值

图5-2所示工作表中第1列给定了一组数据,现在计算该组数据的最大值和最小值。

Document Image

图5-2 求给定数据的最大值和最小值

【Excel VBA】

示例文件的存放路径为Samples\ch05\Excel VBA\求最大值和最小值-For循环.xlsm。

code.vba
Sub MaxMin()
  Dim intI As Integer
  Dim sngMax As Single  '记录最大值
  Dim sngMin As Single  '记录最小值
  Dim sngT As Single
  Dim intRows As Integer
  sngMax = ActiveSheet.Cells(1, 1).Value  '用第1个值初始化最大值
  sngMin = ActiveSheet.Cells(1, 1).Value  '用第1个值初始化最小值
  '工作表中第1列数据最大行号
  intRows = ActiveSheet.Range("A1").End(xlDown).Row
  For intI = 2 To intRows  '遍历第2到最后一个值
    sngT = ActiveSheet.Cells(intI, 1).Value  '取第intI个值
    If sngT > sngMax Then sngMax = sngT  '通过比较,计算当前最大值
    If sngT < sngMin Then sngMin = sngT  '通过比较,计算当前最小值
  Next
  ActiveSheet.Cells(2, 4).Value = sngMax  '输出结果
  ActiveSheet.Cells(3, 4).Value = sngMin
End Sub

执行程序,在工作表中输出给定数据的最大值和最小值,如图5-2所示。

【Python】

本示例的数据文件存放路径为Samples\ch05\Python\求最大值和最小值-For循环.xlsx,py文件保存在相同目录下,文件名为sam05-02.py。

code.python
import xlwings as xw  #导入xlwings包
#从constants类中导入Direction
from xlwings.constants import Direction
import os  #导入os包
#获取本py文件的当前路径
root = os.getcwd()
#创建Excel应用,可见,没有工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+\
r'\求最大值和最小值-For循环.xlsx',read_only=False)
sht=bk.sheets(1)  #获取第1个工作表
#工作表中第1列数据最大行号
rows=sht.api.Range('A1').End(Direction.xlDown).Row
max_v=sht.range('A1').value
min_v=sht.range('A1').value
#遍历数据区域的单元格
for rng in sht.range('A1:A'+str(rows)):
    tp=rng.value  #获取数据
    #如果当前值比最大值大,最大值取当前值
    if tp>max_v:max_v=tp
    #如果当前值比最小值小,最小值取当前值
    if tp<min_v:min_v=tp
#输出结果
sht.cells(2,4).value=max_v
sht.cells(3,4).value=min_v

运行脚本,在工作表中输出给定数据的最大值和最小值,如图5-2所示。