• Python第二周习题集(一)(Craps游戏 质数 公约数 公倍数 回文质数 21根火柴游戏 验证码 后缀名 骰子随机和)


    # 排列组合c(n,m)

    m = int(input('m = '))
    n = int(input('n = '))
    fm = 1
    for num in range(1, m + 1):
        fm *= num
    fn = 1
    for num in range(1, n + 1):
        fn *= num
    fmn = 1
    for num in range(1, m - n + 1):
        fmn *= num
    print(fm // fn // fmn)
    def f(x):
        """
        求函数x的阶乘
        :param x: 任意正整数
        :return: x的阶乘
        """
        y = 1
        for z in range(1, x + 1):
            y *= z
        return y
    
    
    if __name__ == '__main__':
        m = int(input('m = '))
        n = int(input('n = '))
        # 当需要计算阶乘的时候,不用再写循环,而是直接调用已经定义好的函数就可以了。
        print(f(m) // f(n) // f(m - n))

    #  Craps 游戏改进版

    from random import randint
    
    
    def roll_dice(n=2):
        total = 0
        for _ in range(n):
            total += randint(1, 6)
        return total
    
    
    # 改名字,选中要修改的名字,按中shift + F6
    from random import randint
    money = 1000
    while money >0:
        print('玩家总资产:%d' % money)
        while True:
            debt = int(input('清下注:'))
            if 0 < debt <= money:
                break
        go_on = False
    
        print('玩家摇出了%d' % roll_dice())
        if roll_dice() == 7 or roll_dice() == 11:
            print('玩家胜')
            money += debt
        elif roll_dice() == 2 or roll_dice() == 3 or roll_dice() == 12:
            print('玩家输')
            money -= debt
        else:
            go_on = True
        while go_on:
            roll_dice()
            print('玩家摇出了%d' % roll_dice())
            if roll_dice() == roll_dice():
                print('玩家胜!')
                money += debt
                go_on = False
            elif roll_dice() == 7:
                print('玩家输!')
                money -= debt
                go_on = False
    print('你已经破产!')

    #  判断质数

    from math import sqrt
    def is_prime(num):
    
        for factor in range(2,int(sqrt(num)) + 1):
            if num  % factor == 0:
                return False
        return num !=1 and True or False
     # 通过下面的if条件,可以在导入模块时不去执行下面的代码。
    # ctrl + 鼠标左键 可以查找解释定义。
    
    if __name__ == '__main__':
        num = int(input('请输入一个数判断是不是质数:'))
        print(is_prime(num))

    # 最小公倍数和最大公约数

    def lcm(x, y):
        # if x > y:
        #     (x, y) = (y, x)
        '''
        求最小公倍数
        :param x: 任意正整数
        :param y: 任意正整数
        :return: x和y的最小公倍数
        '''
        (x, y) = (y, x) if x > y else (x, y)
        for i in range(y, x * y + 1):
            if i % x == 0 and i % y == 0:
                return i
    
    
    def gcd(x, y):
        # if x > y:
        #     (x, y) = (y, x)
        #文档注释
        """
        计算最大公约数
        :param x: 任意正整数
        :param y: 任意正整数
        :return: 最大公约数
        """
        #
        (x, y) = (y, x) if x > y else (x, y)
        i = x
        while i > 0:
            if x % i ==0 and y % i == 0: # range(x, 0, -1) 从大到小。
                return i
            i -= 1
    
    
    if __name__ == '__main__':
        x = int(input('请输入第一个数x='))
        y = int(input('请输入第二个数y='))
        print('最小公倍数:', lcm(x,y))
        print('最大公约数:', gcd(x, y))

     # 判断回文质数

    from math import sqrt
    def is_prime(num):
    
        for factor in range(2,int(sqrt(num)) + 1):
            if num  % factor == 0:
                return False
        return num !=1 and True or False
    def is_palindrome(num):
        '''
        判断是不是回文数
        :param num: 非负整数
        :return: 是回文数返回True,不是回文数返回Flase.
        '''
        temp = num
        total = 0
        while temp > 0:
            total = total * 10 + temp % 10
            temp //= 10
        return num == total
    #and和or运算符都是带短路功能的运算符
    #如果and左边的表达式是Flase,那么右边的表达式被短路
    #如果or左边的表达式是True,那么右边的表达式被短路
    #所以左右两边的表达式放置的顺序可能会对执行效率产生明显的影响。
    if __name__ == "__main__":
        num = int(input('请输入一个数:'))
        print(is_palindrome(num))
        if is_palindrome(num) and prime_number(num):
            print('%是回文质数' % num)
        else:
            print('%f不是回文质数' % num)

    # 21根火柴的游戏,谁拿到最后一根,谁就输。每次拿的范围[1,4].保证计算机获胜。

    def game_match():
        total = 21
        while True:
            my_number = int(input('请输入你拿的火柴数:'))
            if 1 <= my_number <= 4:
                com_number = 5 - my_number
                total -= 5
                print('电脑拿完还有多少根', total)
            if total == 1:
                print('你输了')
                break
            else:
                print('请输入正确的火柴数!')
    
    
    if __name__ == '__main__':
        game_match()

    # 21根火柴游戏公平版

    from random import randint
    
    
    def main():
        total = 21
        while total > 0:
            print('还剩下%d根火柴' % total)
            while True:
                num = int(input('请输入你要拿的火柴数:'))
                if 1 <= num <= 4 and num <= total:
                    break
            total -= num
            print('你拿完之后还剩%d' % total)
            if total > 0:
                com = randint(1,min(4,total))
                print('电脑拿了%d根火柴' % com)
                total -= com
                if total == 0:
                    print('电脑拿走了最后一根火柴,电脑输了!')
                    break
            if total == 0:
                print('你拿走了最后一根火柴,你输了1')
    
    
    if __name__ == '__main__':
        main()

    #  根据给出的长度,生成相同长度的随机验证码,字母和数字构成的,区分大小写的。A-Z(65-90) a-z(97-122)

    #我写的!
    list1 = ''
    for x in range(65, 91):
        list1 += (chr(x))
    for y in range(97, 123):
        list1 += (chr(y))
    for z in range(0, 10):
        list1 += 'z'
    print(list1)
    
    from random import randint
    
    
    def main(x):
        """
        指定长度的验证码
        :param x: 指定长度
        :return: 生成指定长度的验证码。
        """
        list2 = ''
        for i in range(x):
            list2 += (list1[(randint(0, 61))])
        return list2
    
    
    if __name__ == '__main__':
        print(main(4))
    #老师评讲!
    
    import random
    
    
    def generate_code(code_len=4):
        """
        生成指定长度的验证码
        :param code_len: 指定长度
        :return: 由大小写字母和数字组成的指定长度的随机验证码
        """
        all_chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
        code = ''
        for _ in range(code_len):
            index = random.randint(0, 61)
            code += all_chars[index]
        return code
    
    
    if __name__ == '__main__':
    
        print(generate_code())
    # 根据输入的文件名,输出后缀名。
    #  我写的
    def main(file_name):
        position = file_name.rfind('.')
        if 0 < position < len(file_name)-1:
            suffix_name = file_name[position + 1:]
        else:
            suffix_name = ''
        return suffix_name
    
    
    if __name__ == '__main__':
        file_name = input('请输入文件名:')
        print(main(file_name))
    
    
     老师讲的!加了是否带点这个功能
    
    def get_suffix(filename, has_dot=False):
        """
        获取文件的后缀名
        :param filename:文件名
        :param has_dot: 是否带点
        :return: 文件的后缀名
        """
        pos = filename.rfind('.')
        if 0 < pos < len(filename) - 1:
            index = pos if has_dot else pos + 1
            return filename[index:]
        else:
            return ''
    
    
    if __name__ == '__main__':
        print(get_suffix('.avcc'))
        print(get_suffix('hello.jpg'))
        print(get_suffix('hello.c'))

    # 生成随机文件名,保证生成的文件名不会和之前的重复。 26个字母加10个数字,生成随机文件名

    # 我写的
    from
    random import random, randint import math def main(n): list1 = [] for x in range(65, 91): list1.append(chr(x)) for y in range(0, 10): list1.append(y) print(list1) list2 = [] for i in range(n): list2.append(list1[randint(0, 35)]) return list2 if __name__ == '__main__': print(main(11))

    # 骰子随机数之和,用list表示 1-(1,6)-6 2-(2,12)-11 3-(3,18)-16 4-(4,24)

    # 我写的
    from
    random import random, randint def main(n, m): """ n个骰子,掷m次的点数和 :param n: 骰子数 :param m: 掷的次数 :return: 点数和 """ list = [] total = 0 for i in range(n, 6 * n + 1): list.append(i) print(list) for _ in range(m): total += randint(n, 6 * n) return total if __name__ == '__main__': print(main(6, 4))
    #老师讲的
    from random import random, randint
    # 有了列表容器,我们可以使用1个变量来保存多个数据
    # 更为重要的是,我们可以使用循环对列表中保存的数据进行操作。
    
    
    def roll_dice(n=2):
        total = 0
        for _ in range(n):
            total += randint(1, 6)
        return total
    
    
    def main():
        """
        一个骰子掷6万次,每个面出现的次数
        :return: 每个面出现的次数
        """
    
        f = [0] * 11
        for _ in range(60000):
            face = roll_dice()
            f[face - 2] += 1
    
        for index, val in enumerate(f):
            print('%d点摇出的次数%d为%.2f%%' % (index + 2, val, f[index] / 600))
        # 直接通过for-in循环对列表进行遍历。
        for counter in f:
            print(counter)
    
    
    if __name__ == '__main__':
        main()

    # # 设计一个函数,计算传入列表的成绩的平均分,要求去掉一个最高分和一个最低分

    def main(n=2):
        grade_list = []
        total = 0
        for _ in range(n):
            grade = int(input('请传入成绩:'))
            grade_list.append(grade)
        # grade_list.sort()
        # grade_list = grade_list[1:-1]
        max_grade = min_grade = grade_list[0]
        for x in grade_list:
            if x > max_grade:
                max_grade = x
            if x < min_grade:
                min_grade = x
        grade_list.remove(max_grade)
        grade_list.remove(min_grade)
        for index, val in enumerate(grade_list):
            total += val
        print('平均分:%.2f' % (total / len(grade_list)))
    
    
    if __name__ == '__main__':
        main()
    #  名字加成绩,并输出最高分和最低分
    def main():
        names = ['刘备', '张飞', '曹操', '袁绍', '关羽', '赵云', '周瑜']
        scores = []
        for name in names:
            score = input('请输入%s的成绩:' % name)
            scores.append(score)
        min_scores = max_scores = scores[0]
        print(scores)
        name_min = name_max = names[0]
        for s in scores:
            if s > max_scores:
                max_scores = s
                name_max = names[scores.index(s)]
            if s < min_scores:
                min_scores = s
                name_min = names[scores.index(s)]
        print('%s最高分:%s' % (name_max, max_scores))
        print('%s最低分:%s' % (name_min, min_scores))
    
    
    if __name__ == '__main__':
        main()
    # 设计一个函数,从传入的列表中,找出第二大的函数,只能使用一次循环。(元组)tuple(集合)set
    # 自己写
    def main(n=4):
        list_in = []
        for _ in range(n):
            a = input('请输入你要传入的列表:' )
            list_in.append(a)
        print(list_in)
        list_in.sort()
        a_set = set(list_in)
        list1 = list(a_set)
        # n = len(list1)
        print(list1)
        list1.sort()
        print(list1)
        second_max = list1[-2]
        print('第二大的数为', second_max)
    # 老师讲
    def second_max(x):
        # tuple 元组  不可更改,占的空间小一些。安全一些,能用元组,不用列表。
        """
        输出最大值和第二大的值
        :param x: 输入的列表
        :return: 返回最大值和第二大的值
        """
        (m1, m2) = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
        for index in range(2, len(x)):
            if x[index] > m1:
                m2 = m1
                m1 = x[index]
            elif m1 > x[index] > m2:
                m2 = x[index]
        return m1, m2
    
    
    def main():
        my_list = [35, 79, 92, 92, 68, 55, 40]
        print(second_max(my_list))
    
    
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    采坑总结01
    Django设置联合唯一约束 -- migrate时报错处理
    Web前端开发资源整理
    kindEditor 使用
    Django模版语言自定义标签-实现前端 关联组合过滤查询
    django views视图函数返回值 return redirect httpresponse总结
    前端图片实现以瀑布流样式显示
    性能优化中CPU、内存、磁盘IO、网络性能的依赖(转)
    几种浏览器内核(百度百科)
    特殊格式文件(视频、声音等) 在数据库中的存储方式
  • 原文地址:https://www.cnblogs.com/zl666/p/8537556.html
Copyright © 2020-2023  润新知