for while循环练习

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后换行 

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值