一、嵌套循环

#嵌套循环
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()#保留执行窗口