Task02条件循环结构

条件语句
循环语句

1、笔记

条件语句

单分支结构流程图语法:

if 表达式:  #  表达式可以是多种形式  但是只有两种结果: 真或假
    语句序列 # 表达式为真则执行语句序列,否则不执行

在这里插入图片描述
两路分支结构流程图语法:

if 表达式:
    语句序列1
else:
    语句序列2

三元运算符

x if C else  y
'''
执行过程中先计算表达式C(条件),若条件为真,则返回x(正确);否则返回y(错误)
条件表达式在Python的所有运算符中的优先级是最低的
'''

多分支结构语法;

if 表达式:
    语句序列1
elif 表达式:
    语句序列2
elif 表达式:
    语句序列3
else:
    语句序列4 
'''
可以继续扩展
'''

在这里插入图片描述
在这里插入图片描述

assert关键词
语法

assert expression

expression为False时 输出AssertionError

assert 2 < 1
# AssertionError

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

循环语句

while

while 语句是当型循环结构,当条件满足时执行循环体。
while循环语句语法

while 布尔表达式:
    语句序列  #语句序列要对齐,while语句只执行其后的一条或一组同一层次的语句
  • while循环的代码块会 一直循环,直到布尔表达式的值为布尔假。
  • 常见的布尔表达式会包括比较运算符(><==!=)或者innot in等运算符。
  • while后写一个非零整数,视为真值,进入循环体;写入0时,视为假值,不执行循环体。
  • while语句是先判断再执行,所以循环体可能一次也不执行。
  • 循环体中要包含能改变混怀变量的语句,否则,若表达式的结果始终是True,则会造成死循环。
  • 若循环体不需要执行任何语句序列,可以用pass语句。它的意思是“不做任何事”。
while 1:
    语句序列
# 执行语句序列
while 0
    语句序列
# 不执行语句序列

while后面也可以写入str、list或任何序列,长度非零则为真值,否则视为假值

s = 'abcdefg'
while s:
    s = s[:-1] #切片索引
    print(s)
# abcdef
# abcde
# abcd
# abc
# ab
# a

while - else

while 布尔表达式:
    语句序列
else:
    语句序列
  • while循坏是从正常出口结束退出的,即while后的表达式为False时,继续执行else子句。
  • 如果while循环中执行了跳出循环的语句,比如break,将不执行else代码块的内容。

for

在这里插入图片描述

  • 上图的含义:执行for语句从可迭代对象中产生一个迭代器,变量取迭代器中的一个值,执行语句序列(循环体),再取下一个值,继续执行语句序列,直到无元素可取。
  • 这样的好处是:迭代器是一个接一个地计算值,在使用时计算一个值时只获取一个值,占内存比较少。儿列表,每次取值会一次性获取所有值,如果值较多,会占用比较多的内存。
    语法:
for 迭代变量 in 可迭代对象:
    语句序列

可迭代对象和迭代器

可迭代对象
序列str,list,tuple
迭代器enumerate() range()
其他可以迭代的对象字典的键和文件的行

可迭代对象和迭代器的关系:迭代器属于可迭代对象,当使用for语句时,for语句会通过__iter__()方法获得对象的迭代器,并通过__next__()方法获取下一个元素。

lst = [1,3,2]
for item in lst:
	print(item)

上述代码的实现可以理解为:

i=iter([1,3,2])
next(i) # 1
next(i) # 3
next(i) # 2
next(i) # StopIteration 

迭代器也可以转换成可迭代对象

print(enumerate('abc'))
#<enumerate object at 0x0000014EB4676C18>
print(list(enumerate('abc')))
# [(0,'a'),(1,'b'),(2,'c')] 

range()函数 语法

range([start,] stop[, step = 1])
  • range()函数里面有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。 step=1 表示补偿默认为1
  • range()函数会一个从start开始到stop参数结束的数字序列,该序列包含start的值但不包含stop的值。

enumerate()函数 语法(enumerate详解)用途:对可迭代对象的元素添加标号索引 与for循环结合就可以同时遍历索引和元素。语法,

enumerate(sequence, [start=0])
  • sequence是个序列迭代器或者其他支持迭代的对象
  • start 下标起始位置
  • 返回enumerate(枚举)对象

for语句的迭代

  • 序列项的迭代
member = ['张三', '李四', '刘德华', '刘六', '周润发']
for each in member:
    print(each)
# 张三
# 李四
# 刘德华
# 刘六
# 周润发
  • 序列索引的迭代
member = ['张三', '李四', '刘德华', '刘六', '周润发']
for i in range(len(member)):
    print(member[i])
# 张三
# 李四
# 刘德华
# 刘六
# 周润发
  • 索引序列迭代
courses = ['Maths','English','Python']
score = [88,92,95]
for c,s in zip(courses,score)
	print ('{0} - {1:d}'.format(c,s))
# Maths - 88
# English - 92
# Python - 95
  • 其他迭代 对字典的键或文件的某一行这种有序列特征的刻碟带对象进行迭代
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 

for value in dic.values():
    print(value, end=' ')    
# 1 2 3 4

for-else

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

当for循环正常执行完的情况下,将迭代器中的元素遍历完,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容

推导式

以列表作为变量容器

**[** expr for value in collection [if condition] **]**

一层

x = [i ** 2 for i in range(1, 10)]
print(x)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

二层

a = [(i, j) for i in range(0, 3) for j in range(0, 3)]
print(a)

# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

元组推导式

( expr for value in collection [if condition] )

字典推导式

{ key_expr: value_expr for value in collection [if condition] }
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}

集合推导式(注意和字典推导式的区别)

{ expr for value in collection [if condition] }
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}

2、作业

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

def juDge(x):
    if x % 5 == 0 and x % 7 == 0:
        return x
    else:
        return 0


c = [juDge(y) for y in range(1500, 2700) if juDge(y)]
print(c)
# [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)、龟兔赛跑游戏

题目描述:

话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔 子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先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”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。

第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。

# v1 兔子的速度
# v2 乌龟的速度
# t 兔子发现自己领先t米或以上,它们就会停下来休息s秒
# s
# l 赛道的长度


v1, v2, t, s, l = map(int, input("输入:").split())
if v1 <= 100 and v2 <= 100 and t <= 300 and s <= 10 and l <= 10000 and l % v1 == 0 and l % v2 == 0:
    s1, s2, i = 0, 0, 0
    while s1 < l and s2 < l:
        s1, s2, i = v1 + s1, v2 + s2, i + 1
        if s1 == l or s2 == l:
            break
        elif s1 - s2 >= t:
            s2, i = s2 + v2 * s, i + s

    if s1 > s2:
        print('R')
    if s1 == s2:
        print('D')
    if s1 < s2:
        print('T')
    print(i)

其实我第一反应是写一个def(v1, v2, t, s, l)函数 ,但是发现用map()更简洁明了!!
真有同学定义了函数!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值