《练习100》16~20

题目16

import re

# 输入一行字符,分别统计出其中英文字母,空格,数字,和其它字符的个数
# python str 提供了一些方法用于判断:
# 字母: str.isalpha() 如果字符串中的所有字符都是字母,并且至少有一个字符,返回 True ,否则返回 False 。
# 数字: str.isdigit() 如果字符串中的所有字符都是数字,并且至少有一个字符,返回 True ,否则返回 False 。
# 空格: str.isspace() 如果字符串中只有空白字符且至少有一个字符则返回 True ,否则返回 False 。

# 第一种方法: 利用str提供的一些方法来识别
def str_parse(s: str):
    content = {'alpha': [], 'space': [], 'digit': [], 'other': []}
    for i in s:
        if i.isalpha():
            content['alpha'].append(i)
        elif i.isspace():
            content['space'].append(i)
        elif i.isdigit():
            content['digit'].append(i)
        else:
            content['other'].append(i)
    return content

# 第二种方法,利用re模块 是用正则匹配?我正则表达式一般,反正能用就行
def str_parse1(s: str):
    content = {'alpha': [], 'space': [], 'digit': [], 'other': []}
    regex = re.compile(r'[a-zA-Z]')
    x = regex.findall(s)
    content['alpha'] = x

    regex = re.compile(r'[0-9]')
    x = regex.findall(s)
    content['space'] = x

    regex = re.compile(r' ')
    x = regex.findall(s)
    content['digit'] = x

    regex = re.compile(r'[^0-9\w ]')
    x = regex.findall(s)
    content['other'] = x
    return content

str1 = r'das154qwe4r1asdqw4&%$#@   fasd  fs 165a4s6fa    )(!#@$%^&^'

content = str_parse1(str1)
print(f"字母的个数为{len(content['alpha'])},它们是{content['alpha']}\n \
        空格的个数为{len(content['space'])},它们是{content['space']}\n \
        数字的个数是{len(content['digit'])},它们是{content['digit']}\n \
        其它字符的个数是{len(content['other'])},它们是{content['other']}")

题目17

# 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如:2+222+222+2222+22222(共有5个数字相加,几个数相加由键盘控制)
# 思路:a,aa,aaa,aaaa,aaaaa 正好是a的重复1次,2次,3次,4次,5次 (输入的是5)
# 利用字符串的*实现重复,利用字符串的+ 实现2+22...
# 利用sum(list)实现最终求和 
def get_sum(cnt: int, num: int):
    str1 = ""
    num_list = []
    for i in range(cnt):
        str1 = str1 + str(num) * (i + 1)

        if i != cnt - 1:
            str1 += "+"
        num_list.append(int(str(num) * (i + 1)))

    return {'key': sum(num_list), 'value': str1}


while True:
    try:
        num = int(input('请输入需要重复的数字:\n'))
        cnt = int(input(f'请输入数字{num}重复的次数\n'))
        dict1 = get_sum(cnt, num)
        print(f'{dict1["key"]} = {dict1["value"]}')
    except ValueError as e:
        print('请输入数字!!!', e)
        break

题目18

# 一个数如果恰好等于它的因子之和,这个数就称为'完数'。例如6=1+2+3编程找出1000以内的所有完数
# 现在求因子,把以前的求质因子的改造一下就能用了

def get_sum_factor(num:int):
    temp = []
   
    for i in range(1, num):
       if num % i == 0:
            temp.append(i)

    # print(temp)
    if sum(temp) == num:
        print_str = f"{num} = "
        for j, i in enumerate(temp):
            if temp[0] == i and not j:
                print_str += f"{i}"
            else:
                print_str += f"+{i}"
        print(print_str)

for i in range(2, 1001):
    get_sum_factor(i)
# 6 = 1+2+3
# 28 = 1+2+4+7+14
# 496 = 1+2+4+8+16+31+62+124+248

题目19

# 一个球从100米的高度落下,每次落地后反弹的高度为原来的一半。第10次落地时,共经过多少米?第十次反弹有多高?
def get_height(start, times):
    print(f"初始高度为:{start}米,", end='')
    height_sum = 100
    for i in range(times):
        # 每次落地后反弹的高度为原来的一半
        start /= 2
        # 弹起后落下:路程是高度的2倍
        height_sum += start * 2
    print(f'第{times}次高度为:{start:.3f}米,共经过{height_sum:.3f}米')


get_height(100, 10)
# 初始高度为:100米,第10次高度为:0.098米,共经过299.805米  

题目20

# 猴子吃桃问题:猴子第一天摘下若干桃子,当即吃了一般,还不过瘾,又多吃了一个。以后每一天都吃了前一天剩下的一半多一个,第10
# 天吃前发现剩下一个桃子。求第一天共摘了多少

# 若从第一天开始算:没有具体的数字,从第十天开始算,那么第十天为1个桃子
# 第九天: (1 + 1) * 2
# 第八天:  (4 + 1) * 2
#  ...          ...
# 十天时间,猴子只吃了9次桃子

def calc_peaches_number(left, day):
    """ 返回第一天的桃子数量
    left: 剩下的桃子数量
    day: 天数
    """
    
    before = 0
    cur = left
    for i in range(day,1,-1):
        before = (cur + 1) * 2
        cur = before
                
    print(cur)
    
calc_peaches_number(1,10)

你可能感兴趣的:(Python学习笔记,python,学习,开发语言)