数据结构与算法:熟悉Python

说明:本次作业分为两部分。为方便批改作业,请同学们在完成作业时遵守下面规则:

  1. 请将第一部分作业的Python代码全部放入同一个文件,命名为dsa1_1.py,同样,第二部分代码放入dsa1_2.py 文件中,上交作业时将两个文件一起打包,命名为dsa1_学号_姓名.7z/.zip/.rar;
  2. 如果作业中对相关类或函数有明确命名/参数/返回值要求的,请严格按照要求执行;
  3. 有些习题会对代码的编写进行特殊限制,请注意这些限制并遵守;

作业在3月19日23:59时前提交到,随后会有提交作业链接。

第一部分:

  1. 创建一个函数 def dsa1_reverse(s,n),接受一个字符串和一个正整数n作为参数,返回把原字符串字符位置向右移动n个字符的字符串,例如接受的参数是"abcd"和1,返回的字符串是"dabc";接受的参数是"mnbol"和2,返回的字符串是"olmnb"。
  2. 创建一个函数 def dsa1_factorialSum(n),接受一个正整数n作为参数,返回s=1!+2!+3!+……+n!的值。
  3. 创建一个函数 def dsa1_generateDict(keys, values),接受两个长度相同的元组,用这两个元组中的所有数据组成一个字典并返回。如元组(1, 2, 3)和("abc", "def", "ghi")生成字典{1:"abc", 2:"def", 3:"ghi"}。
  4. 创建一个函数def dsa1_en2num(s),接受一个英文字符串作为参数,返回该字符串的整数表示。如输入"eight-nine",返回89,输入"one-two-three-four-five",返回12345。
  5. 创建一个函数 def dsa1_getUnion(s1,s2),接受两个字符串作为参数,返回两个字符串字符集合的并集。如接受的两个字符串为"abc"和"bcd",返回set([‘a’, ’b’, ’c’, ’d’])。
  6. 创建一个函数def dsa1_getDays(y,m),接受两个参数y和m,分别表示年和月,返回此年此月的天数。(如大月有31天,小月有30天,而闰年的2月有29天,平年则只有28天,年份如果能被4整除但不能被100整除或者能被400整除为闰年)
  7. 创建一个函数def dsa1_isNarcNum(n),接受一个参数n(n>=100),判断这个数是否为水仙花数(即满足如果这个数为m位数,则每个位上的数字的m次幂之和等于它本身,例如1^3 + 5^3+ 3^3 = 153,1^4+6^4+3^4+4^4=1634),返回True或者False。
  8. 创建一个函数 def dsa1_writeNarcNum(max),接受一个参数max(max>=1000),调用第7题编写的函数,求100到max之间的水仙花数,并且输出到一个名为narcissistic.txt的文件中,每个数作为一行输出。
  9. 创建一个函数def dsa1_readNarcNum(),读入第8题中输出的文件narcissistic.txt,以列表的形式返回文件中的水仙花数,列表的每个元素类型为int型,例如返回[153,370,371]。
  10. 创建一个函数def dsa1_printTri(n),接受一个参数n,在屏幕上打印出杨辉三角形的前n行,如下打印了6行:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

OOP部分

  1. 创建一个People类,People的属性有name和age,两个参数在实例化的时候传给构造器,People类的方法有getName和getAge,分别返回姓名和年龄。
  2. p= People(name,age)
    def getName(self)
    def getAge(self)

  3. 创建一个Student类,Student类继承上一题中的People类,并且增加了属性sno,sno表示学号,和增加了方法getSno。
  4. stu= Student(name,age,sno)
    def getSno(self)

  5. 创建一个Xdict类,继承自dict类(python中的字典类),使得Xdict类支持dict类的所有操作,并且增加一个方法getKeys,用于返回给定值对应的键的列表。(例如Xdict一个实例为xd=Xdict({2:"a", 3:"a", 4:(2,3)}),则xd.getKeys("a")返回值为[2,3])

class Xdict(dict):
def getKeys(self, value):
……