7.for语句详解与应用
上一节我们介绍了while语句,break与continue语句,这来介绍另一种循环方式:for;
随着知识点增加,我们可以做的事情也越来越多。
主要内容:
- 小目标:掌握for语句
- 主要内容:for, break, continue,逻辑思维强化
1.for语句
for语句主要用来遍历可迭代对象;
字符串,列表等都属于可迭代对象;
1.1 for语句基本语法
基本语法:
# for, in 为关键字
for val in iters:
代码1
for语句主要用于在迭代对象中取数据,直到取完。
基本理解:
2:将取出对象赋值给item,
3:执行代码1
4:继续重复1,直到items中值取完。
来看一个例子:
s = '123456789'
for val in s:
print(val, end=',')
输出结果:
1,2,3,4,5,6,7,8,9,
1.2 for语句处理异常
问题:for遍历时候,如何结束?
- 遍历结束,会触发异常:StopIteration;
- for语句处理异常,然后结束;
来看一个例子:
#iter方法:字符串转成iterator;
items = iter('12')
#使用next函数,每次取一直元素
print(next(items))
print(next(items))
#2个元素取完,在次获取报异常
print(next(items))
结果:
1
2
5 print(next(items))
6 #2个元素取完,在次获取报异常
----> 7 print(next(items))
StopIteration:
使用for循环:
for item in iter('12'):
print(item)
结果:
1
2
对比可知:for循环处理StopIteration异常。
1.3 for与break,continue使用
for与break,continue使用与while类似,直接来看一个例子;
给定一个字符串,打印到终端,并将非数字字符替换成'*';
例如:'abc1b23c3',输出:'***1*23*3';
分析:如何判断字符是否为数字,可以使用比较运算符,先来做一个小测试:
c = '2'
print("c>='1':",c >= '1')
print("c<='9':",c <= '9')
print("'a'<='9'", 'a' <='9')
结果:
c>='1': True
c<='9': True
'a'<='9' False
通过测试可以发现:使用比较可以知道字符是否在['1','9']之间。
直接上代码:
s = 'abc1b23c3'
for val in s:
if val >='1' and val <= '9':
print(val, end='')
continue
print('*', end='')
再来看另一个例子:
给定字符串,打印字符串到终端,如果遇到数字字符串,后面内容不打印;
例如:'abc1b23c3',输出结果:abc;
实现思路:
- 遍历字符串;
- 判断字符是否是数字,如果是数字,跳出循环;
- 打印当前字符;
代码实现:
s = 'abc1b23c3'
for val in s:
if val >='1' and val <= '9':
break
print(val, end='')
结果:abc
有读者朋友会有疑问:字符串中有很多相应的方法,为什么不使用?
因为在开始,我们还是以锻炼思维为主,到了后面字符串时候,会有其他更烧脑的案例等着你。
1.4 for与else配合使用
for与else同while类似:
- for循环中使用break结束循环,不执行else对应的代码;
- for循环正常结束,执行else对应的代码;
2. range与enumerate
range与enumerate是Python中常用的两个函数,我们来详细介绍;
2.1 range函数:
range函数用于产生range对象,对象中的每个元素为数字;
可以使用help查看range函数说明:
range(stop) -> range object
range(start, stop[, step]) -> range object
参数说明:
- start为初始值;
- stop为结束值,最大值为stop-1;
- step为步进值,[, step]这种参数为可选参数;
函数说明:
- 只有stop, 产生:0,1,2...stop-1数字;
- 有start与stop,产生:start,start+1,start+2, ..., stop-1数字;
- 如果有step,产生:start, start+step, start+2*step, ..., stop-1数字;
range对象可以使用for循环遍历,几个例子:
- 产生0~9数字:
#最大值为10-1
for i in range(10):
print(i, end=' ')
结果:
0 1 2 3 4 5 6 7 8 9
- 产生2~20之间偶数:
#最大值为21-1
for i in range(2, 21,2):
print(i, end=' ')
结果:
2 4 6 8 10 12 14 16 18 20
2.2 enumerate函数
enumerate将可迭代对象转成enumerate对象,函数原型:
enumerate(iterable, start=0)
enumerate对象内容:iterable索引与索引对应的元素:
(0, seq[0]), (1, seq[1]), (2, seq[2]), ...
如果指定start,enumerate对象内容:
(0+start, seq[0]), (10+start, seq[1]), (20+start, seq[2]), ...
来个一个例子:
for x in enumerate('123'):
print(x)
结果:
(0, '1')
(1, '2')
(2, '3')
换一种方式遍历:
for index, val in enumerate('123'):
print(index, val)
结果:
0 1
1 2
2 3
分析:
赋值方式:index,val = (v1,v2)
结果:index为索引,value为索引对应的值
3. 练习:
找出,1~2000之间闰年
实现思路:
- 产生1~2000数字;
- 闰年判断方法;
代码实现:
start, stop = 1, 2001
#年份范围:[1, 2000]
for year in range(start, stop):
#闰年判断条件
if year % 4 ==0 and year % 100 or year% 400 == 0:
print(year, end=' ')
如果这样做,这个太简单了,我们把年份加大,并加上程序执行时间:
import time
ts = time.time()
start, stop = 1, 20000001
#年份范围:[1, 2000]
for year in range(start, stop):
#闰年判断条件
if year % 4 ==0 and year % 100 or year% 400 == 0:
#print(year, end=' ')
#pass是空语句,为了避免print干扰,我们将其注释掉
pass
print(time.time()-ts)
结果,执行时间:4.505320072174072;
如何进行优?能不能将效率提高10倍?挑战下自己。
分析:
- 闰年规则:两个闰年相差4;
- 找到第一个闰年:y;
- 根据range参数规则,设置:y,stop, step=4;
我们来看代码实现:
import time
ts = time.time()
start, stop = 1, 20000001
#年份范围:[1, 2000]
for year in range(start, stop):
#闰年判断条件
if year % 4 ==0 and year % 100 or year% 400 == 0:
#如果找到第一个闰年
#起始值为year,结束值为stop
#step设置为4
for y in range(year, stop, 4):
pass
#print(y)
#注意,找到第一个闰年之后,跳出循环,不在继续查找;
break
print(time.time()-ts)
结果:0.25073933601379395,在同一个电脑测试,效率提升20倍+;
总结:编程语言中的逻辑单独理解都是比较简单的,但是如何在实际学习与工作实践中用好,这个是需要下功夫的。
编程初级阶段学习目标:
- 快速掌握语言语法及相关规则;
- 提升逻辑思维,问题分析能力,编码能力;
总结:
- for基本语法与使用;
- range函数与enumerate函数介绍与使用;
- 通过闰年案例,希望读者朋友能够对编程有新的认识。