题目81

#求一个数的绝对值(不借助内部函数)

# 正数的绝对值就是正数,负数的绝对值为0-负数
def my_abs(num:float):
    return 0-num if num < 0 else num

print(f'-112的绝对值是{my_abs(-112)}')

题目82

# 从下面两个列表中各取一个数,如果这两个数的和为10,那么就把这两个数组成一个元组,显示出来
# list1 = [3,6,1,8,1,9,2]
# list2 = [3,1,2,6,4,8,7]

# 正好练一下之前学的itertools.product
import itertools

list1 = [3,6,1,8,1,9,2]
list2 = [3,1,2,6,4,8,7]

for x,y in itertools.product(list1,list2):
    if x + y == 10:
        print(x,y)
        
#改一下
print(*[(x,y) for x,y in itertools.product(list1,list2) if x + y == 10])

题目83

# 求0~7能够组成的奇数的个数(最多是8位)
import itertools
import time
def gen_odd(length:int):
    list1 = []
    for i,j,k,l,m,n,o,p in itertools.product(range(8),range(8),range(8),range(8),range(8),range(8),range(8),range(8)):
        str1 = str(i) + str(j)+ str(k)+ str(l)+ str(m)+ str(n)+ str(o)+ str(p)
        num = int(str1)
        if len(str(num)) == length and num %2:
            list1.append(num)
    return len(list1)
# time_start = time.time()
# print(gen_odd(3))
# time_end = time.time()
# print(time_end - time_start)

# 上面那个方法太慢了执行一次要29.035秒
# 奇数的特点: 奇数的个位一定是奇数
# 一位奇数: 1 3 5 7 共四个                                      奇数个数:4
# 二位奇数: 个位的选择有4个,十位的选择只有7个                    奇数个数:7*4
# 三位奇数:个位选择有四个,十位选择有8个,百位选择有7个            奇数个数:7*8*4
# 四位奇数: 个位选择有四个,十位选择8个,百位选在8个,千位选择7个   奇数个数:7*8*8*4

# 以此类推:八位奇数的个数为:7*8*8*8*8*8*8*4
# 直接转换成列表的每一项的乘积
import numpy
def gen_odd_num(length:int):  
    """获取指定位数的数字中奇数的个数
    这些数字的每一位都在0~7这个范围

    Args:
        length (int): 位数

    Returns:
        _type_: 符合要求的指定位数的奇数的个数
    """
    if length <= 0:
        return 0
    # 先假设每一位上的选择都是8种(0~7)
    list1 = [8 for _ in range(length)]
    
    # 对于数字而言,其最高位不可能是0,那么其最高位只有7中选择
    list1[0] = 7
    
    # 对于奇数而言,其个位只能是奇数,只有四种选择1,3,5,7
    list1[-1] = 4
    
    # 至于为什么是上述顺序:1234 转换为字符串'1234', index = 0 的在数字中就是数字1234的最高位
    # 那么个位就是倒数第一位 index = -1
    return numpy.prod(list1)

odd_num = [gen_odd_num(x+1) for x in range(8)]

odd_sum = sum(odd_num)
for i,value in enumerate(odd_num):
    print(f'{i+1}位的奇数的个数是:{value}')

print('数字0~7组成的数字(至多8位)中奇数的个数为:',odd_sum)

题目84

# 用一行代码删除一个纯数字列表中小于10的数字

list1 = [1,12,33,11,2,33,90,9,0]
list2 = [x for x in list1 if x > 10]
print(list2)

题目85

# 身体的BMI检测
# 计算公式: BMI = 体重/(身高*身高) 体重:kg, 身高m
# BMI < 18.5 偏瘦
# 18.5 <= BMI < 24 正常
# 24 <=BMI < 28偏胖
# BMI >= 28 肥胖

def get_bmi_msg(bmi: float):
    if bmi <= 18.5:
        return "偏瘦"
    elif bmi < 24:
        return "正常"
    elif bmi < 28:
        return '偏胖'
    else:
        return '肥胖'

while True:
    try:
        mass = float(input('请输入体重(kg): \n'))
        height = float(input('请输入身高(m): \n'))
        if height > 3:
            raise TypeError(f'身高的单位是米哦,你有{height}米?????')
        bmi = mass/(height**2)
        print(f'身高:{height}米,体重:{mass}公斤,BMI = {bmi}, 评价:{get_bmi_msg(bmi)}')
    except ValueError:
        print('请输入整数或小数!!!!!')
    except TypeError as te:
        print('请输入正确的身高,')
08-11 14:14