Python第二章 条件 循环


本笔记旨在复习时能快速唤醒记忆,适用人群非纯小白,谢谢!
临时该换门楣,上一章链接: Python第一章-初识Python .

if条件

  • 判断体部分可以是布尔类型以及组合,也可以是整形,浮点型,列表等类型(0,0.0,空集表示False)
if 3>2 and True or False:
	print(" 进入执行体 ")
  • 习惯了写java的,要留意if和else关键字后面的冒号
if True:
	print("is True")
else:
	print("is False")
  • 多级条件筛选
temp = input('请输入成绩:')
source = int(temp)
if 100 >= source >= 90:
    print('A')
elif 90 > source >= 80:
    print('B')
elif 80 > source >= 60:
    print('C')
elif 60 > source >= 0:
    print('D')
else:
    print('输入错误!')

while循环

  • 普通while循环。while 真,执行循环体,直到while 假;循环判断语句除了布尔类型也可以是整形,字符串,集合等其他类型
#输出100以内所有的偶数
count=100
while count>0:
        print(count)
        count-=2
  • 带判断条件的while语句。当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

for循环

  • 与java不同的是Python的for循环是利用迭代器实现的,可以便利任何序列str、list、tuple,dict等。
#--------------str序列--------------
for i in 'ILoveLSGO':
    print(i, end=' ')

# I L o v e L S G O

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

	# 张三
	# 李四
	# 刘德华
	# 刘六
	# 周润发

#迭代数字:i in range(0,5,2) //步长2,包前不包后:0,2,4
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 

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

  • 带判断条件的for循环,当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容
for i in range(0,7,2):  # 0 2 4 6
     if i<3:
	     print(i)
     else:
         continue
else:
	print(i)

# 0
# 2
# 6

range()函数

  • range(起点,终点,步长).产生序列,包前不包后。步长,顾名思义即可(结合下面代码理解)
for i in range(0,7,2): 
	print(i)
# 0
# 2
# 4
# 6

enumerate()函数

  • enumerate(sequence, [start=0]) 函数的作用是将一个序列、迭代器或其他支持迭代对象转化成一个枚举类型;第二个参数是枚举的角标起点(默认是从0开始)
  • 遍历的时候通常用for i,a in enumerate(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!

break关键字

  • 跳出当前循环
for i in range(0,5):
	if i>=3:
		break
	else:
		print(i)
print('最后的i的值是:',i)

	# 0
	# 1
	# 2
	# 最后i的值是:3

continue关键字

  • 跳出本次循环,进行下一次循环
for i in range(0,5):
	if i>=3:
		continue
	else:
		print(i)
print('最后的i的值是:',i)

	# 0
	# 1
	# 2
	# 最后i的值是:4

pass关键字

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

assert关键字

assert关键字又称断言。干啥用的呢?用来终止程序用的。有点像:如果False,程序终止。

ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
ASSERT 只有在 Debug 版本中才有效,如果编译为 Release 版本则被忽略

1)在函数开始处检验传入参数的合法性

int resetBufferSize(int nNewSize) 
{ 
//功能:改变缓冲区大小, 
//参数:nNewSize 缓冲区新长度 
//返回值:缓冲区当前长度 
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
assert(nNewSize >= 0); 
assert(nNewSize <= MAX_BUFFER_SIZE); 
... 
} 

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

#不好:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 
    
#好:
assert(nOffset >= 0); 
assert(nOffset+nSize <= m_nInfomationSize); 

3)不能使用改变环境的语句,因为assert只在DEBUG生效,如果这么做,会使用程序在真正运行时遇到问题

错误: 
assert(i++ < 100)
这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确:
assert(i < 100)
i++; 

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
  
5)有的地方,assert不能代替条件过滤–Release版本中断言失效

推导式

  • 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:

1)列表推导式

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)]
----------------------------------------------------
a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
print(a)

# [(0, 2)]

2)元组推导式

a = (x for x in range(10))
print(a)

# <generator object <genexpr> at 0x0000025BE511CC48>

print(tuple(a))

# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

3)字典推导式

b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}

4)集合推导式

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

5)其他

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)
# <generator object <genexpr> 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

章节练习:

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

for i in range(1500,2700):
   if i%5==0 and i%7==0:
        print(i)

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

解题思路:以时间为主要主线,终止条件是乌龟或者兔子路程等于l;兔子是实际跑步时间t1(每次等待时间s不算在t1内),每一秒都要判断兔子下一秒是休息还是跑步–方法就是设置标识位flag;flag=s时,表明兔子下一秒要跑,此时才能t1++,flag<s时下一秒要继续休息并切flag++;

v1,v2,t,s,L = map(int,input("请输入用空格隔开的五个正数(兔子的速度v1、乌龟的速度v2、兔子领先t米休息s秒、赛道的长度L):").split())
if not((0<v1<=100 and 0<v2<=100) and (0<t<=300) and (0<=s<=10) and (0<L<=10000)):
    print("输入错误!")
r1,r2,t1,t2=0,0,0,0			#r1,r2分别表示兔子和乌龟运动距离,t1,t2表示运动时间
flag=s 							#flag=s表示兔子下一秒要跑;flag<s表示下一秒继续休息
while r1<l and r2<l:
        r2=v2*t2
        r1=v1*t1
        t2+=1
        if flag>=s: 							#兔子正在跑
                if r1-r2>=t :
                        flag=0  				#0是休息的起点
                else :
                        t1+=1 				#距离不够t就接下来继续跑一秒
        else : 								#兔子正在休息
                flag+=1
elseif r1==r2:
                print('D')
        elif r1>r2:
                print('R')
        else:
                print('T')
        print(t2) 							#乌龟的时间就是最终比赛时间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值