课程代码:0661283
环境:jupyter-notebook
主要总结一些菜鸟教程上的题或者课后题。
学习参考:https://www.515code.com/posts/aibyzrwu/
菜鸟教程例题:https://www.runoob.com/python3/python3-examples.html (看到合并字典之前)
部分知识点小结
打印字符串
以两数相加为例,下面列出常用的打印方法。
num1 = input('请输入第一个数字:')
num2 = input('请输入第二个数字:')
sum = float(num1) + float(num2)
print('数字{0}和{1}的结果为{2}'.format(num1, num2, sum))
print('数字 %s 和 %s 的结果为 %.2f' % (num1, num2, sum))
print(f'数组{num1}和{num2}的结果为{sum}')
可以看到,我们可以像C语言那样使用控制符格式化输出字符串,也能使用Python的f-string(只需在字符串前加一个字符f即可)。
这里要注意一个地方:input()函数输入的值默认为str类型。
考试题
考完试,发现最后一题全排列有点难,但是完全不用怕,可以投机取巧用“随机法”(性能极差),下面上代码。
import random
m = '1234'
length = len(m)
tag = 0
se = {''}
for j in range(0, 1000):
ans = ''
s = m+''
for i in range(0,1000):
r = random.randint(0, length-1)
if s[r] in ans:
continue
elif s[r] == '-1':
continue
for a in s:
if a!='-1':
break
else:
tag = 1
if tag==1:
se.add(ans)
break
ans += s[r]
else:
se.add(ans)
se.remove('')
print(len(se))
se
查阅相关资料后,发现还有递归法。
这个方法的核心在于交换,下面是原理图。
a = '123'
l = list(a)
def allSort(l, start, end):
if start == end:
print(l)
for i in range(start, end):
# 交换
l[i], l[start] = l[start], l[i]
allSort(l, start+1, end)
# 再换回来
l[i], l[start] = l[start], l[i]
allSort(l, 0, len(l))
第三种方法:深搜
# 深搜
a = '123'
l = list(a)
num = [-1 for i in range(0,len(a))]
visited = [False for i in range(0,len(a))]
def dfs(index):
if index == len(a):
print(num)
return
for i in range(0, len(a)):
if not visited[i]:
visited[i] = True
num[index]=l[i]
dfs(index+1)
visited[i] = False # 回溯
dfs(0)
第二章课后题
2-5 精确计算 2除以6,要求结果输出 1/3(分数形式)
from fractions import Fraction
a = Fraction(2,6)
print(a)
2-8 字符串倒序
s1 = "map"
# 方法1
print(s1[::-1])
# 方法2
l = list(s1)
l.reverse()
s2 = ''.join(l)
print(s2)
2-9 用户输入一个单词,并显示单词长度
s = input()
len(s)
2-10 每个单词首字母大写
s = "Python is a widely used high-level, general-purpose, interpreted, dynamic programming language."
s1=""
for i in range(0,95):
if i>0 and s[i-1]==' ':
s1 = s1 + s[i].upper()
else:
s1 = s1 + s[i]
s1
2-11 切片取列表
list = ["python","java","c","c++","lisp"]
# 第一项
print(list[:1])
# 第三项
print(list[2:3])
# 第五项
print(list[-1:])
2-12 生成一个由100以内能被5整除的数组成的列表,然后将该列表的数字从大到小排序
ans=[]
for x in range(5,101):
if(x%5==0):
ans.append(x)
ans.sort(reverse=True)
# 注意 list 排序
ans
2-13 创建一个字典,以citys中元素为key,codes中元素为value
citys=["suzhou","shanghai","hangzhou","nanjing"]
codes=["0512","021","0571","025"]
d={}
i=0
for x in citys:
d[x] = codes[i]
i+=1
d
第二章总结:无非是Python几种数据类型的基本操作,建议多看一下这些类型的内建函数,可以简化很多代码。
第三章课后题
3-1 在0~9间随机选择一个整数,操作100次,统计共有几种数字,并用字典的方式输出每个数字的出现次数,键是出现的整数,值是出现的次数。
import random
d = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0}
for i in range(0,101):
a = random.randint(0,9)
d[a]+=1
d
或者
import random
d = {}
for i in range(0,101):
a = random.randint(0,9)
if a in d:
d[a]+=1
else:
d[a]=1
d
3-2 将整数2016的每个数字分离出来,依次打印输出。
a = 2016
s = str(a)
for i in s:
print(i)
或者
a = 2016
ans = 0
while(a):
temp = a % 10
a //= 10 # 注意这里要用双斜杠除法
print(temp)
3-3 已知字典{“name”:“python”,“book”:“python”,“lang”:“english”},要求将该字典的键和值对换。(注意有值重复)
d = {"name":"python","book":"python","lang":"english"}
ans = {}
for i in d.keys():
temp = d[i]
ans[temp] = i
ans
# 由于有值重复,所以对换后结果如下:
# {'python': 'book', 'english': 'lang'}
3-4 已知一段程序中,用列表保存几个用户名,例如[‘xiaoxifeng’, ‘cangcang’, ‘tom’],要求通过终端输入新的用户名,判断所输入的用户名是否为已经设置好的用户名,并且对判断结果给出友好的提示。如果不是,允许用户多次尝试输入,直到正确为止。
user = ['xiaoxifeng', 'cangcang', 'tom']
while(1):
s = input()
if s in user:
print("正确,程序结束")
break
else:
print("用户名有误,请重新输入")
3-5 找一段英文的文本,统计该文本中单词的出现次数。比如 “How are you.How are you.” 的统计结果是 {“how”:2, “are”:2, “you”:2}。
s = "How are you.How are you."
s = s.lower() # 变小写
d = {}
temp = ""
for i in range(0, len(s)):
if s[i] != ' ' and s[i] != '.':
temp += s[i]
else:
print(temp)
if temp in d:
d[temp] += 1
else:
d[temp] = 1
temp = ""
d
3-6 已知字符串 ‘aAsmr3idd4bgs7Dlsf9eAF’,要求编写程序,完成如下任务。
① 将字符串中的数字取出,并输出成一个新的字符串。
s = 'aAsmr3idd4bgs7Dlsf9eAF'
s1 = ''
for i in s:
if i in '0123456789':
s1 += i
s1
也可以用ascii码方式来写,python中使用ord('a')
方式打印a的ascii码,使用chr(97)
方式打印字符。
② 统计字符串中每个字母的出现次数(忽略大小写),并输出成一个字典。
s = 'aAsmr3idd4bgs7Dlsf9eAF'
s = s.lower()
d = {}
# a-z 97-122
for i in s:
if ord(i) >= 97 and ord(i) <= 122:
if i in d:
d[i] += 1
else:
d[i] = 1
d
③ 去除字符串多次出现的字母,不区分大小写,如 ‘aAsmr3idd4bgs7Dlsf9eAF’ 去除后,输出 ‘asmr3id4bg7lf9e’。
s = 'aAsmr3idd4bgs7Dlsf9eAF'
s = s.lower()
ans = ''
# a-z 97-122
for i in s:
if i in ans:
continue
else:
ans += i
ans
3-7 有一百个瓶子,分别编号为1~100。现在有人拿枪从第一个开始射击,每枪击破一个,跳过一个,一直到一轮完成。接着在剩下的瓶子里面再次击破第一个,间隔一个再击破一个。问最后剩下完整的瓶子是这一百个瓶子里的第几个?
l = []
for i in range(0, 100):
l.append(i)
while len(l)>1:
m = 0
for r1 in l:
if m==0:
l.remove(r1)
m=1
if m==1:
m=0
continue
print(l[0]+1) # 因为之前用的编号为0~99,因此加1为正确答案:64
3-8 写一段程序,能够实现如下功能。
① 输入英文的姓名
② 按照字典顺序将所有姓名排序
③ 输入完毕,将排序结果打印出来
num = input("请输入姓名个数:")
l = []
for i in range (0, int(num)):
name = input("姓名" + str(i+1) + ":")
l.append(name)
l.sort() # 按字典序升序排列
l
3-16 创建PayCalculator类,拥有pay_rate属性,以每小时人民币数量为单位。该类拥有compute_pay(hours)方法,计算给给定工作时间的报酬,并返回。
class PayCalculator:
pay_rate = 20 # 每小时20元
def compute_pay(self, hours):
return hours*self.pay_rate
# 实例化
x = PayCalculator()
x.compute_pay(2)
# 输出 40
3-17 创建SchoolKid类,初始化小孩的姓名,年龄。也有访问每个属性的方法和修改属性的方法。然后创建ExaggeratingKid类,继承SchoolKid类,在子类中覆盖访问年龄的方法,并将实际年龄加2。
class SchoolKid(object):
def __init__(self, name, age):
self.__name = name # 前面两个下划线代表name为私有成员变量
self.__age = age
def setName(self, name):
self.__name = name
def setAge(self, age):
self.__age = age
def getName(self):
return self.__name
def getAge(self):
return self.__age
class ExaggeratingKid(SchoolKid):
def __init__(self, name, age):
super(ExaggeratingKid, self).__init__(name, age)
def getAge(self):
return SchoolKid.getAge(self) + 2 # 子类调用父类必须传self
s = ExaggeratingKid("banana", 20)
print(s.getAge())
更多内容,欢迎访问https://www.515code.com/