如标题所示,由于嵩天老师的那本书的课后习题的大题部分缺少答案,于是下面的代码是自己在看书期间尝试练习的结果,仅供同学参考。
#第2章第2题
sen=input("请输入一段文字:")
print("\n".join(sen)) #在print函数中,“\n”的转义效果就很明显
#把一个字符串拆分成由字符组成的列表【不能变成集合,因为集合的话会自动去重】的话是不是直接list()
list1=list(sen)
#第2章第3题 #这道题涉及到把字符转换为有效的可以计算的值#没有那么复杂,eval可以自动识别
try:
equ = eval(input("请输入一个合法的算式:"))#如果不是算式,可以检验其是否合法吗?
except:
print("输入的公式不合法,请重新输入,如1+3")
equ = eval(input("请输入一个合法的算式:"))
print(equ)
#第2章第4题
equ = eval(input("请输入一个小数:"))
# print("您输入的小数的整数部分是:{}".format(round(equ))) #这个保留的是四舍五入的整数值,还不太准确。
#print("您输入的小数的整数部分是:{:d}".format(equ))
list1=str(equ).split(".")
print(list1[0])
#第2章第5题
n=eval(input("请输入整数N:"))
#请输入整数N:8
sum=0
for i in range(1,n+1):
global sum
sum = sum+i
print("1到N的求和结果:{}".format(sum))
#1到N的求和结果:36
#第3章第1题 输入该整数百位及以上的数字
num = eval(input("请输入一个整数:"))
print("该整数百位及以上的数字是:{}".format(num//100))
#第3章第2题
string=input("请输入一个字符串(以空格分隔):")
str = string.split(" ")#变成了一个list
print("\n".join(str)) #注意斜杠的方向
#第3章第3题 这道题相对比较复杂不过不能 我们或许可以定义一个字典
week = {"1":"星期一","2":"星期二","3":"星期三","4":"星期四","5":"星期五","6":"星期六","7":"星期日"}
day = input("请输入数字(1-7):")
print("今天是:{}".format(week.get(day)))
#第3章第4题 判断回文数 涉及到一个将数字反向排列的方法(之前好像有遇到过)
def reverse(get):
new = list(get)
new.reverse()
rev = "".join(new)
if rev == get:
print("输入的这个数是回文数。")
else:
print("输入的这个数不是回文数。")
#将字符串反转是Python中常常考察的题了
get = input("请输入一个数(用于判断是否为回文数):")
reverse(get)
#第3章第5题
num = eval(input("请输入一个十进制的整数:"))
print("其二进制的形式为:{:b}".format(num))
print("其八进制的形式为:{:o}".format(num))
print("其十六进制的形式为:{:X}".format(num))
#第4章第1题 判断是否为闰年
#闰年的判断标准是(1)被4整除但不能被100整除(2)能够被四百整除?
#判断条件有点复杂,给它两次机会。
year = eval(input("请输入一个年份:"))
def yeardeside(year):
if year%400==0:
print("该年份为闰年。")
else:
if year%4==0 and year%100!=0: #python这边条件之间使用的参数是,and or
print("该年份为闰年。")
else:
print("该年份不为闰年。")
yeardeside(year) #此year为用户输入的数值。
#第4章第2题 计算两个整数之间的最大公约数和最小公倍数
#最大公约数的计算方法:辗转相除法
#最小公倍数的计算方法:两个数的乘积除以最大公约数
#涉及到取余 两个数之中较小的那一个再除 涉及到判断的情况 直到最后余零 这时的被除数就是最大公约数
a = eval(input("请输入一个较大的数:"))
b = eval(input("请输入一个较小的数:"))
c = b #保留b的值,因为b的值在循环的过程中会发生改变
d = a #保留a的值,因为a的值在循环的过程中会发生改变
while a%b !=0:
r = a%b
a = b
b = r
print("这两个数的最大公约数是:{}".format(b))
print("这两个数的最小公倍数是:{}".format((d*c)/b)) #除法产生的结果为浮点数
#第4章第3题 统计不同字符的个数,包括中英文字符,数字,空格和其他字符的个数
#我感觉这题有点复杂,拿到要一个字符一个字符的判断嘛
#不用,我看到的网上的解决思路是这样的,以输入的那个序列为基准,在里面则在原来的基础上加一,不在里面,则以自己为第一个。
#res 相当于是定义了一个字典,按照键去取值,默认值为0,存在则取出相应的值(两种解决思路)
#能不能按照值的大小进行排序输出
sen = input("请输入一行字符:")
def count(sen):
res = {} #定义一个空的字典集
for i in sen: #逐个遍历sen中的元素
res[i]=res.get(i,0)+1
#对单词的统计值进行由高到低的排序(自然而然会想到的事情)
items = list(res.items()) #把没有顺序的字典转换为有顺序的列表
items.sort(key = lambda x:x[1],reverse=True) #排序
return items #缩进注意
count(sen)
#书上这块输入列表数量最多的前十个,也值得我去学习,这串代码。
for i in range(10):
word,count = items[i] #返回列表第一个元素,为一个键值对的元组
print(word,count) #输出的格式可适当调整。一行一行输出
#第4章第4题 #主要考察异常处理的处理方式
try:
num = eval(input("请输入一个整数:"))
except:
print("输入错误!请输入一个整数。")
continue #结束本次循环,继续下一次循环
#第4章第5题 #羊车门游戏
#使用random库 对于这个随机事件进行预测
#预测参赛者改变选择和坚持选择获胜的概率
#主持人开启另一扇门,露出门后山羊,更不更换(即自己所指的是汽车还是山羊之间赌
from random import * #引入random库,随机生成一组数(这组数的性质由不同的函数所决定)
a = randint(1,3) #用户随机指出另一扇门 #固定设定1,2为羊 3为车
if a == 3:
rate = 1/3
print("不改变选择获胜的概率为{}".format(rate))
else:
rate = 2/3
print("改变选择获胜的概率为{}".format(rate))
#这道题实际上就是通过多次抽样得到胜利的次数,而概率就是从抽样这个过程中找到规律
from random import *
x=randint(5000,10000) #抽样的次数
change=0
nochange=0
for i in range(1,x+1):
a=randrange(1,4) #汽车所在的位置
b=randrange(1,4) #用户选的位置
if a==b:
nochange=nochange+1 #不改变计数为1,只有不改变才能获胜
else:
change=change+1 #改变计数为1,改变才能获胜
print("不更改选择得到汽车的概率为{}".format(nochange/x))
print("更改选择得到汽车的概率为{}".format(change/x))
#第5章 第2题 整数 异常处理 质数 为true,否 为false
def intprocess(num):
#判断整数类型,异常判断
if(type(num) == type(1)):
for i in range(2,num):
if num%i == 0: #如果存在可以整除的其余项目,则不予考虑
return False
else:
i == num-1
return True
else:
print("输入的参数不为整数!重新输入!")
#第5章 第3题 统计传入字符串中的字母,数字,空格以及其他字符的个数
def count(str):
res = {}
for i in str:
res[i]=res.get(i,0)+1
items = list(res.items())
items.sort(key = lambda x:x[1],reverse=True) #排序
return items #缩进注意
#第5章第4题 打印200以内的所有素数
#素数:除了1和它本身再没有其他因子的数
def sushu(num):
a = [1]
for i in range(1,num+1):
for j in range(2,i):
if i%j == 0 : #如果存在可以整除的其余项目,则不予考虑
break
else:
if j == i-1: #遍历到最后的,还是没有遇到整除的
a.append(i)
#print("{0}以内的素数为:{1}".format(num," ".join(str(a))))
#str(a)这里我的还是很不准确
#这也就是上次出错的地方 #似曾相识,我是如何解决的呢?
#首先把列表中的元素一点点取出来,然后转换为字符串,然后再用join拼接
ls2 = [str(i) for i in a] #这一句代码特别重要,把数列中的数值全部转换为字符串
b = " ".join(ls2)
print(b)
#第5章第5题 斐波那契数列
#第3位数是第1次循环的b
#第4位数是第2次循环的b
#第n位数是第n-2次循环的b
#所以最大到第n-2次循环,n-2+1=n-1
def facci(n):
a = 1
b = 1
for i in range(1,n-1):
c = b
b = a+b
a = c
return b
#第6章 第1题:英文字符频率统计(就是可能一大段序列中有各种字符,仅仅是统计英文字符出现频率的统计)
#这让我想到了用perl语言处理碱基序列这块(还是很神奇的啊)
#它这个是在特定的范围内去统计频率
#首先定义一个字典,key =abc~Z,value初始化为零。如果getkey能够找到,则value加一。
def EngCount(str):
va = {"a":0,"b":0,"c":0,"d":0,"e":0,"f":0,"g":0,"h":0,"i":0,"j":0,"k":0,"l":0,"m":0,"n":0,"o":0,"p":0,"q":0,"r":0,"s":0,"t":0,"u":0,"v":0,"w":0,"x":0,"y":0,"z":0}
ls = list(str)
for i in ls:
if va.get(i,"*") == "*": #这个判断语句有问题 #后来修正了看出了问题所在
break
else:
va[i]=va.get(i)+1
items = list(va.items())
items.sort(key = lambda x:x[1],reverse=True) #排序
return items
#在逐个遍历的过程中
EngCount("xshaxvhasvchasvhbxsabhsv")
#第6章 第2题 统计中文字符出现的频率(想把大叔的诗作弄下来,然后去统计字频,那一定很有趣)
import os
os.chdir("E:\\S-code\\Pythoncode") #设定新的工作目录,test.txt文件要存放在这个工作目录下
os.getcwd() #查看现在的工作目录
'E:\\S-code\\Pythoncode' #显示的是我们最新设定的,就代表设定成功
f = open("pose.txt","rt") #test.txt为文件名,rt为读取文件的方式
s = f.readlines() #读取文件,输出结果为一个列表
pose = {}
for line in s:
ls = list(line)
for i in ls:
if i in ",。、":
break
else:
pose[i]= pose.get(i,0)+1
items = list(pose.items())
items.sort(key = lambda x:x[1],reverse=True)
for i in range(1,11):
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))
f.close()
#这里虽然能够对出现的中文字符,但是如果能够出现常用的词语的搭配就更好了
#词云
import jieba
f = open("pose.txt","r")
txt = f.read()
f.close()
words = jieba.lcut(txt)
counts={}
for word in words:
if len(word)==1:
continue
else:
counts[word]=counts.get(word,0)+1
items = list(counts.items())
items.sort(key = lambda x:x[1],reverse=True)
for i in range(1,11):
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))
#第6章 第3题 随机密码的生成
import random
codelist = ["A","a","B","b","C","c","D","d","E","e",1,2,3,4,5,6,7,8,9,0]
for i in range(1,11):
secret = random.sample(codelist,8)
#把列表变成字符串
new =[str(i) for i in sectet] #这一句代码特别重要,把数列中的数值全部转换为字符串
print("{}".format("".join(new)))
#第6章 第4题 重复元素判定
def rep(ls):
#逐个的遍历列表各元素(这里就涉及到算法了)
#在我印象中,算法是什么呢,就是解决问题的方法,而这种解决问题的方法可以通过不同的语言来实现
#算法具体解决的是怎么做的问题,就像解一道数学题有不同的思路
for i in range(0,len(ls)): #这里的嵌套循环是值得借鉴的
for j in range(i+1,len(ls)):
if ls[i] == ls[j]:
print("糟糕!有重复值!")
break
else:
continue
a = [1,2,3,1,1,5,3,5,4,6]
rep(a)
#第6章 第5题 利用集合的无重复性改编这道程序
def rep(ls):#在命名变量的时候,不要和语言本身的关键字重复,要不然程序会傻傻分不清
#逐个的遍历列表各元素(这里就涉及到算法了)
#在我印象中,算法是什么呢,就是解决问题的方法,而这种解决问题的方法可以通过不同的语言来实现
#算法具体解决的是怎么做的问题,就像解一道数学题有不同的思路
a = set(ls) #转为集合
b = list(a) #集合再转换为列表
if b == ls:
print("安全!无重复值!")
else:
print("糟糕!有重复值!")
a = [1,2,3,2]
rep(a)
#第7章 第1题 统计该字符在文件中出现的次数
#发现定义一个函数真的要方便很多,到时候直接调用就行
import os
os.chdir("E:\\S-code\\Pythoncode")
def charcount(ch):
word ={ch:0} #定义一个字典,默认值为零
f = open("diary.txt","rt")
p = f.readlines()
for i in p: #读取每一行,存放在一个列表之中
for j in i: #再对每一行的字符串进行分解成字符
if j ==ch:
word[ch]=word.get(ch,0)+1
count = word.get(ch,0)
print(count)
charcount("我")
#第7章 第2题 大写字母转小写 小写字母转大写(好无聊的要求,估计是看看我们熟不熟悉这部分操作吧)
#这个函数也是逐个遍历,逐个操作处理的过程
#通过做这道题学会了文件另存为的操作,怎样写入一个新的文件中
import os
os.chdir("E:\\S-code\\Pythoncode")
f = open("englishText.txt","r+")
w = open("new.txt","a+")
p = f.readlines() #每行被存储为列表
for i in p: #读取每一行,存放在一个列表之中
for j in i: #再对每一行的字符串进行分解成字符
if j.islower():#小写转换为大写
change = j.upper()
w.write(j.replace(j,change))#替换
else: #大写转换为小写
change = j.lower()
w.write(j.replace(j,change))
w.close()
f.close()
#第7章 第3题 这道题分为两步操作
#(1)随机生成一个10*10的矩阵,以空格分隔行向量,换行符分隔列向量保存。
#(2)另存为一个csv类型的文件,以逗号分隔保存。
#使用random库,随机生成一个整数,先打印行再打印列。
import os
os.chdir("E:\\S-code\\Pythoncode")
from random import *
f = open("sq.txt","w+") #这是覆盖写
for i in range(1,11):
line = "" #把每一行定义为一个字符串这个思路特别好
for j in range(1,11):
line += "{0:<.2f}\t".format(random())
f.write(line+"\n")
f.close()
o = open("sq.txt","r+")
line = o.readlines() #每一行读成了列表中的元素
c = open("newsq.csv","w+")
for i in line:
new = i.strip("\t\n").split("\t") #各种点之间有一定的逻辑关系
print(new)
ls = ""
for j in new:
ls +="{0},".format(j)
c.writelines(ls+"\n") #没有c.writeline(),只有writelines()
#注意缩进,我觉得缩进在Python中表示的是一种逻辑关系,所以务必谨慎
c.close()
o.close()