条件循环结构
一、 条件语句
Python使用缩进而不是大括号来标记代码块边界,因此要注意书写格式。
1. if 语句
if condition:
print('True')
当 if 后的条件为真时才执行后面的操作,否则执行下一个代码块。
if 语句可嵌套
if condition1:
if condition2:
print('Right')
2. if - else 语句
if condition:
print('True')
else:
print('False')
3. if - elif - else 语句
elif 即 else if,可用于判断多个表达式
if condition1:
print('a')
elif condition2:
print('b')
elif condition3:
print('c')
else condition4:
print('d')
4. assert 关键词
当 assert 后的条件为 False 时,程序自动崩溃并抛出异常AssertionError。可作为检查点,只有当条件为真时程序才能正常工作。
assert 1>2
# AssertionError
二、循环语句
1. while 循环
while 后可跟布尔表达式、数值、str、list序列等,当 while 后的条件为真时执行循环体,否则不执行循环体。
以下情况可视为真:
布尔表达式为真、数值不为0 或 序列长度非零
num=3
while num>0:
print(num)
num=num-1
# 3
# 2
# 1
2. while - else 循环
当 while 循环正常执行完的情况下,执行 else 内的操作,若 while 循环在执行中遇到跳出循环语句(如:break),则不执行 else 的内容。
while condition1:
do...
else:
do...
3. for 循环
for 循环是迭代循环,可遍历任何可迭代的对象。
for 迭代变量 in 可迭代对象:
do...
每次循环,迭代变量被设置为可迭代对象的当前元素。
word=['a','b','c']
for i in word:
print(i,end' ')
# a b c
4. for - else 循环
与 while - else 循环语句一样,当for循环正常执行完时,执行else的内容。若for循环在执行中遇到跳出语句(如:break),则不执行else的内容。
for 迭代变量 in 可迭代对象:
do...
else:
do...
5. range()函数
range([start,] stop[,step=1])
生成一个从start开始,从stop结束(不包括stop)的数字序列,step表示间隔,默认值为1。
for i in range(1,10,2):
print(i)
# 1
# 3
# 5
# 7
# 9
6. enumerate()函数
enumerate(A):一 一返回A的元素。
enumerate(A,j ):不仅返回A中的元素,还可以给元素设置起始值为 j 的索引值。
word=['a','b','c']
lst=list(enumerate(word,start=1))
print(lst)
# [(1,'a'),(2,'b'),(3,'c')]
enumerate() 与 for 循环
word=['a','b','c']
for i, w in enumerate(word,1):
print(i,'This is',w)
# 1 This is a
# 2 This is b
# 3 This is c
7. break、continue 语句
break :跳出当前所在层的循环。
continue :终止本轮循环并执行下一轮循环。
num=[3,4,8,9]
for i in num:
if i%2==0:
print(i)
break
print('find')
# find
# 4
for i in num:
if i%2==0:
print(i)
continue
print('find')
# find
# 4
# 8
# find
8. pass 语句
pass:空语句,不做任何操作。若在需要有语句的地方不写任何语句,则解释器会提示出错,此时可用pass语句解决。
def fun():
# SyntaxError: unexpected EOF while parsing
def fun():
pass
9. 推导式
(1).列表推导式
[expr for value in collection [if condition] ]
示例:
x=[1,2,3,4,5,6]
y=[i*2 for i in x if i%2==0]
print(y)
# [4,8,12]
x=[1,2,3]
y=[4,5,6]
z=[(i,j) for i in x for j in y]
print(z)
# [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
(2).元组推导式
( expr for value in collection [if condition] )
示例:
x=(i*2 for i in range(5))
print(x)
# <generator object <genexpr> at 0x000001966751B660>
print(tuple(x))
# (0, 2, 4, 6, 8)
(3).集合推导式
{ expr for value in collection [if condition] }
示例:
x=[2,4,8]
y={i**2 for i in x}
print(y)
# {16, 64, 4}
(4).字典推导式
{ key: value for value in collection [if condition] }
示例:
num=[1,2,3,4,5]
x={i:i%2==0 for i in num}
print(x)
# {1: False, 2: True, 3: False, 4: True, 5: False}
练习题
1、编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。
x=range(1500,2700)
y=[i for i in x if i%7==0 and i%5==0]
print(y)
# [1505, 1540, 1575, 1610, 1645, 1680, 1715, 1750, 1785, 1820, 1855, 1890, 1925, 1960, 1995, 2030, 2065, 2100, 2135, 2170, 2205, 2240, 2275, 2310, 2345, 2380, 2415, 2450, 2485, 2520, 2555, 2590, 2625, 2660, 2695]
2、龟兔赛跑游戏
题目描述:
世界上各个角落都不断在发生着乌龟和兔子的比赛,小华研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但在与乌龟的比赛中,一旦任1秒结束后兔子发现自己领先 t 米或以 上,它们就会停下来休息 s 秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度 v1(m/s),乌龟的速度 v2,以及兔子对应的 t,s值,以及赛道的长度 l ——就能预测出比赛的结果。
请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入:
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2< =100;t< =300;s< =10;l< =10000且为v1,v2的公倍数)
输出:
第一行输出比赛结果:“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入:
10 5 5 2 20
样例输出
D
4
import numpy
from numpy import *
v1,v2,t,s,l=map(lambda x:int(x),input('please input v1,v2,t,s,l:').split())
T2=l/v2
k,l1,T0=0,0,0
while l1<l:
if l1-v2*T0>=t:
T0+=s
k+=1
else:
T0+=1
l1=v1*(T0-k*s)
if T0>T2:
print('T',T2,sep='\n')
break
elif T0==T2:
if l1==l:
print('D',T0,sep='\n')
break
else:
print('R',T0,sep='\n')
# 输出结果:
>>>
==============================
please input v1,v2,t,s,l:10 5 5 2 20
D
4
>>>
==============================
please input v1,v2,t,s,l:10 5 5 3 20
T
4.0
>>>
==============================
please input v1,v2,t,s,l:10 5 5 1 20
R
3