Python 100天练习 — Day4 循环结构

本文以GitHub上100天python从新手到大师为素材,规划为约100天的练习,每次的学习和总结均发在这里。有错误的地方还请朋友们指正。

应用场景

在编程的过程中,我们常常会遇到一些需要重复的地方,例如在模拟驾驶一辆车时,你需要让车时刻保持前进,这时候就需要循环这个操作,而不是重复手写无数行前进的的代码。

在Python中,使用 for - inwhile 关键词来实现循环结构。

for - in 结构

for - in结构用于 已经知道要循环次数情况。

下面通过一个例子展示:

"""
从1到100求和
"""
total = 0
for i in range(101):
    total += i

# print("总和为 %d" %total)

i 是临时变量,用于存储循环结构依次拿取的循环变量
range( )函数可生成1个可迭代对象 在一定数值范围内按照一定的步长生成数

range(100)  # 生成从0到99内整数
range(1100) # 生成从1到99内整数
range(1,100,2)  # 可以产生一个1到99的奇数序列,其中2是步长,即数值序列的增量。

下面一个例子说明range的用法:

"""
求100内偶数和
"""
total = 0
for i in range(2,101,2):
    total += i

print("百内偶数和为 %d" %total)

total = 0
for i in range(1,101):
    if i % 2 == 0:
        total += i
    else:
        pass
print(total)

while循环

while循环适合于不知道具体循环次数的情况,while后接一个可以转换或取布尔值的条件,如果该布尔值为True则继续执行循环,否则跳出循环。

下面通过一个例子来说明:

"""
猜数字游戏
计算机出一个1~100之间的随机数由人来猜
计算机根据人猜的数字分别给出提示大一点/小一点/猜对了

"""
import random
number = random.randint(0,100) # 选取随机被猜数
guess = False
counter = 0 # 记次数,如果超过7次跳出循环

while(guess == False):
    guess_number = int(input("这次你猜是几?"))
    counter += 1 # 次数+1
    if guess_number > number:
        print("你猜大了")
    elif guess_number == number:
        print("你猜对了!")
        break # 跳出循环
    else:
        print("你猜小了!")
    if counter > 7:
        print("次数已用尽!")

beak 和 continue 以及嵌套

在while循环中,我们发现跳出循环可以不将while后接的布尔值变化,直接使用break来跳出循环。关键词break、continue都可以达成跳出循环的功能,但两者还有一定的区分:
break跳出的是它所在的循环,即break该循环就不继续。
continue只是跳出此次循环,仍执行剩余代码

例如

for i in range(1, 10):
    if i % 2 == 0:
        continue
    print(i)

打印出来结果是 1、3、5、7、9

而假如使用break的话如下:

for i in range(1, 10):
    if i % 2 == 0:
        break
    print(i)

打印出来的则只有1

和分支结构一样,循环结构也可以进行嵌套。下面用嵌套循环来输出九九乘法表:

"""
输出乘法口诀表(九九表)
"""

for i in range(1, 10):
    for j in range(1, i + 1):
        print('%d*%d=%d' % (i, j, i * j), end='\t')
    print()
课后练习

今天的习题我的操作部分和文字资料内的解法不太一样,我都贴一下以免有错误。

练习1 输入一个正整数判断是不是素数

提示:素数指的是只能被1和它本身整除的、大于1的整数
代码如下:

"""
练习1:输入一个正整数判断是否为素数
"""
from math import sqrt
num = int(input("请输入一个正整数: "))
is_prime = True
end_num = int(sqrt(num))
test_num = 2
while is_prime:
    if num > 1 and num % test_num == 0 and test_num <= end_num:
        print("%d 不是素数" %num)
        break
    elif test_num < end_num:
        test_num += 1
    else:
        print("%d 是素数" %num)
        is_prime = False

官方解法:

"""
输入一个正整数判断它是不是素数

Version: 0.1
Author: 骆昊
Date: 2018-03-01
"""
from math import sqrt

num = int(input('请输入一个正整数: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
    if num % x == 0:
        is_prime = False
        break
if is_prime and num != 1:
    print('%d是素数' % num)
else:
    print('%d不是素数' % num)
练习2 输入两个正整数,计算他们的最大公约数和最小公倍数

代码如下:

num_1 = int(input("输入第一个正整数"))
num_2 = int(input("输入第二个正整数"))
gcd = 1
if num_1 > num_2:
    num_1, num2 = num_2, num_1  # 互换
for i in range(num_1, 1, -1):
    if num_1 % i == 0 and num_2 % i == 0:
        gcd *= i
        num_2 /= i
        num_1 /= i
print("最大公约数为 %d" % gcd)
print("最小公倍数为 %d" % (num_1 * num_2 * gcd))

官方代码如下:

"""
输入两个正整数计算它们的最大公约数和最小公倍数

Version: 0.1
Author: 骆昊
Date: 2018-03-01
"""

x = int(input('x = '))
y = int(input('y = '))
# 如果x大于y就交换x和y的值
if x > y:
    # 通过下面的操作将y的值赋给x, 将x的值赋给y
    x, y = y, x
# 从两个数中较的数开始做递减的循环
for factor in range(x, 0, -1):
    if x % factor == 0 and y % factor == 0:
        print('%d和%d的最大公约数是%d' % (x, y, factor))
        print('%d和%d的最小公倍数是%d' % (x, y, x * y // factor))
        break
练习3 打印如下所示的三角形图案。

代码如下:

"""
打印如下所示的三角形图案
*
**
***
****
*****

    *
   **
  ***
 ****
*****

    *
   ***
  *****
 *******
*********
"""

for i in range(1,6):
    print("*"*i)

for i in range(1,6):
    print(" "*(5-i) + "*"*i)

for i in range(1,6):
    print(" "*(5-i) + "*"*(2*i - 1))

官方代码如下:

row = int(input('请输入行数: '))
for i in range(row):
    for _ in range(i + 1):
        print('*', end='')
    print()


for i in range(row):
    for j in range(row):
        if j < row - i - 1:
            print(' ', end='')
        else:
            print('*', end='')
    print()

for i in range(row):
    for _ in range(row - i - 1):
        print(' ', end='')
    for _ in range(2 * i + 1):
        print('*', end='')
    print()

本文在作者学习完文字内容后,以列出标题大纲的方式让自己填充内容,以求对学习的内容有一个复习的作用,同时对照文字学习材料进行修正,尽量保证不误人子弟。如有错误之处还请朋友们多多指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值