2022.3.31
range函数
range的用法 注意:3.x之后前面得加一个list(range())要不无法输出
range(stop): 0~stop-1
range(start,stop): start~stop-1
range(start,stop,step): start~stop step(步长)
for 循环
for 循环使用的语法:(for循环可以加else语句,else语句后跟循环结束需要执行的代码,)
break 语句可以用于跳出循环,可以用在 for 循环、while 循环、switch 循环中。当我们在一个循环中使用了break 语句,则会中断循环,但是仍会继续执行循环之后的代码。
if 条件判断也能用break
for 变量 in range(10):
循环需要执行的代码
else:
循环结束时,需要执行的代码
练习:
例子1.分别求1~100内偶数之和
#利用for循环求1~100内偶数之和
sum = 0
for i in range(0,101,2):#取偶数操作由步长为2的数列操作完成
sum = sum+i
print(sum)#for循环内输出会将每个结果都打印出来
print(sum)#for循环之外输入只输出最终结果
一定仔细思考print在不同位置时的输出
0
2
6
12
20
30
42
...
2256
2352
2450
2550
2550
例子2:求阶乘即n!
(本例亦可使用递归函数完成)
def jiecheng(s):
s = int(s)
if s == 1 or s == 0:
return 1
else:
return (s*jiecheng(s-1))
for循环的嵌套
例子3. 有1,2,3,4四个数字,求这四个数字能生成多少个互不相同且无重复数字的三位数
sum = 0
for i in (1,2,3,4):
for j in (1,2,3,4):
for k in (1,2,3,4):
if i != j and j!= k and i != k:
sum += 1
print('共有%d种组合' %sum)
例子4. 有1,2,3,4四个数字,求这四个数字能生成多少个互不相同且无重复数字的三位数,并展示出来
for x in range(1,5):
for y in range(1,5):
for z in range(1,5):
if (x!=y) and (y!=z) and (z!=x):
print("%d%d%d" % (x, y, z))
实现命令行提示符
break:跳出整个循环,不会再执行循环后续的内容
continue:跳出本次循环,continue后面的代码不再执行,但是还是会继续循环
exit():结束程序的运行
例子5. 打印99乘法表
for i in range(1,10):
for j in range(1,i+1):
print('%d * %d = %d\t' %(i,j,i*j),end='')
#\t制表符,自动对齐后面的东西 end=‘’表示将输出 如果end='\n'则表示换行
print()#表示执行完之前的print后换行
注意理解此代码中while的嵌套 嵌套时代码的退格操作
temp = input('请输入一个整数:')
number = int(temp)
while number:
i = number - 1
while i:
print('+', end='')
i = i - 1
j = number
while j:
print('*', end='')
j = j - 1
#print()#不加print()函数,则所有输出为一行
number = number - 1
不加print()时的输出
++***+***
加print()的输出
++***
+**
*
例子6:用户登录管理系统,如下三点要求
1.输入用户名和密码;
2.判断用户名和密码是否正确(name=‘root’,passwd=‘westos’)
3.登录仅有三次机会,超过3次会报错
注意理解此代码中for循环与else语句的使用
for i in range(1,4):#先用for循环限定登录次数
user = input('请输入用户名:')
password = input('请输入密码:')
if user == 'root' or password == 'huahua':
print('%s登录成功!'%user)
break
else:#循环内的if else语句需要对齐
print('用户名或密码输入错误,请重新输入!',end='')#使两条print的语句输出为一行
print('您还有%d次机会'%(3-i))
else:#当循环内的所有代码(包括所有的if else语句)执行完之后,输出print之后的语句
print('错误次数已超过三次,登录失败')#else的空格与for对齐
例子7:求最大公约数和最小公倍数,如下三点要求
输入两个数值:
求两个数的最大公约数和最小公倍数
最小公倍数=(num1 * num2) / 最大公约数
# 输入两个数字
num1=int(input('Num1:'))
num2=int(input('Num2:'))
# 找出两个数中的较小者
min_num = min(num1,num2)
# 确定最大公约数
# 思考该函数怎么能找出最大公约数
for i in range(1,min_num+1):
if num1 % i ==0 and num2 % i ==0:
max_commer = i
# 求最小公倍数
min_commer =int(num1 * num2)/max_commer
print('%s 和 %s 的最大公约数为%s' %(num1,num2,max_commer))
print('%s 和 %s 的最小公倍数为%s' %(num1,num2,min_commer))
例子7的发散:
求两个数的所有公约数,并输出最大、最小公约数
#求两个数的所有公约数,输出所有公约数并单独输入最大公约数
num1 = int(input('请输入一个整数:'))
num2 = int(input('请输入一个整数:'))
min_num = min(num1,num2)
L = []
for i in range(1,min_num+1):
#L = []#L定义在循环内时,每次循环会对列表进行重新赋值,导致输出只输出一个数
if num1 % i == 0 and num2 % i ==0:
#L = []
L.append(i)
#print(i)
#L.append(i)
#print(L)
#print(id(L))
#print(L)#在此加print函数会导致每次循环结束后都进行输出,
else:#与for循环相同的位格上写else函数,执行for循环结束后的结果
print(L)
L.sort()
print(L[0],L[-1])
#这两种代码输出结果是一样的
print(L)
L.sort()
#L = L.sort()#对列表排序直接使用L.sort()即可,不能使用诸如L = L.sort的语句
print(L[0],L[-1])
二、while循环
循环的作用就是让指定的代码重复的执行,while 循环最常用的应用场景就是让执行的代码按照指定的次数重复执行
while 条件():
条件满足时,做的事情1
条件满足时,做的事情2
......
1、基本用法
注意:一定要注意循环内的退格用法
# 定义一个整数变量,记录循环的次数
i=1
# 开始循环
while i <= 3:
# 希望循环内执行的代码
print('hello python')
# 处理计数器
i+=1
死循环的例子:
while True:
print('hello python')#会一直循环输出
例子1:3、求1~100之间数字的和
#求1~100之间数字的和
i = 1
sum = 0
while i <= 100:
sum = sum+i
i = i+1
#print(sum)#注意print的位置
print(sum)
例子1发散:求100内所有偶数的和
#发散 while循环求1-100内所有偶数的和
i = 1
sum = 0
while i <= 100:
if i % 2 == 0:
sum = sum + i
i = i+1#注意i = i+1这个式子是与if语句同位格的
print(sum)
例子2:用户登录管理
i = 0
while i <= 3:
user = input('请输入用户名:')
password = input('请输入密码:')
if user == 'root' and password == 'huahua':
print('%s登录成功!' %user)
break
else:
print('用户名或密码输入错误,请重新输入!',end='')
print('您还有%d次机会' %(3-i))
i = i+1
while 循环嵌套
while 里面还有 while
例子1:如下要求
1.在控制台连续输出五行*,每一行星号的数量依次递增
2.完成 5 行内容的简单输出 分析每行内部的*应该如何处理
输出
*
**
解决方法1:for循环
# 1.控制行
for i in range(6):
# 2.控制*的数量
for j in range(6):
if i > j :
print("*",end='')
print(" ")
解决方法2:for循环
for i in range(1,6):
for j in range(1,i+1):
print('*',end='')
print()
解决方法3:while循环
#样式三:
row = 1
while row <= 5: ##行循环5次,即外层的总循环次数
col = 1
a = 1 ###控制空格的输出次数
while a <= 5-row: ###空格的输出条件
print(' ',end='') ##输出空格
a += 1
while col <= row: ###*的输出条件
print('*',end='')
col += 1
print('') ###行每循环一次使下一次的循环输出换行显示
row += 1
解决方法4:while循环
i = 1
while i <= 5:
j = 1
while j <= i:
print('*',end='')
#print('*')
j = j+1
#print()
print('')#输出空,将每一行隔开
#在i=1,j=1(即在每一个i输出完之后,均添加空行)时,输出完所有*之后,再输出空,隔开行。
i = i + 1
例子1发散:如果想要星星倒过来呢
解决方法1:for循环
# 1.控制行
for i in range(6):
# 2.控制*的数量
for j in range(6):
if i < j :
print("*",end='')
print(" ")
解决方法2:while循环
i = 1
while i <= 5:
j = 1
while j < i:
print(" ",end='')
j += 1
while j >= i and j <= 5:
print("*",end='')
j += 1
print()
i += 1
解决方法3:while循环
i = 1
while i <= 5:
j = 5
while j >= i:
print('*',end='')
j = j-1
print('')
i = i+1
例子2: 输出倒三角
i = 1
while i <= 9:
while i <= 5:
j = 1
while j <= i:
print('*',end='')
j = j+1
print('')
i = i +1
while 5 < i <= 9:
j = 10
while j > i:
print('*', end='')
j = j-1
print('')
i = i + 1
例子2推广:用*输出一个棱形
row = 1
while row <= 9:
col = 1
star = 1
# 先计算前五行的
if row <= 5:
while col <= (5 - row):
print(" ", end="")
col += 1
while star <= row * 2 - 1:
print("*", end="")
star += 1
# 计算的后四行的
else:
while col <= (row - 5):
print(" ", end="")
col += 1
while star <= 19 - row * 2:
print("*", end="")
star += 1
print("")
row += 1
例子3:猜数字游戏
猜数字游戏:
1.系统随机生成一个1~100的数字;
2.用户共有5次机会猜;
3.如果用户猜测数字大于系统给出的数字,打印"too big"
4.如果用户猜测数字小于系统给出的数字,打印"too small"
5.如果用户猜测的数字等于系统给出的数字,打印"恭喜中奖",并退出循环
import random
num = random.randint(1,100)
print(num)
i = 1
while i <= 5:
ans = int(input("请猜数:"))
if ans > num:
print("too big,还剩%d次机会"%(5-i))
elif ans < num:
print("too small,还剩%d次机会"%(5-i))
else:
print("恭喜中奖!!!")
break
i += 1
while和for的进阶案例 while for嵌套使用
例子1、 求 1+2!+3!+…+20! 的和。
解决方法1:while循环嵌套
i = 1
sum = 0
while i <= 20:
sum1 = 1
j = 1
while j <= i:
sum1 = sum1*j
j = j+1
i = i+1
sum = sum+sum1
#print(sum) 这里会把每一步的输出都给输出出来
print(sum)
解决方法2 :for循环嵌套
for x in range(1, 21):
sum1 = 1
for j in range(1, x + 1):
sum1 = sum1 * j
j = j + 1
sum = sum + sum1
# i = i+1
print(sum)
例子2:本金10000元存入银行,年利率是千分之三。每过1年,将本金和利息相加作为新的本金。计算5年后,获得的本金是多少?
#while循环
i = 1
t = 10000
x = 0.003
while i <= 5:
t = t*x+t
i = i+1
print(t)
#for循环
t = 10000
x = 0.003
for i in range(1,6):
t = t+t*x#注意此时for循环只用来判定次数用
print(t)
#递归函数
例子3、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各个位上数字的立方和等于该数本身。例如:153是一个”水仙花数",因为153=1的三次方+5的三次方+3的三次方。
解决方法1:for循环
for s in range(100,1000):
s = str(s)
s1 = int(s[0])
s2 = int(s[1])
s3 = int(s[2])
x = str(s1**3+s2**3+s3**3)
if x == s:
print(x)
for s in range(100,1000):
if ((s//100)**3)+(((s%100)//10)**3)+((s%10)**3) == s:
print(s)
解决方法2:while循环
s = 100
while s < 1000:
if ((s//100)**3)+(((s%100)//10)**3)+((s%10)**3) == s:
print(s)
s = s+1
例子4:设计“过7游戏”的程序, 打印出1-100之间除了含7和7的倍数之外的所有数字
解决方法1:while循环
m = 1
while m <= 100:
if m%7 != 0:
if m//10 != 7:
if m%10 != 7:
print(m)
m = m + 1
解决方法2 :while循环
i = 0
while i <= 99:
i += 1
if i % 7 == 0 or i % 10 == 7 or i // 10 == 7:
continue#while中continue语句的运用
else:
print(i)
解决方法3:for循环
for i in range(1, 101):
if i % 7 == 0 or i % 10 == 7 or i // 10 == 7:
continue
print(i)
例子5:使用while、if来完成剪刀石头布程序,要求,当玩家第3次获胜时才退出游戏,否则继续玩。
解决方法1:while循环(用while来限定循环次数)
import random
i = 1#用while循环记录赢的次数
while i <= 3:
player = int(input('请出招(石头0,剪刀1,布2):'))
computer = random.randint(0, 2)
if (player == 2 and computer == 0) or (player == 0 and computer == 1) or (player == 1 or computer == 2):
i = i+1
print('你赢啦,再来!')
#print(i)#可以打印出i来观察每次赢之后i值有没有增加
#i = i+1#如果将此式子写在此处,代表着判定条件的结束,无法进行下面的判定,注意体会
elif player == computer:
print('平局啦,再来!')
else:
print('你输啦,再来!')
print('你赢了三次啦,结束!')
解决方法2:while循环(用if语句来判定赢的次数是否到达3次)
win_times = 0
while True:
player = int(input("请输入:剪刀(0) 石头(1) 布(2)"))
computer = random.randint(0, 2)
if (player == 0 and computer == 2) or (player == 1 and computer == 0) or (player == 2 and computer == 1):
win_times += 1
if win_times == 3:
print("你赢了三次了")
break
else:
print("你赢了这局游戏")
elif player == computer:
print("平局,再来一次")
else:
print("你输了,不要走,决战到天亮")
例子6:7、幸运猜猜猜:游戏随机给出一个0~99(包括0和99)的数字,然后让你猜是什么数字。
你可以随便猜一个数字,游戏会提示太大还是太小,从而缩小结果范围。
经过几次猜测与提示后,最终推出答案。在游戏过程中,记录你最终猜对时所需要的次数,
游戏结束后公布结果。
说明:
1~2次猜中,打印你太TM有才了!
3~6次猜中,打印这么快就猜出来了,很聪明嘛!
大于7次猜中,打印猜了半天才猜出来,小同志,尚需努力啊!
猜测次数最多20次。
解决方法:while循环(自己写的)
import random
i = 0
computer = random.randint(0, 99)
while True:
player = int(input('请输入你猜的数字:'))
#computer = random.randint(0, 99)#随机生成一定要在循环外,否则每次都会随机生成
if i <= 20:
if player == computer:
if i <= 2:
print('你真厉害')
break
elif 3 <= i <= 6:
print('你真聪明')
break
elif 7 <= i <= 20:
print('再努努力吧')
break
elif player > computer:
i = i + 1
print('太大,再猜')
else:
i = i + 1
print('太小,再猜')
else:
print('最多只能猜20次哦')
break
#else:
print('你一共猜了%d次'%i,end='')
print(',正确数字是%s'%(computer))
解决方法2:while循环
import random
num = random.randint(0, 99)
print(num)
times = 0
while times <= 20:
ges = int(input("请输入你猜的数字: "))
if ges > num:
print("你猜的数太大了")
times += 1
if times == 20:
print("你都猜了20次了,还没猜中")
break
continue
elif ges < num:
print("你猜的数字太小了")
times += 1
if times == 20:
print("你都猜了20次了,还没猜中")
break
continue
else:
if 1 <= times <= 2:
print("有才")
elif 3 <= times <= 6:
print("还可以")
else:
print("需要努力")
print(num)