Python编程序设计基础与应用答案4


每个题目均为自己设计的代码,优化与重构方面与标准答案可能有所不同。

​ 参考教材:Python程序设计基础与应用(机械工业出版社/董付国)

第六章

6-2拓展本章的例6-4,为向量类增加计算内积的功能。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Vector3:
    # 构造方法,初始化,定义向量坐标
    def __init__(self, x, y, z):
        self.__x = x
        self.__y = y
        self.__z = z

    # 两个向量相加,对应分量相加,返回新向量
    def add(self, anotherPoint):
        x = self.__x + anotherPoint.__x
        y = self.__y + anotherPoint.__y
        z = self.__z + anotherPoint.__z
        return Vector3(x, y, z)

    # 减去另一个向量,对应分量相减,返回新向量
    def sub(self, anotherPoint):
        x = self.__x - anotherPoint.__x
        x = self.__y - anotherPoint.__y
        x = self.__z - anotherPoint.__z

    # 向量与一个数字相乘,各分量乘以同一个数字,返回新向量
    def mul(self, n):
        x, y, z = self.__x*n, self.__y*n, self.__z*n
        return Vector3(x, y, z)

    # 向量除以一个数字,各分量除以同一个数字,返回新向量
    def div(self, n):
        x, y, z = self.__x/n, self.__y/n, self.__z/n
        return Vector3(x, y, z)

    # 两个向量的内积
    def dot(self, anotherPoint):
        result = self.__x * anotherPoint.__x + \
                 self.__y * anotherPoint.__y + \
                 self.__z * anotherPoint.__z
        return result

    def show(self):
        print('X:{}, Y:{}, Z:{}'.format(self.__x,
                                        self.__y,
                                        self.__z))

    # 查看向量长度所有分量平方和的平方根
    @property
    def length(self):
        return (self.__x**2 + self.__y**2 + self.__z**2)**0.5

# 用法演示
v = Vector3(3, 4, 5)
v1 = v.mul(3)
v1.show()
v2 = v1.add(v)
v2.show()
print(v2.length)
v3 = Vector3(1, 1, 1)
print(v.dot(v3))

6-3设计并实现一个数组类,要求能够把包含数字的列表、元组或range对象转换为数组,并能够修改数组中指定位置上的元素值。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Array:
    # 构造方法,初始化数值
    def __init__(self, args):
        if not args:
            self.__value = []
        else:
            self.__value = list(args)

    # 修改数组中指定位置的元素值
    def __item__(self, index, value):
        length = len(self.__value)
        # 根据下标修改元素值
        if isinstance(index, int) and 0<=index<length:
            self.__value[index] = value
        else:
            raise Exception("位置参数错误")
        return self.__value

    # 展示修改后的列表
    def show(self):
        print(self.__value)

# 用法演示
lst = Array([1, 5, 7, 11, 60])
lst.__item__(1, 90)
lst.show()

6-4设计并实现一个数组类,要求能够把包含数字的列表、元组或range对象转换为数组,能够使用包含整数的列表作为下标同时返回多个位置上的元素值。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Array:
    # 构造方法,初始化数值
    def __init__(self, args):
        if not args:
            self.__value = []
        else:
            self.__value = list(args)

    # 获取下标的元素值,支持使用列表或元组
    def __item__(self, index):
        length = len(self.__value)
        # 根据单个下标获取元素值
        if isinstance(index, int) and 0 <= index < length:
            print(self.__value[index])
        # 根据单个下标获取元素值
        elif isinstance(index, list):
            for i in index:
                if not (isinstance(i, int) and 0 <= i < length):
                    print('位置错误')
            result = []
            for item in index:
                result.append(self.__value[item])
            print(result)
        else:
            print('位置错误')

# 用法演示
lst = Array([1, 5, 7, 11, 60])
lst.__item__(1)
lst.__item__([0, 1, 3])

7-1 编写函数,接收一个字符串,返回其中最长的数字子串。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def long(s):
    # 接收字符串s,返回最长的数字子串
    # 一个列表储存单个数字,另一个列表储存合并后的数字
    lst_1 = []
    lst_2 = []
    for ch in s:
        # 如果这个元素是一个数字,则加入列表1
        if ch.isdigit():
            lst_1.append(ch)
        # 遇到了非数字,则将原来列表1的数字合并后放入列表2,重置列表1
        elif lst_1:
            lst_2.append(''.join(lst_1))
            lst_1 = []

    if lst_1:
        # 此时s中的每个元素都已经访问,若lst_1还残余数字,则将最后一组数字整合进列表2
        lst_2.append(''.join(lst_1))

    if lst_2:
        # 打印出最长的数字子串
        print(max(lst_2, key=len))


# 测试函数
long('fsgsgsh56498445sdgt781sd95447safasf415116')

7-2 编写函数,接收一句英文,把其中的单词倒置,标点符号不倒置,例如I like beijing.经过函数后变为:beijing. like I

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def sentence(s):
    # 接收英文后倒置输出
    # 创建一个列表来容纳每个单词
    lst = s.split()
    # 对列表的元素进行倒置并且合并
    lst = reversed(lst)
    sen = ' '.join(lst)
    print(sen)

# 代码测试
s = 'I like beijing.'
sentence(s)

7-3 编写函数,接收一个字符串,返回其中每个字符的最后一次出现,并按每个字符最后一次出现的先后顺序依次存入列表。例如,对于字符串‘abcda的处理结果为[‘b’, ‘c’, ‘d’, ‘a’],而字符串’abcbda’的处理结果为[‘c’, ‘b’, ‘d’, ‘a’]。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def last(s):
    # 创建列表来储存处理结果
    lst = []
    for ch in s:
        # 对列表中已经出现的移除,未出现的添加
        if ch in lst:
            lst.remove(ch)
        lst.append(ch)

    print(lst)

# 代码测试
last('abcda')
last('abcbda')

8-1编写程序,使用正则表达式提取另一个Python程序中的所有函数名。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re

# 接收需要提取的文件
fileneme = input("请输入一个Python程序的文件名或路径")
# 确定函数的基本格式
pattern = r'^def(\w+?)\(.*?\):'
func = []
# 打开文件提取函数名
with open(fileneme) as fp:
    for line in fp:
        # 逐行进行提取函数名
        result = re.findall(pattern, line)
        if result:
            func.extend(result)
print(func)

8-2 编写程序,使用正则表达式提取另一个Python程序中的所有变量名

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re

# 接收需要提取的文件
fileneme = input("请输入一个Python程序的文件名或路径")
# 确定变量名的所有基本格式
pattern = (r'(.+?) in',
           r'for (.+?) in',
           r'def \w+?\((.*?)\)',
           r' as (\w+?):')

func = []
# 打开文件提取对象名
with open(fileneme) as fp:
    for line in fp:
        # 将每行进行分割
        line = line.strip()
        for a in pattern:
            # 对变量的每种模式进行对比确认
            result = re.findall(a, line)
            if result:
                for item in result:
                    func.extend(item.split(','))

print(func)

8-3 假设有一句英文,其中某个单词中有个不在两端的字母误写作大写,编写程序使用正则表达式进行检查和纠正为小写。注意,不要影响每个单词两端的字母。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re

#  纠正错误的单词
def check(s):
    # 返回出问题的单词
    return re.sub(r'\b(\w)(\w+)(\w)\b',
                  lambda x: x.group(1) + x.group(2).lower() + x.group(3),
                  s)

text = check('BeauTIful Is beTTer tHAN UGLY')
print(text)

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
 上一篇
Python基础语法2 Python基础语法2
参考教材:Python程序设计基础与应用(机械工业出版社/董付国) ​ 由于时间紧迫,故只整理语法,没有写实例,在学习或复习过程中每个语法点都应搭配合适的例子进行练习。 第三章1.序列 列表 有序序列 可变序列 元组 有序
下一篇 
Python编程序设计基础与应用答案3 Python编程序设计基础与应用答案3
每个题目均为自己设计的代码,优化与重构方面与标准答案可能有所不同。 ​ 参考教材:Python程序设计基础与应用(机械工业出版社/董付国) 5-1 编写函数,接收圆的半径作为参数,返回圆的面积。 #!/usr/bin/env
  目录