循环结构
# 循环结构
## 概述
当某段代码需要重复执行时,使用循环结构。Python 中有两种构造循环的方式:`for-in` 和 `while`。
## for-in 循环
适用于**已知循环次数**的场景:
```python
for i in range(3600):
print('hello, world')
time.sleep(1)
```
### range() 用法
| 表达式 | 说明 |
|--------|------|
| `range(101)` | 0 到 100(不包含 101) |
| `range(1, 101)` | 1 到 100 |
| `range(1, 101, 2)` | 1 到 100 的奇数,步长为 2 |
| `range(100, 0, -2)` | 100 到 1 的偶数,倒序 |
### 累加求和
```python
# 1到100整数求和
total = 0
for i in range(1, 101):
total += i
print(total) # 5050
# 1到100偶数求和(用步长)
print(sum(range(2, 101, 2))) # 2550
```
> **惯例**:循环变量如果不需要使用,命名为 `_`:
```python
for _ in range(3600):
print('hello, world')
```
## while 循环
适用于**循环次数不确定**的场景:
```python
total = 0
i = 1
while i <= 100:
total += i
i += 1
print(total) # 5050
```
## break 和 continue
- `break`:跳出整个循环
- `continue`:跳过本次循环,进入下一轮
```python
# 找出第一个能整除x和y的数(即最大公约数)
for i in range(x, 0, -1):
if x % i == 0 and y % i == 0:
print(f'最大公约数: {i}')
break
# 1到100偶数求和(用continue)
total = 0
for i in range(1, 101):
if i % 2 != 0:
continue
total += i
```
## 嵌套循环
循环内部可以再放循环,用于二维问题:
```python
# 打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{i}×{j}={i*j}', end='\t')
print()
```
## 应用实例
### 实例1:判断素数
```python
num = int(input('请输入正整数: '))
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
print(f'{num}是素数' if is_prime else f'{num}不是素数')
```
> **提示**:只需检查到 √n 即可,因子总是成对出现。
### 实例2:最大公约数(欧几里得算法)
```python
x = int(input('x = '))
y = int(input('y = '))
while y % x != 0:
x, y = y % x, x
print(f'最大公约数: {x}')
```
### 实例3:猜数字游戏
```python
import random
answer = random.randrange(1, 101)
counter = 0
while True:
counter += 1
num = int(input('请输入: '))
if num < answer: print('大一点')
elif num > answer: print('小一点')
else:
print('猜对了!')
break
print(f'你一共猜了{counter}次')
```
## 总结
- 循环次数确定用 `for-in`,不确定用 `while`
- `break` 终止循环,`continue` 跳过本次循环
- 嵌套循环注意缩进和执行顺序
- 算法:穷举法(逐一尝试)、欧几里得算法(辗转相除)