每个题目均为自己设计的代码,优化与重构方面与标准答案可能有所不同。
参考教材: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)