2022-05-18 Python课后作业

题目1:打印一个九九乘法表

需求分析:

99乘法表的样子?


99乘法表.png

思路:

1、两层循环用
2、外层循环range(1,10)
3、内层循环range(1,i+1)
4、完成乘法的表达式
5、内层循环结束后外层每循环一次就打印一次换行

答案:

for i in range(1,10):
    for j in range(1,i+1):
        print(f'{j}', '*', f'{i}', '=', i * j, end=' ')
    print()

题目2:在 0~99 之间随机抽取一个偶数

需求分析:

1、偶数就是可以被2整除的数
2、范围是0-99
3、随机

思路:

1、使用random
2、random.randint(a, b) 返回一个随机整数 N,范围是:a <= N <= b
3、随机抽取一个,所以取到满足条件的就要跳出循环

答案:

import random
while True:
    a = random.randint(0,99)
    if a % 2 ==0:
        print(a)
        break

题目3:编写一个双色球的开奖模拟程序。

需求分析:

1、双色球有红蓝两种颜色的球
2、中奖号码是6个随机红球加一个随机
3、红球是1-33
4、篮球是1-16

思路:

1、随机取多个用random.sample(population, k)
2、红球和篮球拼起来就是开奖结果
3、range(a,b)a开始到b-1
答案:

import random
while True:
    red = random.sample(range(1,34),6)
    blue = random.sample(range(1,17),1)
    break
print("本期开奖结果为:",red ,' ', blue)

题目4:计算 1000000 以内所有偶数的和。

需求分析:

1、偶数怎么表示?x % 2 == 0
2、累加的偶数

思路:

找规律
1,1
2,2
3,4
5,8
6,16
7,32
n,2^(n-1)

答案:

num = 1
for i in range(1,65):
    num += pow(2,i-1)
print(num)

题目5:模拟抛硬币,打印出每次抛掷的结果

需求分析:

1、如果抛硬币的次数小于 100,则打印每次的结果,否则不打印
2、统计最终正面和反面的次数

思路:

1、用随机模块
2、从内向外,先实现最基本的随机打印正反面
3、把循环体放到外层条件下

答案:

import random

n = int(input("请输入抛硬币的次数:"))
coin = ['正面','反面']
count1 = 0
acoin = 0
bcoin = 0
if n < 100:
    for i in range(n):
        ran = random.randint(0,1)
        print(coin[ran])
        count1 +=1
        if coin[ran] == '正面':
            acoin+=1
        else:
            bcoin+=1
else:
    for i in range(n):
        ran = random.randint(0,1)
        count1 +=1
        if coin[ran] == '正面':
            acoin+=1
        else:
            bcoin+=1

print(f"总共投掷了{count1}次")
print(f'正面:{acoin}次')
print(f'反面:{bcoin}次')

题目6:倒着打印99乘法表

需求分析:

给出了倒着打印的样式

思路:

1、两层循环

答案:

"""
倒着打印99乘法表--for循环的写法
"""
for i in range(1,10):
    for j in range(9,i,-1):
        print(j,'*',i ,'=',j*i,end=' ')
    print(1)

"""
倒着打印99乘法表--while循环的写法
"""
i = 1
while i <= 9:
    j = 9
    while j >= i:
        print(j,'*',i ,'=',j*i,end=' ')
        j -= 1
    print()
    i+=1

题目7:找出占比数量最多的两个元素

需求分析:

1、这两个元素的数量都需要超过总数的三分之一
2、摩尔投票法

思路

1、长度//3表示三分之一
2、循环列表中的每一个元素,并计算出现的次数
3、当出现的次数大于三分之一时,append到一个新的列表
4、由于循环可能导致重复的结果,可以讲列表转成set(集合)

答案:

a = [5,5,5,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
thirda = len(a)//3
# print(len(a))
# print(thirda)
b = []
for i in range(len(a)):
    if a.count(a[i]) > thirda:
        b.append(a[i])
        c = set(b)
print(c,"是出现次数超过1/3的数字")

题目8:找出列表中出现次数最多的一个数字

需求分析:

1、给定的列表 a = [5,5,5,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
2、打印出出现次数最多的数字和其出现的次数

思路:

1、遍历列表
2、找到每个元素出现的次数:
3、将次数append到一个空列表
4、max这个列表就能求出出现次数最多的次数,此时只是次数,还不知道谁出现了这么多次
5、如果将去重后的a中的每个数字遍历出来,作为key放到一个空字典中,把每个key出现的次数作为value放到字典的值中,那么遍历这个字典就可以得到出现次数最多的key和其对应的次数value

答案:

"""
方法1:
这里用了max方法和count方法
max(a,key=a.count) a,是一个可迭代对象,这里指列表a,key 参数指定一个用于比较的函数,在这里我们比较的是a中每个元素出现的次数,所以a.count。
既然max是出现次数最多的元素,那么a.count(max)就是这个元素出现的次数了
"""

a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
max = max(a,key=a.count)
print(max,'是出现次数最多的数,总共出现了',a.count(max),'次')

方法2:

"""
下面的a = list(d.keys())[list(d.values()).index(max(b))可能不太好理解,其实就是使用列表的index方法求得下标索引,并且通过下标索引求值
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
    j = a.count(i)
    d[i]=j
    b.append(j)
a = list(d.keys())[list(d.values()).index(max(b))]
print(a,'出现的次数最多,总共出现了',max(b),'次')

"""
也可以把你a中的每一个元素作为key放到字典中,把key出现的次数作为value与前面的key对应起来,然后写一个方法,找key
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
    j = a.count(i)
    d[i]=j
    b.append(j)
def get_key(x,val):
    for k,v in x.items():
        if v == val:
            return k
print(get_key(d,max(b)),'出现的次数最多,总共出现了',max(b),'次')

"""
或者也可以把遍历字典的方法写的而简单点
"""
a = [5,5,1,6,4,6,4,6,6,5,4,3,3,5,4,5,4,6,6,6,5,6,5,5,6]
b = []
d = {}
for i in a:
    j = a.count(i)
    d[i]=j
    b.append(j)
def get_key(x,val):
    return [k  for k,v in x.items() if val ==v]
print(get_key(d,max(b)),'出现的次数最多,总共出现了',max(b),'次')
# 这三种方式都可以得到正确的结果

题目9:创建一个 88 x 88 的随机整数矩阵(二维列表),然后匹配用户输入的整数是否与其中某元素相等,如果相等则打印其行号和列号

需求分析:

1、要求1:随机整数取值范围 0~1024
2、要求2:需找出所有匹配的元素

思路:

1、需要用到random
2、两层循环创建二维列表
3、匹配输入值:

答案:

import random

matrix = []
for i in range(88):
    matrix.append([]) # 外层循环加上一个空列表
    for j in range(88):
        matrix[i].append(random.randint(0,1024)) # 内层循环时往空的子列表中append随机数,循环88次 之后外循环再给一个空列表,内层循环随即在往空的子列表中append随机数
target = int(input("请输入一个目标整数:"))
is_find = 1
for i in range(len(matrix)):
    for j in range(len(matrix)):
        if target == matrix[i][j]:
            print(i,j)
            is_find = 0
if is_find == 1:
    print("没找到目标数值。")

题目10:请编程找出矩阵中的幸运数字。

需求分析:

1、某一个元素的值在同一行的所有元素中最小,并且在同一列的所有元素中最大,那么该元素便是幸运数字。
2、矩阵中数值的取值范围是 0~1024,且各不相同

思路:

1、先用两层循环创建一个列表矩阵(二维列表)
2、用len(matrix)表示行数
3、用len(matrix[0])表示列数
4、遍历矩阵,找到每行最小的数和每列最大的数
5、最小的数等于最大的数时,打印出来此时的元素

答案

matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
    
row = len(matrix)
col = len(matrix[0])
    
min_row = [1024] * row
max_col = [0] * col
    
# 遍历矩阵中的每一个元素
# 找到每行中最小的元素,并将它们存放到列表min_row中
# 找到每列中最大的元素,并将它们存放到列表max_col中
for i in range(row):
    for j in range(col):
        min_row[i] = min(matrix[i][j], min_row[i])
        max_col[j] = max(matrix[i][j], max_col[j])
    
# 遍历矩阵中的每一个元素
# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”
for i in range(row):
    for j in range(col):
        if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:
            print(matrix[i][j])

题目11:请将下面 matrix 矩阵反向展开

需求分析:

1、展开二维列表
2、倒序

思路:

1、两层循环
2、倒序

答案:

"""
迭代写法:
"""
matrix = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
lista = []
for i in matrix:
    for j in i:
        lista.append(j)
        lista.sort(reverse=True)
print(lista)

"""推导式写法"""
result = [j for i in matrix for j in i][::-1]

题目12:请使用列表推导式,获得 matrix 矩阵的转置矩阵 Tmatrix(将 matrix 的行列互换之后得到的矩阵,称为 matrix 的转置矩阵)。

需求分析:

1、转置之后原列表的行数等于新列表每一行的长度
2、原列表每一个行的长度等于新列表的行数
思路:
1、len(matrix) = len(Tmatrix[])
2、len(matrix) = len(Tmatrix)

答案:

"""列表推导式解法"""
""""""
matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12]]
Tmatrix = [[matrix[i][j] for i in range(len(matrix))] for j in range(len(matrix[0]))]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

"""迭代解法"""
matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12]]
Tmatrix = []
for i in range(len(matrix[0])):
    Tmatrix.append([])
    for j in range(len(matrix)):
        Tmatrix[i].append(matrix[j][i])
print(Tmatrix)

题目13:用户输入两个版本号 v1 和 v2,请编写代码比较它们,找出较新的版本。

需求分析:

1、版本号是由一个或多个修订号组成,各个修订号之间由点号(.)连接,每个修订号由多位数字组成,例如 1.2.33 和 0.0.11 都是有效的版本号。
2、从左到右的顺序依次比较它们的修订号,点号(.)左侧的值要比右侧的权重大,即 0.1 要比 0.0.99 大。

思路:

1、用split进行拆分
2、将两个版本号组装到一起
3、对组装后的迭代器进行遍历

答案:

"""fillvalue可以制定一个数字去补足两个版本号较少的那一个,这里用数字0来补足"""
from itertools import zip_longest

def comp(a,b):
    for i, j in zip_longest(a.split('.'), b.split('.'), fillvalue=0):
        if int(i) == int(j):
            # print("相等")
            continue
        if int(i) < int(j):
            # print("V2")
            return "V2"
        else:
            return "V1"
    return "相等"

a = input("请输入第一个版本号,V1: ")
b = input("请输入第二个版本号,V2: ")

print(comp(a,b))

题目14:编写一个加密程序,其实现原理是通过替换指定的字符进行加密,附加要求是实现密文逆向检测。

需求分析:

需求.png

通过上面输出结果可以看出要求有以下几点:
1、需要替换的和将要替换的,长度必须一致,否则不会打印密文
2、如果需要替换的和将要替换的出现了重复的元素,可以打印密文,但会告诉用户无法解密

思路:

1、使用str.makrtrans可以替换指定的字符
2、使用使用translate可以翻译成转化后的字符

答案:

a = input("请输入需要加密的明文:")
b = input("请输入需要替换的字符:")
c = input("请输入将要替换的字符:")
if len(b) != len(c):
    print("需要替换的字符数量必须跟将要替换的字符数量一致。")
else:
    print("加密后的密文是:",a.translate(str.maketrans(b, c)))
if len(set(b)) != len(b) or len(set(c)) != len(c):
    print("由于替换字符出现重复,该密文无法解密")

题目15:检测列表中的元素是否是回文数,并返回一个由回文数组成的新列表

需求分析:

回文数就是正反读都是一样的数字
通过上面输出结果可以看出要求有以下几点:
1、找到回文数
2、输出新的列表

思路:

1、使用反转字符串可以判断回文数
2、使用append()可以生成列表

答案1:

循环写法

a = ["123", "33211", "12321", "13531", "112233"]
b = []
for i in a:
    if i == i[::-1]:
        b.append(i)
    else:
        continue
print(b)

答案2:

列表推导式写法

a = ["123", "33211", "12321", "13531", "112233"]
[i for i in a if i == i[::-1]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容