上一节讲了 while 循环,虽然 while 循环在很多情况下都有用。但是很多时候要根据情况选择,比如 有确定的循环次数和需要遍历序列(或任何可迭代的对象)时
for 循环是更合适的选择。
遍历,简单理解就是把序列(列表、字符串、元组)中的每个元素读取一遍。
比如,有一个列表 ['x', 'y', 'z']
,把每个元素打印出来:
for i in ['x', 'y', 'z']:
print(i)
上述代码将会依次打印 'x', 'y', 'z'。其实也就是 i 变量会依次赋值为 'x', 'y', 'z'。每循环一次,i 的值会改变一次,直到把列表中的每个元素读取一遍后,循环结束。
for 变量 in 序列:
执行的语句块
range 函数
在有一个序列的情况下,我们可以直接用 for 循环去遍历,如果我们没有序列的时候,又想用 for 循环怎么办呢?
在 Python 中提供了 range 函数,用来生成一个可迭代的对象,以供 for 循环使用。
在 Python 3 中 range 其实是一个类并不是一个函数,不过为了理解方便,我们暂且称作函数。
range 有下面的用法
range(stop)
# 结束值,生成一个从 0 到 stop-1 的整数序列
range(start, stop)
# 初始值,结束值。生成一个从 start 到 stop-1 的整数序列
range(start, stop, step)
# 初始值,结束值,步长。生成一个从 start 到 stop-1 的整数序列,中间的跨度值为 step
上面的文字不能理解,看下面的例子:
>>> list(range(3)) # 由于 range 返回的是一个对象,不直观,转换为 list 后观察
[0, 1, 2] # range(3) 生成的结果为 0,1,2 也就是从 0 到 3-1
>>> list(range(3,10)) # 3 到 10,也就是从 3 到 9
[3, 4, 5, 6, 7, 8, 9]
>>> list(range(3,10,2)) # 加了步长,从 3 开始,每跨度 2 再取下一个值
[3, 5, 7, 9]
>>> list(range(10, 0, -1)) # 步长为负数,那么每次会减去对应的跨度
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
使用 for 循环和 range 实现 0 到 100 的累加:
s = 0
for i in range(101): # 如果要包含100就需要写成101,因为会减一
s += i
# 5050
看下面一个练习:
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
for i in range(100, 1000):
if (i // 100 % 10) ** 3 + (i // 10 % 10) ** 3 + (i % 10) ** 3 == i:
print(i)
这就是循环的优势,你不用写什么方程式解方程式,写出条件,让 for 循环挨着拿三位数去试,试出满足条件的就打印出来。
概念就这么简单,但是我相信大家还是懵的,不知道什么时候用循环什么时候不用循环。那么多练习吧,少年!
本节练习:
- 实现输出 1 - 2 + 3 - 4 + 5 - 6 ... + 99 的和
- 求100以内的质数,质数是只能被1和自身整除且大于1的自然数。
- 打印九九乘法表。
- 有这样一种数如:12321(第一个等于最后一个,第二个等于倒数第二个,以此类推,直到中间仅剩一个数),写一个函数,传入一个整数,判断这个数是不是这种前后一样的数。注:1221不是这种数
- 《算经》中有这样一个问题:今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?(鶵[chú],同“雏”)
- 实现登录,账号名为admin,密码123,则提示“登录成功”,如果账号或者密码错误,则提示“账号名或密码错误”并允许重新输入用户名和密码,如果3次登录失败,则提示“登录失败”并退出程序。
- 一些四位数,百位数字都是3,十位数字都是6,并且它们既能被2整除,又能被 3整除,求这样的四位数中最大的和最小的两数各是几?
- 完成冒泡排序。
更多练习,请自行搜索 C语言编程入门100例,但请一定要先思考,再看答案,否则浪费一道就少一道咯。