1581-洪同学

# 循环结构

### （二）for循环

for 循环通常用于可迭代对象的遍历。for 循环的语法格式如下：

for 变量 in 可迭代对象:
循环体语句

# 遍历一个列表或元组
for i in (10,20,30):
print(i)


##### 可迭代对象
1. 序列。包括：字符串、列表、元组
2. 字典
3. 生成器(iterator)
4. 迭代器（generator）
5. 文件对象
# 遍历字符串
for c in "kdjff12":
print(c)

# 遍历字典
dic = {"name":"Cairo","age":18,"job":"programmer"}

# 默认遍历字典的key
for key in dic:
print(key)

for key in dic.keys():
print(key)

# 遍历字典的value
for value in dic.values():
print(value)

# 遍历字典的整个键值对
for item in dic.items():
print(item)


##### range对象

range 对象是一个迭代器对象，用来产生指定范围的数字序列。格式为：

range(start, end [,step])


【操作】利用 for 循环，计算 1-100 之间数字的累加和；计算 1-100 之间偶数的累加和， 计算 1-100 之间奇数的累加和。

sum_all = 0
sum_even = 0
sum_odd = 0

for i in range(1,101):
sum_all += i
if i&1 == 1:
sum_odd += i
else:
sum_even += i

print("sum_all",sum_all)
print("sum_even",sum_even)
print("sum_odd",sum_odd)


### （三）嵌套循环

【操作】打印如下图案
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4

for i in range(5):
for j in range(5):
print(i,end=" ")
print()


【操作】利用嵌套循环打印九九乘法表

for i in range(1,10):
for j in range(1,i+1):
mul = i*j
print("{0}*{1}={2}".format(i,j,mul),end=" ")
print()


【操作】用列表和字典存储下表信息，并打印出表中工资高于 15000 的数据

p1 = {"name":"高小一","age":"18","salary":30000,"city":"Beijing"}
p2 = {"name":"高小二","age":"19","salary":20000,"city":"Shanghai"}
p3 = {"name":"高小五","age":"20","salary":10000,"city":"Shenzhen"}

p = [p1,p2,p3]

for i in p:
if i["salary"] > 15000:
print(i)


### （四）break语句

break语句可用于while和for循环，用来结束整个循环。当有循环嵌套时，break语句只能跳出最近一层的循环。

【操作】使用break语句结束循环

while True:
a = input("please input a character:")
if a.upper() == "Q":
print("end!")
break
else:
print(a)


### （五）continue语句

continue语句用于结束本次循环，继续下一次。多个循环嵌套时，continue也是应用于最近的一层

【操作】要求输入员工的薪资，若薪资小于 0 则重新输入。最后打印出录入员工的数量和 薪资明细，以及平均薪资

staff = 0
staff_salary = []
while True:
salary =input("please input the salary :")
if salary.upper() == "Q":
print("exit!")
break
salary = float(salary)
if salary < 0:
continue
else:
staff += 1
staff_salary.append(salary)

print("Staff number is ",staff)
print("Staff salary details:",staff_salary)
print("Staff average salary",sum(staff_salary)/staff)


### （六）else语句

while、for循环可以带一个else语句（可选）。如果for、while语句没有被break语句结束，则会执行else子句，否则不执行。语法格式如下：

while 条件表达式:
循环体
else:
语句块

for 变量 in 可迭代对象:
循环体
else:
语句块


### （七）循环代码优化技巧【极其重要】

1. 尽量减少循环内部不必要的计算
2. 嵌套循环中，尽量减少内层循环的计算，尽可能外提
3. 局部变量查询较快，尽量使用局部变量
4. 连接多个字符串，使用join()而不使用+
5. 列表进行元素插入和删除，尽量在列表尾部操作
#循环代码优化测试
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)))


### （八）zip并行迭代

names = ("Cairt","Quiin","Lias","Baly")
ages = (18,29,35,23)
jobs = ("teacher","programmer","manager")

for item in zip(names,ages,jobs):
name,age,job = item
print("{0}--{1}--{2}".format(name,age,job))

for name,age,job in zip(names,ages,jobs):
print("{0}--{1}--{2}".format(name,age,job))


# 推导式创建序列

### 1. 列表推导式（最常用）

[表达式 for item in 可迭代对象 ]
[表达式 for item in 可迭代对象 if 条件判断]

# 可以使用两个循环
cells = [(row,col) for row in range(1,10) for col in range(1,10)]


### 2. 字典推导式

 {key_expression : value_expression for 表达式 in 可迭代对象}


【操作】统计文本中字符出现的次数

my_text = "i love you, i love sxt, i love Cairo"
char_count = {c:my_text.count(c) for c in my_text}
print(char_count)


### 3. 集合推导式

 {表达式 for item in 可迭代对象 }
{表达式 for item in 可迭代对象 if 条件判断}


### 综合练习

【操作】绘制多个同心圆

import turtle
p = turtle.Pen()
my_colors = ("red","green","yellow","black")

p.width(4)
p.speed(1)

for i in range(10):
p.penup()
p.goto(0,-i*10)
p.pendown()
p.color(my_colors[i%len(my_colors)])
p.circle(15+i*10)

turtle.done()


【参考】控制颜色的方法

my_colors = ("red","green","yellow","black")
p.color(my_colors[i%len(my_colors)])


【操作】绘制18*18棋盘

# 第五章 函数用法和底层分析

• 函数是可重用的程序代码块。函数的作用，不仅可以实现代码的复用，更能实现代码的一致性。一致性指的是，只要修改函数的代码，则所有调用该函数的地方都能得到体现
• 在编写函数时，函数体中的代码写法和我们前面讲述的基本一致，只是对代码实现了封装，并增加了函数调用、传递参数、返回计算结果等内容。

### （一）函数简介

1. 一个程序由一个个任务组成；函数就是代表一个任务或者一个功能
2. 函数是代码复用的通用机制。
##### Python函数的分类
1. 内置函数
前面使用的str()/list()/len()等这些都是内置函数，可以直接拿来使用
2. 标准库函数
可以通过import导入库，然后使用其中定义的函数
3. 第三方库函数
python社区也提供了很多高质量的库，下载安装这些库之后，也是通过import语句导入，然后可以使用这些第三方库的函数
4. 用户自定义函数

### （二）函数的定义和调用

Python 中，定义函数的语法如下：

def 函数名 ([参数列表]) :
'''文档字符串'''
函数体/若干语句


1. 我们使用 def 来定义函数，然后就是一个空格和函数名称；
(1) Python 执行 def 时，会创建一个函数对象，并绑定到函数名变量上
2. 参数列表
(1) 圆括号内是形式参数列表，有多个参数则使用逗号隔开
(2) 形式参数不需要声明类型，也不需要指定函数返回值类型
(3) 无参数，也必须保留空的圆括号
(4) 实参列表必须与形参列表一一对应
3. return 返回值
(1) 如果函数体中包含 return 语句，则结束函数执行并返回值；
(2) 如果函数体中不包含 return 语句，则返回 None 值
4. 调用函数之前，必须要先定义函数，即先调用 def 创建函数对象
(1) 内置函数对象会自动创建
(2) 标准库和第三方库函数，通过 import 导入模块时，会执行模块中的 def 语句

Vieu3.3主题

Q Q 登 录