第七章习题

这篇博客涵盖了Python编程中的多个实践主题,包括创建自定义数学和字符串模块,理解模块层级包,处理异常,实现数据类型转换,统计重复元素,操作元组,执行DOS命令,计算矩阵对角线和,找到数组的平衡点,分类和排序单词,奇偶数排序,查找列表中最常出现的首字母,以及通过前两个字母判断星期,以及设计石头游戏和2的幂次判断方法。这些都是提升Python编程技能的重要练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实现自己的数学模块mymath,提供有4个函数,分别为加减乘除,
在B模块中调用A模块的函数。
mymath.py的内容:

#encoding=utf-8
def add(*args):
    result = 0
    for i in args:
        result += i
    return result

def sub(a,b,*args):
    return a-b
 
def mul(a,b):
    return a*b

def div(a,b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("ZeroDivisionError: division by zero")
    return result

b.py的内容:

import mymath
print(mymath.add(10,20,30))
print(mymath.sub(10,20))
print(mymath.mul(10,20))
print(mymath.div(10,20))

2、实现自己的字符串模块mystr,里面有方法:isdigit,strip, join,split
mystr.py的内容:

#encoding=utf-8
def isdigit(s):
    for i in s:
        if i not in "0123456789":
            return False
    return True

def strip(s,strip_str=None):
    if strip_str == None:
        strip_str = "\r\n\t\f"
    s = list(s)
    s_copy = s[:]
    for i in s:
        if i in strip_str:
            s_copy.remove(i)
        else:
            break
    for i in s[::-1]:
        if i in strip_str:
            s_copy.remove(i)
        else:
            break
    return "".join(s_copy)

def join(lst,join_str=None):
    if join_str == None:
        join_str = ""
    result = ""
    for i in lst:
        result += (i + join_str)
    if join_str == "":
        return result
    return result[:-1]

def split(s,split_str=None,times=None):
    if split_str == None:
        split_str = " "
    if times == None:
        times = s.count(split_str)
    result = []
    index = 0
    split_str_length = len(split_str)
    while times > 0:
        temp = ""
        for i in range(index,len(s)):
            if s[i:i+split_str_length] != split_str:
                temp += s[i]
                index += 1
            else:
                result.append(temp)
                index += split_str_length
                break
        times -= 1
    result.append(s[index:])
    return result

if __name__ == "__main__":
    print(isdigit("876"))
    print(strip("$$igko$$$","$"))
    print(join(["1","2","3"],"*"))
    print(split("fgy|kiu|jhgf|sder","|"))

3、构建一个模块的层级包
在e盘下建立一个目录名称为:m_a
m_a目录下建立一个子目录:m_b
两个目录下分别建立一个__init__.py文件,文件内容为空
m_a目录下建立一个文件a.py,代码如下:

def sum(a,b):
    return a+b

m_b目录下建立一个文件b.py,代码如下:

def mul(a,b):
    return a*b

再在e盘下建立一个测试文件,x.py,代码如下:

#encoding=utf-8
import m_a.a
import m_a.m_b.b

print m_a.a.sum(1,1)
print m_a.m_b.b.mul(1,10)

4、实现一个除法函数,并处理异常

import traceback
def div(a,b):
    try:
        return a/b
    except ZeroDivisionError as e:
        print(traceback.print_exc())
        print("除数不能为0!")
    except Exception as e:
        print(traceback.print_exc())
        print(e)
        print("其他错误!")

div(1,0)

在这里插入图片描述
5、引发一个异常,并将它抛除到上层函数,上层函数捕获该异常并处理

def div(a,b):
    try:
        a/b
    except Exception as e:
        raise e
        
def test(a,b):
    try:
        print("开始调用除法函数")
        div(a,b)
        print("调用除法函数结束")
    except ZeroDivisionError as e:
        print("除数不能为0!",e)
    except Exceptiona as e:
        print("其他错误",e)
    print("错误处理后继续执行其他后续操作!")
    
if __name__== "__main__":
    test(1,0)

在这里插入图片描述
6、实现字符串、列表、元组和set之间互相转换

#转列表
#字符串转列表
s = "you are the best man"
s_list = list(s)
print(s_list)
#元组转列表
t = ("name","sex","age","school")
t_list = list(t)
print(t_list)
#set转列表
set1 = {1,2,"aa","XYZ"}
set1_list = list(set1)
print(set1_list)
#转字符串
#列表转字符串
lst = ['my','name','is','hh']
lst_str = "".join(lst)
print(lst_str)
#元组转字符串
t = ("name","sex","age","school")
t_str = "".join(t)
print(t_str)
#set转字符串
set1 = {1,2,"aa","XYZ"}
set1_str = "".join(set1)
print(set1_str)
#转元组
#字符串转元组
s = "you are the best man"
s_tuple = tuple(s)
print(s_tuple)
#列表转元组
lst =  ['name', 'sex', 'age', 'school']
lst_tuple = tuple(lst)
print(lst_tuple)
#set转元组
set1 = {"1","2","a","XYZ"}
set1_tuple = tuple(set1)
print(set1_tuple)
#转set
#列表转set
lst =  ['name', 'sex', 'age', 'school']
lst_set = set(lst)
print(lst_set)
#字符串转set
s = "you are the best man"
s_set = set(s)
print(s_set)
#元组转set
t = ("name","sex","age","school")
t_str = set(t)
print(t_str)

7、结合set对象,统计某个list出现的重复元素个数

lst = [1,1,2,2,3,4,5,5,6]
print("重复元素的个数:",len(lst)-len(set(lst)))

8、定义一个元组,向元组中添加元素或者修改已有元素,并捕获异常

t = (1,2,3)
try:
    t[0] = 4
except Exception as e:
    print(e)

在这里插入图片描述
9、删除无重复元组中给定的元素,并生成一个新元组

result = []
t = (1,2,3,4,5,6)
for i in t:
    if i == 4:
        continue
    else:
        result.append(i)

print(tuple(result))

在这里插入图片描述
10、有一个ip.txt,里面每行是一个ip,实现一个函数,ping 每个ip的结
果,把结果记录存到ping.txt中,格式为ip:0或ip:1 ,0代表ping成功,1
代表ping失败
11、实现DOS命令执行功能,接受输入命令并执行,然后把执行结果打
印到屏幕

def excute_dos_command(command):
    import os
    os.system(command)

excute_dos_command("dir")

在这里插入图片描述
12、求一个n*n矩阵对角线元素之和

arr = [[1,2,3],[4,5,6],[7,8,9]]
result = 0
for i in range(len(arr)):
    for j in range(len(arr[i])):
        if i == j:
            result += arr[i][j]

print("对角线之和为:",result)

在这里插入图片描述
13、输入一个数组,最大的与第一个元素交换,最小的与最后一个元素
交换,输出数组

def max_min_number(arr):
    max_item = arr[0]
    min_item = arr[0]
    for item in arr:
        if item > max_item:
            max_item = item
        if item < min_item:
            min_item = item
    arr[0] = max_item
    arr[-1] = min_item
    return arr

lst2 = [1,2,3,4,89,66,5,10]
print("交换后的数组:",max_min_number(lst2))

在这里插入图片描述
14、平衡点,一个数组,有一个数字左边所有的数字加起来的总和等于
这个数右边所有数字的总和,请输出这个数以及坐标

def balance_point(arr):
    num_dict = {}
    for i in range(len(arr)):
        if i >= 1:
            if sum(arr[:i]) == sum(arr[i+1:]):
                num_dict[arr[i]] = i
    return num_dict

arr = [1,2,3,4,5,1]
print(balance_point(arr))

在这里插入图片描述

arr = [1,2,3,4,5,1]
for idx,value in enumerate(arr):
    if sum(arr[:idx]) == sum(arr[idx+1:]):
        print(idx,value)
        break

在这里插入图片描述
15、将单词表中由相同字母组成的单词归成一类,每类单词按照单词的
首字母排序,并按每类中第一个单词字典序由大到小排列输出各个类别。
输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end
结束输入。
cinema
iceman
maps
spam
aboard
abroad
end
输出格式:一类单词一行,类别间单词以空格隔开。
aboard abroad
cinema iceman
maps spam

#encoding=utf-8

with open("e:\\a.txt") as file_obj:
    word_list = []
    words = file_obj.readlines()
    #如果当前位置后面的列表元素,也有相同字母组成的单词,加入单词列表
    for i in range(len(words)):
        for j in range(i+1,len(words)):
            #如果当前单词不在单词列表,且i位置和j位置的单词排序后得到的列表相等,都加入单词

列表
            if words[i] not in word_list and sorted(words[i])==sorted(words[j]):
                word_list.append(words[i])
                word_list.append(words[j])
print(word_list)

#遍历相同字母组成的单词列表,把相同的加入到一个子列表,然后把子列表加入到结果列表
result_list = []
for i in range(len(word_list)):
    #定义子列表,存储相同的单词
    tmp_list = []
    for j in range(i+1,len(word_list)):
        #如果当前单词不在子列表,且且i位置和j位置的单词排序后得到的列表相等,都加入子列表
        if word_list[i] not in tmp_list and  sorted(word_list[i]) == sorted(word_list[j]):
            tmp_list.append(word_list[i])
            tmp_list.append(word_list[j])
    #把子列表加入结果列表
    if tmp_list:
        result_list.append(tmp_list)
        

#打印结果列表里面的每个子列表,也就是相同的单词
for sub_list in result_list:
    tmp_str = ""
    for word in sub_list:
        tmp_str += word.strip() + " "
      
    print(tmp_str)

在这里插入图片描述
16、输入一个数组,实现一个函数,让所有奇数都在偶数前面
方法1:遍历数组,奇数的存一个列表,偶数的存一个列表,然后把奇数列表和偶数列表相加

def func1(arr):
    odd = []
    even = []
    for i in arr:
        if i % 2 != 0:
            odd.append(i)
        else:
            even.append(i)
    return odd+even

print(func1([1,2,3,4,5,6,7,8]))

方法2:按坐标遍历数组,如果是奇数,就在数组的开头位置插入

def func(arr):
    for i in range(len(arr)):
        if arr[i] % 2 == 1:
            arr.insert(0,arr.pop(i))
    return arr

print(func([1,2,3,4,5,6,7,8]))

在这里插入图片描述
17、lista=[‘a’,‘abc’,‘d’,‘abc’,‘fgi’,‘abf’],寻找列表中出现次数最多的第一个
字母,出现了几次
方法1:
首先求出所有的首字母列表
求出每个首字母出现的次数用字典保存
找出出现次数最多的首字母

lista = ['a','abc','d','abc','fgi','abf']
first_letter_list = []
for i in lista:
    first_letter_list.append(i[0])

first_letter_dict = {}
for letter in first_letter_list:
    first_letter_dict[letter] = first_letter_list.count(letter)

print(first_letter_dict)

for k,v in first_letter_dict.items():
    if v == max(first_letter_dict.values()):
        print("出现次数最多的字母:%s,出现次数:%d" %(k,v))

在这里插入图片描述
方法2:生成一个空字典用来存放首字母及出现次数
遍历列表,如果首字母在字典中,就把首字母的次数加一存到字典,如果不 在,就把首字母及次数存到字典中。
最后遍历字典找出次数做多的首字母。

lista = ['a','abc','d','abc','fgi','abf']
first_letter_dict = {}
for i in lista:
    if first_letter_dict.get(i[0]):
        first_letter_dict[i[0]] += 1
    else:
        first_letter_dict[i[0]] = 1

print(first_letter_dict)
for k,v in first_letter_dict.items():
    if v == max(first_letter_dict.values()):
        print("出现次数最多的字母:%s,出现次数:%d" %(k,v))

在这里插入图片描述
18、请输入星期几的前两个字母来判断一下是星期几,如果第一个字母
一样,则继续判断第二个字母

weeks = ['monday','tuesday','wendsday','thursday','friday','saturday','sunday']
while 1:
    first_word_list = [word[0] for word in weeks]
    first_letter = input("请输入第一个字母:")
    if first_letter not in first_word_list:
        break
    if first_word_list.count(first_letter) > 1:
        second_letter = input("请输入第二个字母:")
        for word in weeks:
            if word[0] == first_letter and word[1] == second_letter:
                print(word)
    else:
        for word in weeks:
            if word[0] == first_letter:
                print(word)

在这里插入图片描述
19、有一堆100块的石头,2个人轮流随机从中取1-5块,谁取最后一块就
谁win,编程实现此过程
20、实现一个方法,判断一个正整数是否是2的乘方,比如16是2的4次方
,返回True;18不是2的乘方,返回False。要求性能尽可能高

import math
def func(num):
    for i in range(int(math.sqrt(num)+1)):
        if pow(2,i) == num:
            return True
    return False

print(func(16))
print(func(18))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值