循环
for循环
常用语遍历可迭代对象(字符串、列表、元组、字典、集合、range对象等)
for x in range(10):
print(x) # 0 1 2 3 4 5 6 7 8 9
for x in dict1:
print(x)
for x in dict1.keys(): # 跟上一个一样,都是打印字典中的键对象
print(x)
for x in dict1.items(): # 每个键值对是一个元组,逐个打出元组
for x in "abc":
print(x) # a b c
range对象
range对象是一个迭代器对象
range(start,end[,step])
包头不包尾
step默认为1
操作:用for循环,计算1-110正整数累加和;计算1-100之间偶数累加和;计算1-100之间奇数累加和
sum_all = 0
sum_odd = 0
sum_even = 0
for x in range(101):
sum_all += x
if x%2==1:
sum_odd += x
else:
sum_even += x
# for循环中用range比while循环简单
print("总和是{0},奇数和是{1},偶数和是{2}"。format(sum_all, sum_odd, sum_even))
嵌套循环
一个循环体里套另一个循环,也叫多重循环
打印:
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
for i in range(5):
for m in range(4):
print(i, end="\t")
print()
自己的理解:大循环是换行,小循环都是打印行内容,打印的东西变动就用本循环的“变量”,打印的东西不变就用上一个循环的“变量”
for m in range(1,10):
for n in range(1,m+1):
print("{0}*{1}={2}".format(m,n,m*n), end='\t')
print()
tb = []
r1 = dict(name="Aaron",salary=30000,city="BJ")
r2 = dict(name="Bill",salary=20000,city="SZ")
r3 = dict(name="Catherine",salary=10000,city="SH")
tb = [r1,r2,r3]
for x in tb:
if x.get("salary")>15000:
print(x)
break语句
用于while和for循环中
用来结束整个循环
嵌套循环中,只能结束最近一层的循环
continue语句
用于循环中,结束本循环,继续下一次
嵌套循环中,只能结束最近一层的循环
例子:输入值,打印,如果输入值不符合规则,就重新开始continue,如果主动退出,就break
else语句
Python中有,别的语言很多没有
while和for循环可以带一个else(这也是为什么我有点搞不清选择结构和循环结构…)
循环中的else 如果没有被break,就会执行else
注意:else要跟while对其,不要缩进
我的小结:else就是顺利结束循环的一个标志
我的小结:break 和 continue都是某种程度中止循环
我的小结:循环体的思路:
- 首先设定需要的变量
- while、for 循环条件
- 循环动作(不会受中止条件影响的)
- 中止情况:break、continue
- 循环动作(会受中止条件影响的)
- else: 中止后不发生的情况
循环代码优化技巧
一定要斤斤计较性能!
- 编写循环时的原则:
- 减少内部循环的不必要计算,能往外提就往外提
- 尽量使用局部变量
- 其它优化:
- 字符串拼接用join()不要用加号
- 列表进行元素插入、删除尽量在尾部
zip()并行迭代
zip()对多个序列进行并行迭代,在最短序列用完的时候会停止
# 测试zip()并行迭代
for i in [1,2,3]:
print(i)
names = ("gao1","gao2","gao3","gao4")
ages = (18, 16, 20, 22)
jobs = ("teacher","scientist","singer","dancer")
for name, age, job in zip(names, ages, jobs):
print("{0}-{1}-{2}".format(name, age, job))
for i in range(len(names)):
print("{0}-{1}-{2}".format(names[i], ages[i], jobs[i]))
推导式创建序列
- 列表推导式:
list1 = [x*2 for x in range(10) if x%2==0]
- 字典推导式:
dict1 = {k:s.count(k) for k in s}
- 集合推导式:
set1 = {x*2 for x in range(10) if x%2==0 }
- 跟列表、字典基本没有区别啊
- 生成器推导式:
gnt = (x for x in range(10))
- 生成的是一个生成器,只能用一次数据就没啦