(4以前没有注意过)
assert这个关键词称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常。
【例子】
my_list = ['lsgogroup']
my_list.pop(0)
assert len(my_list) > 0
#AssertionError
list.pop([index=-1])用于移除列表中的一个元素(默认最后一个元素)。
如果列表中有多个元素再执行:
my_list = ['lsgogroup','miffy','pumpkin','zyx']
my_list.pop(0)
assert len(my_list) > 0
此时因为assert后的条件为True,因此程序并不会自动崩溃也不会抛出AssertionError的异常。
在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
【例子】
assert 3 > 7
参考:菜鸟教程
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
Python 2.3. 以上版本可用,2.6 添加 start 参数。
语法:
enumerate(sequence, [start=0])
返回值:
返回 enumerate(枚举) 对象。
实例:
students = ["miffy","Tom","zyx","rsl","rsl"]
enumerate(students)
#返回值:为enumerate对象
students = ["miffy","Tom","zyx","rsl","rsl"]
list(enumerate(students))
"""
返回值:
[(0, 'miffy'), (1, 'Tom'), (2, 'zyx'), (3, 'rsl'), (4, 'rsl')]"""
#下标从1开始
list(enumerate(students,start=1))
"""返回值:
[(1, 'miffy'), (2, 'Tom'), (3, 'zyx'), (4, 'rsl'), (5, 'rsl')]
"""
还是使用上面students的例子
①
for i, s in enumerate(students)
print(i,s)
"""输出结果:
0 miffy
1 Tom
2 zyx
3 rsl
4 rsl"""
②
languages = ['Python', 'R', 'Matlab', 'C++']
for language in languages:
print('I love', language)
print('Done!')
"""
I love Python
I love R
I love Matlab
I love C++
Done!
"""
③
languages = ['Python', 'R', 'Matlab', 'C++']
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!
'''
break主要用于跳出当前所在层的循环
import random
secret = random.randint(1, 10) #[1,10]之间的随机数
#闭区间
while True:
temp = input("不妨猜一下小哥哥现在心里想的是那个数字:")
guess = int(temp)
if guess > secret:
print("大了,大了")
else:
if guess == secret:
print("你这样懂小哥哥的心思啊?")
print("哼,猜对也没有奖励!")
break
else:
print("小了,小了")
print("游戏结束,不玩儿啦!")
不妨猜一下小哥哥现在心里想的是那个数字:3
小了,小了
不妨猜一下小哥哥现在心里想的是那个数字:5
小了,小了
不妨猜一下小哥哥现在心里想的是那个数字:8
大了,大了
不妨猜一下小哥哥现在心里想的是那个数字:7
大了,大了
不妨猜一下小哥哥现在心里想的是那个数字:6
你这样懂小哥哥的心思啊?
哼,猜对也没有奖励!
游戏结束,不玩儿啦!
有while True的条件,只要不满足break前的条件,就会一直循环下去
所以要注意写break,避免死循环
while True:
print("a") #会一直输出a
关于random.dandint和np.dandom.randint()的区别
continue用来终止本轮循环并开始下一轮循环。
如果没有continue
for i in range(10):
if i % 2 != 0:
print(i)
"""
那输出的就是
1
3
5
7
9
"""
for i in range(10):
if i % 2 != 0:
print(i)
continue
i += 2 #相当于i=i+2
print(i)
"""
输出结果:
2
1
4
3
6
5
8
7
10
9
"""
关于这里的循环过程:
从0开始,0不满足条件,i+=2,输出2
然后下一轮循环,1,满足条件,输出1,continue即终止本轮循环,不再i+=2
下一轮循环,2,不满足条件,i+=2,输出4
“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的。
def a_func():
# SyntaxError: unexpected EOF while parsing
def a_func():
pass
只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。
[ expr for value in collection [if condition] ]
比如若要生成[1x1, 2x2, 3x3, …, 10x10]
a = [x*x for x in range(11)]
a
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
x = [(i, i ** 2) for i in range(6)]
print(x)
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
( expr for value in collection [if condition] )
a = (x*x for x in range(11))
a
# at 0x00000142281F2E40>
生成器表达式和列表推导式的语法基本上是一样的 只是把[]替换成()
打印的结果就是一个生成器,我们可以使用for循环来循环这个生成器
tuple(a)
#(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
在这里插入代码片
{ 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}
这里key是i
value是输出的布尔值
目的就是判断0-9这10个数中能被3整除的数里能不能被2整除
{ 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}
d = 'i for i in "I Love Lsgogroup"'
print(d)
# i for i in "I Love Lsgogroup"
e = (i for i in range(10))
print(e)
# at 0x0000007A0B8D01B0>
print(next(e)) # 0
print(next(e)) # 1
for each in e:
print(each, end=' ')
# 2 3 4 5 6 7 8 9
s = sum([i for i in range(101)])
print(s) # 5050
s = sum((i for i in range(101)))
print(s) # 5050
思考:
d = [i for i in "I Love Lsgogroup"]
print(d)
# ['I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'g', 'r', 'o', 'u', 'p']
passwdList = ['123', '345', '890']
valid = False
count = 3
while count > 0:
password = input('enter password:')
for item in passwdList:
if password == item:
valid = True
break
if not valid:
print('invalid input')
count -= 1
continue
else:
break
关于几个break的用法
1.编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。
#for循环解法
for i in range(1500,2701):
if i%5==0:
if i%7==0:
print(i)
#while循环解法
i = 1500
while i<=2700:
if i%7==0:
if i%5==0:
print(i)
i = i+1
else:
i = i+1
else:
i = i+1
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
代码:有参考到这篇:龟兔赛跑
#输入5个数,用空值隔开,赋给v1,v2,t,s,l
data = list(map(int,input().split(' ')))
v1 = data[0]
v2 = data[1]
t = data[2]
s = data[3]
l = data[4]
#数据初始化
time = 0 #time用来存放当前的时间
l1 = l2 =0
while True:#首先兔子不能跑到终点再歇,其次兔子要领先乌龟才行
if l1-l2 >=t:
for i in range(t):
l2 = l2+v2 #跑一秒就多v2
time = time+1
if l2 >= l >l1: #只要乌龟赢了,乌龟可以比赛道爬的远因为循环用到的是整型可能这秒没到下秒就到了
print("T",time,sep = '\n')
"""但是这里有一个问题,就是time不断+1得到的只能是整数,
所以我觉得不应该输出time而应该输出l/v2,因为乌龟没有间断过,但是这样我就不知道兔子的怎么写了"""
exit()#这里要用exit终止python程序,这里用break行不行
else:
l1 = l1+v1
l2 = l2+v2
time = time+1
if l1 >=l >l:
print("R",time,sep = "\n")#兔子赢
break
elif l2 >=l > l1:
print("T",time,sep = "\n")#乌龟不是在兔子睡觉时赢的
break
elif l1 == l2 >=l:#两只小动物一起赢
print("D",time,sep = "\n")#都赢
break
我做出的和答案不一样。我的输出结果是:
T
4
疑问:
1)我的答案是乌龟赢,标准答案是都赢,我还没想明白为什么。
2)另外就是我觉得输出time不太合适,因为time一直都是整数,应该有不是整数的情况
3)还有我加的那三个break用的对不对?因为我想的是写了while True之后应该还是应该让跳出循环
4)这是为什么?