流程控制语句
编程语言一般有三大执行顺序: 顺序执行, 选择执行, 循环执行
顺序执行
程序自上而下逐句执行, 即为顺序执行
选择执行
语法:
```
if 条件1:
执行代码块
elif 条件2:
执行代码块
...
else:
执行代码块
```python
规则:
-
执行第一个条件为True的分支语句, 如果条件都为False, 那么执行else里的代码块
-
elif和else是可不写的, 但每一个elif和else都要存在if与之匹
循环结构
while循环
语法:
```
while 条件:
代码块
else:
代码块
```
规则:
- 如果条件满足, 则while内的代码块会一直执行, 直到条件不满足, 或者执行break
- else是可选的, 如果while未被break则会执行该段代码
for循环
语法:
for x in 可迭代对象: 代码块 else: 代码块
for会遍历可迭代对象的所有元素, 如果执行中未遇见break, 那么for执行完成后, 会执行else里的代码块
其他流程控制语句
- break
可以直接跳出自己所在的循环 - continue
结束本次循环, 回到while或for语句开始新的循环 - assert
断言: assert 条件
规则: 如果条件为True, 那么会继续执行, 如果为False, 那么程序直接抛出异常AssertionError - pass
什么都不做, 相当于占位符
ranage()函数
函数: range([start], end, [step=1])
解释: 生成一个从start(默认为0), 到end的步长为step(默认为1)的数字序列(可迭代对象), 可以用于for遍历
enumerate()函数
函数: enumerate(sequence, [start=0])
作用: 生成一个元组集合, 每个元组有两个元素, 第一个元素是该元素的下表, 第二个元素是其本身, 可以同个该方法获得元素下标
推导式
生成一个集合的简写形式
列表推导式
语法: [expr for value in collection [if condition]]
作用: 生成一个列表, 该列表内含有集合collection内(满足条件)的元素
元组推导式
- 与列表推导式相同
- 元组需要使用()包裹
字典推导式
语法:{key_expr: value_expr for value in collection [if condition]}
- key_expr和value_expr是有关(也可以无关)value的表达式
- 通过取出collection中(满足条件的)元素, 来生成一个字典
集合推导式
- 与列表推导式相同
- 集合需要用{}包裹
- 由于集合里不会出现重复元素, 所以推导式里的出现的重复元素不会加入到集合中
练习题
def demo():
i = 1500
while i <= 2700:
if i % 7 == 0:
print(i)
i += 5
- 方法1: 暴力循环
def race(v1, v2, t, s, l):
# 这里判断兔子在第一次休息之前, 是否到达终点
t1 = t / (v1 - v2)
if t1 * v1 >= l:
print("R")
print(l / v1)
# 由于每次兔子都会在超过一定距离在休息一段时间, 在反超, 此种情况循环往复, 直至达到终点
i = 1
while True:
t1 += (s + ((v2 * s) - t) / (v1 - v2))
# 如果乌龟先到
if t1 * v2 > l:
print("T")
print(l / v2)
break
# 如果双方同时到
if t1 * v2 == l:
print("D")
print(t1)
break
t1 += (t / (v1 - v2))
# 如果兔子先到
if (t1 * v2) + t > l:
print("R")
print(l / v1 + i * s)
break
# 双方到没到, 进入下次循环
i += 1
方法2:
def race(v1, v2, t, s, l):
# len = v2 * ((s * v2) / (v1 - v2) + t / v2)
# 如果兔子休息完, 乌龟都没能追上兔子
if t > s * v2:
print("R")
len1 = (t / (v1 - v2)) * v1
len2 = s * v2 / (v1 - v2) * v1
t1 = t / (v1 - v2)
# 如果兔子第一次休息前, 就到达终点
if len1 > l:
print(l / v1)
# 由于每个周期兔子都会移动相同距离, 直致到达终点, 可以利用求模与求余计算时间
else:
i = (l - len1) % len2
j = (l - len1) // len2 + 1
print((i / v1) + t1 + j * s)
# 如果乌龟能追上了兔子
else:
# 因为一个周期内只存在三种情况
# 1. 兔子在前, 乌龟在后
# 2. 乌龟在前, 兔子在后
# 3. 兔子追上乌龟, 开始新的周期
# 因此可以根据周期性, 对总路段求模, 得到的路段如果在某个区间, 则可推出兔子或则乌龟或者两者胜利, 可以利用地板除计算胜利者所用时间
len = (s * v1 / (v1 - v2)) * v2
len1 = (t / (v1 - v2) + t / v2) * v2
len2 = len - len1
i = l % len
j = l // len
if i == 0:
print("D")
print(l / v2)
elif i <= len1:
print("R")
print(l / v1 + j * s)
else:
print("T")
print(l / v2)