一、嵌套循环
#嵌套循环
for x in range(5):
for y in range(5):
print(x,end="\t")
print()#print 天然换行
#【代码练习】计算1到输入的数字之间的累加总和、偶数和、奇数和
a = input("请输入一个数字:")
b = int(a)+1
sum_all = 0
sum_even = 0
sum_odd = 0
for num in range(b):
sum_all+=num
if num%2==0:sum_even+=num
else:sum_odd+=num
print("累加总合{0},偶数累加和{1},奇数累加和{2}".format(sum_all,sum_even,sum_odd))
#打印九九乘法表
for x in range (1,10):
for y in range(1,x+1):
a = x*y
print('{0}*{1}={2}'.format(x,y,a),end ='\t')
print()
#录入薪资信息代码
empNum = 0
salarySum= 0
salarys = []
while True:
s = input("请输入员工的薪资(按 Q 或 q 结束)")
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue
empNum +=1
salarys.append(float(s))
salarySum += float(s)
print("员工数{0}".format(empNum))
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarySum/empNum))
二、循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
1. 尽量减少循环内部不必要的计算
2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
3. 局部变量查询较快,尽量使用局部变量
import time
start = time.time()
for i in range(1000):
result = []
for m in range(10000):
result.append(i*1000+m*100)
end = time.time()
print("耗时:{0}".format((end-start)))
start2 = time.time()
for i in range(1000):
result = []
c = i*1000
for m in range(10000):
result.append(c+m*100)
end2 = time.time()
print("耗时:{0}".format((end2-start2)))
其他优化手段:
1. 连接多个字符串,使用 join() 而不使用 +
2. 列表进行元素插入和删除,尽量在列表尾部操作
三、使用zip()进行并行迭代
我们可以通过 zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停。
names = ("高淇","高老二","高老三","高老四")
ages = (18,16,20,25)
jobs = ("老师","程序员","公务员")
#用zip
for name,age,job in zip(names,ages,jobs):
print("{0}--{1}--{2}".format(name,age,job))
#传统方法
for i in range(3):
print("{0}--{1}--{2}".format(names[i],ages[i],jobs[i]))
四、推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合,
从而避免冗长的代码。推导式是典型的 Python 风格,会使用它代表你已经超过 Python 初学者的水平。
①列表推导式(通过推导式生成列表)
a = [x*2 for x in range(1,6)]
print(a)
for x in range(1,50):
if x%5==0:
a.append(x*2)
print(a)
cells = [(row,col) for row in range(1,10) for col in range(1,10)] #可以使用两 个循环
for cell in cells:
print(cell)
②字典推导式{}
#字典推导式
my_text = "i love you ,i love Yao,i love study"
char_count = {c:my_text.count(c) for c in my_text}
print(char_count)
#普通方法
char_count2 = {"i": my_text.count("i")}
for c in my_text:
if c in char_count2:
continue
else :
char_count2[c] = my_text.count(c)
print(char_count2)
③集合推导式{}(全是key,没有value)
④生成推导器(生成元组)
>>> (x for x in range(1,100) if x%9==0)
<generator object <genexpr> at 0x0000000002BD3048>
我们发现提示的是“一个生成器对象”。显然,元组是没有推导式的。
一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。
#生成器推导
a = (x for x in range(1,100)if x%9==0)
print(a)
for x in a:#生成器是一个可迭代对象
print(x,end=",")
print()
for x in a:
print(x,end="*")
练习一 画不同颜色的同心圆
import turtle
t = turtle.Pen()
my_colors= ("red","green","yellow","black","pink")
t.width(6)
t.speed(100)
for i in range(200):
t.penup()
t.goto(0,-i*6)
t.pendown()
t.color(my_colors[i%len(my_colors)])
t.circle(7+i*6)
turtle.done()#保留执行窗口