1. 条件语句

(1)if 语句

if expression:
    expr_true_suite

if 2 > 1 and not 2 > 3:
    print('Correct Judgement!')

expression为真时,才执行expr_true_suite
单个 if 语句中的expression 条件表达式可以通过布尔操作符 and,or和not 实现多重条件判断。

(2)if else 语句

temp = input("猜一猜小姐姐想的是哪个数字?")
guess = int(temp) # input 函数将接收的任何数据类型都默认为 str。
if guess == 666:
    print("你太了解小姐姐的心思了!")
    print("哼,猜对也没有奖励!")
else:
    print("猜错了,小姐姐现在心里想的是666!")
print("游戏结束,不玩儿啦!")

补充input的用法。input 函数将接收的任何数据类型都默认为 str。temp 为 str 类型,通过类型转换 int() 得到 int 型的 guess。

(3)if elif else 语句

if expression1:
    expr1_true_suite
elif expression2:
    expr2_true_suite
    .
    .
elif expressionN:
    exprN_true_suite
else:
    expr_false_suite

注意:缩进和冒号。

(4)assert 关键字
assert这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常(断言语句失败)。

my_list = ['lsgogroup']
my_list.pop(0)
assert len(my_list) > 0

# AssertionError

在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。

2. 循环语句

(1)while 循环

while 布尔表达式:
    代码块

布尔表达式为True,一直执行代码块,直到为False,跳出循环。此处的布尔表达式可以为:<、>、==、!=、in、not in,也可以为数值,str、list或任何序列。(序列长度为0,False)

(2)while else 循环

while 布尔表达式:
    代码块
else:
    代码块

当 while 循环正常执行完的情况下,执行 else 输出,如果 while 循环中执行了跳出循环的语句,比如 break,将不执行 else 代码块的内容。

count = 0
while count < 5:
    print("%d is  less than 5" % count)
    count = count + 1
else:
    print("%d is not less than 5" % count)    
# 0 is  less than 5
# 1 is  less than 5
# 2 is  less than 5
# 3 is  less than 5
# 4 is  less than 5
# 5 is not less than 5

count = 0
while count < 5:
    print("%d is  less than 5" % count)
    count = 6
    break
else:
    print("%d is not less than 5" % count)
# 0 is  less than 5

补充:print("%d is less than 5" % count),%d 用法。

(3)for 循环
在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如 str、list、tuple 等,也可以遍历任何可迭代对象,如 dict。

for 迭代变量 in 可迭代对象:
    代码块

同样要注意:缩进和冒号。

for i in 'ILoveLSGO':
    print(i, end=' ')  # 不换行输出
# I L o v e L S G O

member = ['张三', '李四', '刘德华', '刘六', '周润发']
for each in member:
    print(each)
# 张三
# 李四
# 刘德华
# 刘六
# 周润发
for i in range(len(member)):
    print(member[i])
# 张三
# 李四
# 刘德华
# 刘六
# 周润发

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

for key, value in dic.items():
    print(key, value, sep=':', end=' ')    
# a:1 b:2 c:3 d:4 
for key in dic.keys():
    print(key, end=' ')
# a b c d

补充:dic.items()和dic.keys()获取字典中的全部值或键,以<class ‘dict_values’>和<class ‘dict_keys’>类型返回。可以用list()变成列表。

(4)for else 循环

for 迭代变量 in 可迭代对象:
    代码块
else:
    代码块

当 for 循环正常执行完的情况下,执行 else 输出,如果 for 循环中执行了跳出循环的语句,比如 break,将不执行 else 代码块的内容,与 while - else 语句一样。

(5)range() 函数
用法:range([start,] stop[, step=1]) 这个内置函数有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。step=1 表示第三个参数的默认值是1。range 包含开头,不含结尾。

(6)enumerate() 函数
用法:enumerate(sequence, [start=0]) sequence :一个序列、迭代器或其他支持迭代对象。
start :下标起始位置。
返回 enumerate(枚举) 对象

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1))  # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

enumerate()与 for 循环的结合使用:

for i, a in enumerate(A)
    do something with a
# 例如
for i, language in enumerate(languages, 2):
    print(i, 'I love', language)
print('Done!')
'''
2 I love Python
3 I love R
4 I love Matlab
5 I love C++
Done!

(7)break 语句:跳出当前循环。
(8)continue 语句:终止本轮循环并直接开始下一轮循环。

(9)pass 语句
pass是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。

(10)推导式
列表推导式[ expression for value in collection [if condition] ] for 和 in 和 if 是关键字。
collection 可以是一个列表,也可以是一个 range() 函数等等,[if condition] 是一个判别表达式。也可以包含多个 for 循环语句,相当于嵌套。最外层为[ ],表示最终以列表形式返回。

x = [i ** 2 for i in range(1, 10)]
print(type(x))
# <class 'list'>

元组推导式:( expr for value in collection [if condition] ) 最外层为( ),返回一个生成器。

a = (x for x in range(10))
print(type(a))
print(a)
# <class 'generator'>
# <generator object <genexpr> at 0x0000025BE511CC48>
print(tuple(a))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

字典推导式:{ key_expr: value_expr for value in collection [if condition] } 键值对的形式,最外层为{ },表示最终以字典形式返回。

集合推导式:{ expr for value in collection [if condition] } 内部不是键值对,最外层为{ },表示最终以集合形式返回。集合内不包含重复元素。

其他:

d = 'i for i in "I Love Lsgogroup"'
print(d) # d整体只是个字符串
# i for i in "I Love Lsgogroup"

e = (i for i in range(10)) # 元组推导式
print(type(e))  # e是生成器类型
print(e)  # 用print(tuple(e))可以直接输出整个元组
# <class 'generator'>
# <generator object <genexpr> at 0x0000007A0B8D01B0>
print(next(e))  # 0
print(next(e))  # 1
# next()函数:返回下一个项目,会记录到读取的位置

for each in e:
    print(each, end=' ')
# 2 3 4 5 6 7 8 9

s = sum([i for i in range(101)])  # sum() 求和函数
print(s)  # 5050
s = sum((i for i in range(101)))
print(s)  # 5050

(a)迭代器:是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
# 1

(b)生成器:使用了 yield 的函数被称为生成器。生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
关于yield函数的例子:

def foo():
    print("starting...")
    while True:
        res = yield 1
        print("res:",res)
g = foo()           # 至此没有输出
print(next(g))      # starting...
                    # 1
print("*"*20)       # ********************
print(next(g))      # res: None
                    # 1

3. 练习题

1、编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。

list1 = []
for i in range(1500, 2701):
    if (i % 7 == 0) and (i % 5 == 0):
        list1.append(i)
print(list1)

2、龟兔赛跑游戏

题目描述:

话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔 子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以 上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1 米),乌龟的速度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

# v1兔子速度,v2乌龟速度,l赛道总长,t兔子领先米数,s兔子休息秒数
v1, v2, t, s, l = map(int, input("请输入五个正整数:").split())
disr = v1   # 兔子的路程
dist = v2   # 乌龟的路程
count = 1
all_t = int(l / v2)  # 乌龟走完全程所用的时间
while(dist < l)and(disr < l):
    if (disr - dist) >= t:
        temp = s
        while temp:
            dist = dist + v2
            count = count + 1
            disr = disr
            temp = temp - 1
            if (dist == l) or (disr == l):
                break
    else:
        dist = dist + v2
        disr = disr + v1
        count = count + 1
if disr > dist:
    print("R")
    print(count)
elif disr < dist:
    print("T")
    print(all_t)
else:
    print("D")
    print(all_t)