Python数据分析、挖掘与可视化学习笔记3

第三章程序控制结构

3.1程序控制结构

  1. 顺序结构:按照语句的顺序,从上而下,一条一条地顺序执行
  2. 选择结构:又称“分支结构”,分支语句根据一定的条件决定执行那一部分的语句序列
  3. 循环结构:使一个语句组根据一定的条件执行若干次

3.2选择语句 (条件语句)

3.2.1 if语句

如果满足某种情况,那么就进行某种处理

if 表达式:
​​​​​​​        语句块

3.2.2 if...else语句

如果满足某种条件,就进行某种处理,否则进行另一种处理

if 表达式:
    语句块1
else:
    语句块2

3.2.3 if...elif...else多分支语句

如果满足某种条件,就进行某种处理,否则如果满足另一种条件则执行另一种处理

if 表达式1:
    语句块1
elif 表达式2:
    语句块2
elif 表达式3:
    语句块3

...
else:
    语句块n

 3.2.4 if语句的嵌套

if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2
else:
    语句块3
            

3.2.5练习题

【例1】判断奇偶数:编写一个程序,让用户输入一个整数,判断该数是奇数还是偶数。

num=int(input("请输入一个整数:"))
if num%2==0:
    print(f"{num}是偶数")
else:
    print(f"{num}是奇数")

【例2】成绩等级判断:编写一个程序,输入一个0-100之间的分数,根据以下规则输出等级:

  • 90-100: A

  • 80-89: B

  • 70-79: C

  • 60-69: D

  • 0-59: F

score = float(input("请输入成绩:"))
if score > 100 or score < 0:
    print("输入成绩无效")
elif score >= 90:
    print("您的等级为A")
elif score >= 80:
    print("您的等级为B")
elif score >= 70:
    print("您的等级为C")
elif score >= 60:
    print("您的等级为D")
else:
    print("您的等级为F")

【例3】比较三个数大小:编写一个程序,输入三个不同的整数,找出并输出最大的数。

a=float(input("请输入第一个数:"))
b=float(input("请输入第二个数:"))
c=float(input("请输入第三个数:"))
max_num=a
if max_num<b:
    max_num=b
if max_num<c:
    max_num=c
print("最大值是{}".format(max_num))
# print(f"最大值是{max_num}")

【例4】闰年判断:写一个程序,输入一个年份,判断它是否为闰年。
闰年规则:能被4整除但不能被100整除,或者能被400整除。

year=int(input("请输入一个年份:"))
if (year%4==0 and year%100!=0) or (year%400)==0:
    print(f"{year}年是闰年")
else:
    print(f"{year}年不是闰年")

【例5】计算器简单版:编写一个简单的计算器程序,输入两个数字和一个运算符(+、-、*、/),根据运算符进行相应的计算并输出结果。

a=float(input("请输入第一个数值:"))
operator=input("请输入运算符:(+、-、*、/)")
b=float(input("请输入第二个数值:"))

if operator=="+":
    print(f"{a}+{b}={a + b}")
elif operator=="-":
    print(f"{a}-{b}={a - b}")
elif operator=="*":
    print(f"{a}*{b}={a * b}")
elif operator=="/" and b!=0:
    print(f"{a}/{b}={a/b}")
else:
    print("输入有错误")

【例6】 三角形类型判断:编写一个程序,输入三角形的三条边长,判断它是什么类型的三角形:

  • 等边三角形(三边相等)

  • 等腰三角形(两边相等)

  • 普通三角形(三边都不相等)

  • 如果不能构成三角形,给出相应提示

a=float(input("请输入第一条边的长度:"))
b=float(input("请输入第二条边的长度:"))
c=float(input("请输入第三条边的长度:"))

if a+b>c and a+c>b and b+c>a:
    if a==b==c:
        print("该三角形是等边三角形")
    elif a==b or a==c or b==c:
        print("该三角形是等腰三角形")
    else:
        print("该三角形是普通的三角形")
else:
    print("这三条边不能构成三角形")

【例7】身体质量指数(BMI)计算与分类:编写一个程序,计算BMI并根据以下标准分类:

  • 输入:身高(米)和体重(千克)

  • 计算公式:BMI = 体重 / (身高²)

  • 分类标准:

    • 偏瘦:BMI < 18.5

    • 正常:18.5 ≤ BMI < 24

    • 过重:24 ≤ BMI < 28

    • 肥胖:BMI ≥ 28

h=float(input("请输入您的身高:"))
w=float(input("请输入您的体重:"))
BMI=h/(w**2)
if BMI < 18.5:
    print("偏瘦")
elif BMI >= 18.5 and BMI < 24:
    print("正常")
elif BMI >= 24 and BMI < 28:
    print("过重")
else:
    print("肥胖")

【例8】个人所得税计算:编写一个程序,根据月收入计算应缴纳的个人所得税(简化版):

  • 起征点:5000元

  • 税率表:

    • 0-3000元:3%

    • 3000-12000元:10%

    • 12000-25000元:20%

    • 25000-35000元:25%

    • 35000-55000元:30%

    • 55000-80000元:35%

    • 80000元以上:45%


income = float(input("请输入月收入: "))
base = 5000  # 起征点
taxable_income = income - base

if taxable_income <= 0:
    tax = 0
elif taxable_income <= 3000:
    tax = taxable_income * 0.03
elif taxable_income <= 12000:
    tax = 3000 * 0.03 + (taxable_income - 3000) * 0.10
elif taxable_income <= 25000:
    tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (taxable_income - 12000) * 0.20
elif taxable_income <= 35000:
    tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (taxable_income - 25000) * 0.25
elif taxable_income <= 55000:
    tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (taxable_income - 35000) * 0.30
elif taxable_income <= 80000:
    tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (55000 - 35000) * 0.30 + (taxable_income - 55000) * 0.35
else:
    tax = 3000 * 0.03 + (12000 - 3000) * 0.10 + (25000 - 12000) * 0.20 + (35000 - 25000) * 0.25 + (55000 - 35000) * 0.30 + (80000 - 55000) * 0.35 + (taxable_income - 80000) * 0.45

print(f"应缴纳个人所得税: {tax:.2f}元")

【例9】石头剪刀布游戏:编写一个完整的石头剪刀布游戏程序:

  • 玩家通过输入选择石头、剪刀或布

  • 电脑随机出拳

  • 根据游戏规则判断胜负:

    • 石头赢剪刀

    • 剪刀赢布

    • 布赢石头

  • 记录并显示比分(玩家胜、电脑胜、平局)

  • 提供"再来一局"选项,直到玩家选择退出

# 1. 石头剪刀布游戏
import random

options = ["石头", "剪刀", "布"]
player_score = 0
computer_score = 0
ties = 0

while True:
    print("\n--- 石头剪刀布游戏 ---")
    print("请选择: 1.石头  2.剪刀  3.布  0.退出")
    choice = input("您的选择 (0-3): ")
    
    if choice == '0':
        break
        
    if choice not in ['1', '2', '3']:
        print("无效选择,请重新输入")
        continue
        
    player_choice = options[int(choice) - 1]
    computer_choice = random.choice(options)
    
    print(f"您出了: {player_choice}")
    print(f"电脑出了: {computer_choice}")
    
    if player_choice == computer_choice:
        print("平局!")
        ties += 1
    elif (player_choice == "石头" and computer_choice == "剪刀") or \
         (player_choice == "剪刀" and computer_choice == "布") or \
         (player_choice == "布" and computer_choice == "石头"):
        print("您赢了!")
        player_score += 1
    else:
        print("电脑赢了!")
        computer_score += 1
        
    print(f"当前比分: 玩家 {player_score} - 电脑 {computer_score} - 平局 {ties}")

print("游戏结束!")
print(f"最终比分: 玩家 {player_score} - 电脑 {computer_score} - 平局 {ties}")

根据需要调整

3.3循环语句

3.3.1while循环语句

注意while的表达式一定要保证程序正常结束,否则会造成死循环

while 表达式:
    语句块(循环体)

3.3.2for循环语句

for 迭代变量 in 对象:
    语句块(循环体)

3.3.3循环嵌套

3.3.4练习题

【例1】打印数字序列:编写一个程序,使用循环打印1到10的数字,每个数字占一行。

# 使用for循环
print("使用for循环:")
for i in range(1, 11):
    print(i)

# 使用while循环
print("\n使用while循环:")
i = 1
while i <= 10:
    print(i)
    i += 1

【例2】计算1到n的和:编写一个程序,让用户输入一个正整数n,计算并输出1到n的所有整数之和。

# 使用for循环
n=int(input("请输入n的整数数值:"))
sum=0
for i in range(1,n+1):
    sum=sum+i
print(f"1到{n}的和为:{sum}")

# 使用while循环
i=1
sum=0
n=int(input("请输入n的整数数值:"))
while i<=n:
    sum=sum+i
    i=i+1
print("1到{}的和为:{}".format(n,sum))

【例3】乘法表:编写一个程序,打印5的乘法表(从1×5到10×5)。

# 使用for循环
for i in range(1,11):
    print(f"{i}*5={i*5}")

# 使用while循环
i=1
while i<=10:
    print(f"{i}*5={i*5}")
    i = i + 1

# 扩展:使用for循环打印99乘法表
for i in range(1,10):
    for j in range(1,i+1):
        print(f"{i}*{j}={i*j}",end="\t")
    print()



# 扩展:使用while循环打印99乘法表
i=1
j=1
while i<=10:
    j=1
    while j<=i:
        print(f"{i}*{j}={i*j}",end="\t")
        j=j+1
    print()
    i = i + 1

【例4】 统计正负数:编写一个程序,让用户连续输入10个整数,统计其中正数、负数和零的个数。

# 使用for循环
positive_count = 0
negative_count = 0
zero_count = 0

print("请输入10个整数:")
for i in range(10):
    num = int(input(f"第{i+1}个数字: "))
    if num > 0:
        positive_count += 1
    elif num < 0:
        negative_count += 1
    else:
        zero_count += 1

print(f"正数个数: {positive_count}")
print(f"负数个数: {negative_count}")
print(f"零的个数: {zero_count}")


# 使用while循环
positive_count = 0
negative_count = 0
zero_count = 0
i=1
print("请输入10个整数:")
while i<=10:
    num=int(input(f"请输入第{i}个数字:"))
    if num > 0:
        positive_count += 1
    elif num < 0:
        negative_count += 1
    else:
        zero_count += 1
    i+=1
print(f"正数个数: {positive_count}")
print(f"负数个数: {negative_count}")
print(f"零的个数: {zero_count}")

【例5】斐波那契数列前n项:斐波那契数列是一个经典的数学数列,其中每个数字是前两个数字之和。具体定义如下:

  • F(0) = 0

  • F(1) = 1

  • F(n) = F(n-1) + F(n-2) (当n≥2)

编写一个程序,输出斐波那契数列的前10项(0,1, 1, 2, 3, 5, 8, 13, 21, 34)。

# 使用for循环(并行赋值)
a,b=0,1
print(f"第1项为{a}")
print(f"第2项为{b}")
for i in range(3,11):
    # a = b
    # b = a + b##这样是错误的,相当于b新=b旧+b旧
    #应使用并行赋值
    a,b=b,a+b#a和b的更新同时进行
    print(f"第{i}项为{b}")

# 使用for循环(使用临时变量)
a,b=0,1
print(f"第1项为{a}")
print(f"第2项为{b}")
for i in range(3,11):
    c = a + b
    print(f"第{i}项为{c}")
    a=b
    b=c

#使用while循环
a,b=0,1
print(f"第1项为{a}")
print(f"第2项为{b}")
n=3
while n<11:
    a,b=b,a+b
    print(f"第{n}项为{b}")
    n+=1        

【例6】素数判断:编写一个程序,让用户输入一个正整数,判断该数是否为素数(质数),是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

#使用for循环
a=int(input("请输入一个正整数:"))

if a>0:
    if a==1:
        print(f"不是素数")
    elif a==2:
        print(f"是素数")
    else:
        is_prime =True
        for i in range(2, 11):
            if a % i == 0 and i != a:
                is_prime=False
                print(f"{a}不是素数")
                break
        if is_prime:
            print(f"{a}是素数")
else:
    print("错误")
# 使用for循环
a = int(input("请输入一个正整数:"))
if a > 0:
    if a == 1:  # 1不是素数
        print(f"{a}不是素数")
    elif a == 2:  # 2是素数
        print(f"{a}是素数")
    else:
        is_prime = True
        # 检查从2到a的平方根的所有数
        for i in range(2, int(a**0.5) + 1):
            if a % i == 0:
                is_prime = False
                break
        
        if is_prime:
            print(f"{a}是素数")
        else:
            print(f"{a}不是素数")
else:
    print("请输入一个正整数!")
# 使用for循环
a = int(input("请输入一个正整数:"))

if a <= 1:
    print(f"{a}不是素数")
else:
    is_prime = True
    for i in range(2, int(a**0.5) + 1):
        if a % i == 0:
            is_prime = False
            break
    
    print(f"{a}是素数" if is_prime else f"{a}不是素数")
# 使用while循环
a = int(input("请输入一个正整数:"))

if a <= 1:
    print(f"{a}不是素数")
else:
    is_prime = True
    i = 2
    while i < (int(a ** 0.5) + 1):
        if a % i == 0:
            is_prime = False
            break
        i += 1  # 添加这行:递增循环变量
    
    print(f"{a}是素数" if is_prime else f"{a}不是素数")

【例7】数字反转:编写一个程序,让用户输入一个整数,将该数字反转后输出(例如:输入12345,输出54321)。

# 方法1: 使用字符串反转
num=int(input("请输入一个整数,进行反转:"))
reversed_str = str(num)[::-1]
reversed_num = int(reversed_str)
print(f"反转后的数字: {reversed_num}")
#使用while循环
num = int(input("\n请输入一个整数: "))
reversed_num = 0
original = num
is_negative = False

# 处理负数
if num < 0:
    is_negative = True
    num = -num

while num != 0:
    digit = num % 10
    reversed_num = reversed_num * 10 + digit
    num = num // 10#将num除以10,然后取结果的整数部分,再赋值给num

# 如果是负数,添加负号
if is_negative:
    reversed_num = -reversed_num

print(f"{original} 反转后为: {reversed_num}")

【例8】寻找水仙花数:编写一个程序,找出100-999之间的所有水仙花数。
水仙花数:一个三位数,其各位数字立方和等于该数本身(例如:153 = 1³ + 5³ + 3³)

#使用for循环
for i in range(100,1000):
    a=i%10
    b=(i//10)%10
    c=i//100
    if i==a**3+b**3+c**3:
        print(f"{i}是水仙花数")
#使用for循环
for i in range(100,1000):
    num_str=str(i)
    if i==(int(num_str[0])**3+int(num_str[1])**3+int(num_str[2])**3):
        print(f"{i}是水仙花数")

【例9】猜数字游戏:编写一个完整的猜数字游戏:

  • 电脑随机生成一个1-100之间的数字

  • 玩家有7次猜测机会

  • 每次猜测后,程序提示"太大了"、"太小了"或"恭喜猜对了"

  • 如果猜对,显示用了多少次猜测

  • 如果7次都没猜对,显示正确答案并游戏结束

  • 游戏结束后询问是否再玩一次

#使用for循环
from numpy import random

num_com=random.randint(1,100)
print(num_com)
for i in range(7):
    num_pla = int(input("请输入:"))
    if num_com==num_pla:
        print(f"恭喜猜对了,您猜了{i+1}次")
        break
    elif num_com>num_pla:
        print("太小了")

    else:
        print("太大了")
else:
    # 只有当循环正常结束(没有通过break退出)时,才会执行这里的代码
    print(f"抱歉您的机会用完了,正确答案是{num_com}")

循环控制语句练习:break, continue, else在循环中的应用

【例1】找到1-50中第一个能被7整除的数

for i in range(1, 51):
    if i % 7 == 0:
        print(f"找到: {i}")
        break
else:
    print("没有找到符合条件的数")

【例2】1-20中不是3的倍数的数

for i in range(1, 21):
    if i % 3 == 0:
        continue
    print(f"{i}", end=" ")

3.4综合实例

【例1】利用蒙特卡罗方法计算圆周率

蒙特卡罗方法是一种基于随机抽样概率统计的数值计算方法,核心思想是通过 “大量随机试验模拟真实场景”,蒙特卡罗方法的本质是利用 “频率近似概率” 的统计学原理:当随机试验的次数足够多时,事件发生的频率会逐渐趋近于其理论概率。通过对问题构建 “概率模型”,重复生成随机样本并计算结果,最终用样本的统计均值(或其他统计量)作为问题的近似解。

import numpy as np

N=10000
M=0
for i in range(N):
    x,y=np.random.uniform(-1,1), np.random.uniform(-1,1)
    dis=x**2+y**2
    if dis <=1:
        M+=1
pi=4*(M/N)
print(pi)

优化:

import numpy as np

N = 10000
# 一次性生成所有点
x = np.random.uniform(-1, 1, N)
y = np.random.uniform(-1, 1, N)

# 向量化计算距离
distances = x**2 + y**2
M = np.sum(distances <= 1)

pi = 4 * M / N
print(f"估算的π值: {pi}")

【例2】打印出如下效果的实心三角形:

n=int(input("请输入打印行数:"))
for i in range(n):
    for j in range(i+1):
        print("*", end="")
    else:
        print() # 等价于print('\n',end='')

【例3】打印出如下效果的空心三角形:

n=int(input("请输入打印行数:"))
for i in range(n):
    for j in range(i+1):
        if j==0 or i==j or i==n-1 :
            print("*", end="")
        else:
            print(" ",end="")
    print()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值