python基础-流程控制之循环

range()生成整数序列,支持自定义范围和步长,惰性计算节省内存。while和for-in循环实现重复操作,需注意死循环和迭代对象。break/continue控制循环流,else在无break时执行。嵌套循环需谨慎管理break/continue。

Posted by Hilda on June 25, 2025

1.range()函数的使用

range() 用于生成一个整数序列,常用于循环中。

语法:range(start, stop, step),其中:

  • start:起始值(包含,默认 0)。
  • stop:结束值(不包含)。
  • step:步长(默认 1)。

返回一个 range 对象(返回值是一个迭代器对象, 如果需要查看里面的内容,需要用list转换为列表),可通过 list(range()) 转换为列表。


创建range的3种方式:

image-20250625162930956

注意range是左闭右开的。

range类型的优点 :不管range对象表示的整数序列有多长,所有range对象占用的内存空间都是相同的,因为仅仅需要存储start,stop和step,只有当用到range对象时,才会去计算序列中的相关元素

in与not in 判断整数序列中是否存在(不存在)指定的整数


例如:

1
2
for i in range(5):
    print(i)

输出0-4的数字

1
2
for i in range(1, 7, 2):
    print(i)

输出1,3,5

特别注意:

  • stop 值不包含在序列中,容易误以为包含。
  • step 可以为负数,表示逆序,但需确保 start > stop。
  • range() 生成的是惰性序列,内存效率高,但直接打印需转换。

看一些特殊的例子:

1
2
3
4
l = list(range(15, 2, -3))
print(l)  # 输出:[15, 12, 9, 6, 3]

print(9 in range(15, 2, -3)) # True

2.while循环

反复做同一件事情的情况,称为循环。循环结构的流程图如下所示:

image-20250625164531057

循环的分类

  • while
  • for -in

语法结构

1
2
   while  条件表达式:
            条件执行体(循环体)

选择结构的if与循环结构while的区别:If是判断一次,条件为True执行一行;while是判断N+1次,条件为True执行N次

例如求0-4的累加和:

1
2
3
4
5
# 求0-4的累加和
sum = 0
for i in range(0, 5):
    sum += i
print("0-4累加和是:", sum)

或者用while写:

1
2
3
4
5
6
j = 0
sum_ = 0
while j < 5 :
    sum_ += j
    j += 1
print("0-4的累加和是:", sum_)

四步循环法

  • 初始化变量
  • 条件判断
  • 条件执行体(循环体)
  • 改变变量

while循环的执行流程

image-20250625164849538

特别注意:while必须有修改条件的语句(如 j += 1 ),否则进入死循环。

另外while与for in 可与 break 和 continue 配合使用。

嵌套 while 时,变量作用域混乱,需明确区分。

练习:while循环计算1-100(不包含100)之前的偶数和:

1
2
3
4
5
6
7
i = 1
sum = 0
while i < 100:
    if i % 2 == 0:
        sum += i
    i += 1
print("1-100之间的偶数和为:", sum)

image-20250625165511167

如果要求奇数和:注意 i % 2输出有布尔值,可以用这个作为条件来判断

1
2
3
4
5
6
7
i = 1
sum = 0
while i <= 100:
    if  i % 2 :
        sum += i
    i += 1
print("1-100之间的奇数和为:", sum)

3.for-in循环

in表达从(字符串、序列等)中依次取值,又称为遍历

for-in遍历的对象必须是可迭代对象

for-in的语法结构

1
2
for  自定义的变量  in 可迭代对象:
      循环体

for-in的执行图 :

image-20250625164925885

循环体内不需要访问自定义变量,可以将自定义变量替代为下划线

特别注意:

  • for in 适合遍历固定序列,内部隐式管理索引
  • for in 可与 range() 结合使用生成索引。
  • for in 支持解包迭代(如 for x, y in [(1, 2), (3, 4)])。
  • 修改迭代对象(如列表)会导致未定义行为,建议复制或使用新列表。

一些例子:

1
2
for _ in range(1, 5):
    print("俺老孙来也")

image-20250625170921615

1
2
for x, y in [(1, 2), (3, 4)]:
    print(x, y, x + y)

image-20250625171037455

练习:100到999之间的水仙花数

水仙花数:例如153是水仙花数,因为3*3*3+5*5*5+1*1*1=153

1
2
3
4
5
6
for i in range(100, 1000) :
    b1 = i % 10
    b2 = i // 10 % 10
    b3 = i // 100 % 10
    if b1 ** 3 + b2 ** 3 + b3 ** 3 == i :
        print(i, "是水仙花数")

image-20250625171603903

4.break、continue与else语句

(1)break

用于结束循环结构,通常与分支结构if一起使用

image-20250625171814289

比如:键盘录入密码(正确密码是1234),只能最多录入3次,正确就退出循环:

1
2
3
4
5
6
7
for i in range(3) :
    pwd = input("请录入密码:")
    if pwd == "1234" :
        print("录入密码正确")
        break
    else:
        print("录入密码失败")

(2)continue

用于结束当前循环,进入下一次循环,通常与分支结构中的if一起使用

image-20250625172206597

(3)else语句

与else语句配合使用的三种情况

image-20250625172454242

1
2
3
4
5
6
7
8
9
for i in range(3) :
    pwd = input("请输入密码")
    if pwd == "1234":
        print("密码输入正确")
        break
    else:
        print("密码输入错误")
else:
    print("三次密码都输入错误,请5分钟后尝试!")

image-20250625172922523

如果执行了break,是不会执行和while/for in并列的else的:

image-20250625173016930

5.嵌套循环

循环结构中又嵌套了另外的完整的循环结构,其中内层循环做为外层循环的循环体执行。

image-20250625173041662

例如现在打印9*9乘法表:

1
2
3
4
5
6
7
8
ans = ''
for i in range(1, 10):
    for j in range(1, 10):
        if i >= j:
            ans += str(i) + "*" + str(j) + "=" + str(i * j) + "\t"
    ans += "\n"

print(ans)

image-20250625173453132

或者:注意控制条件for j in range(1, i)

1
2
3
4
5
6
7
ans = ''
for i in range(1, 10):
    for j in range(1, i):
        ans += str(i) + "*" + str(j) + "=" + str(i * j) + "\t"
    ans += "\n"

print(ans)

再例如输出一个三行四列的矩形:

1
2
3
4
5
for i in range(3):
    for j in range(4):
        # 不换行输出
        print("*", end="\t")
    print() # 为了换一行

image-20250625173850795

二重循环中的break和continue

二重循环中的break和continue用于控制本层循环

image-20250625174150904

break 立即终止包含它的最近一层循环,并跳出该循环体的执行。

在多重循环中,break 只影响当前嵌套层,不会终止外层循环。

如果需要终止外层循环,可以通过标记或标志变量实现:

例如:

1
2
3
4
5
6
7
8
9
10
flag = False
for i in range(3):
    for j in range(3):
        if j == 1:
            flag = True
            break
        print(f"i={i}, j={j}")
    if flag:
        continue
    print(f"外层 i={i} 结束")

可以尝试猜测下这段代码输出什么。

1
2
3
i=0, j=0
i=1, j=0
i=2, j=0