自学python中,此文章目的为记录练习过程,同时督促自己每天练习一道python题目,题目来源于网络,代码由自己书写,初学者,仅为记录,大佬不喜勿喷,尽量书写注释,如有错误,欢迎指正,如果有推荐的题目可以评论
目前感觉对python的基础编程掌握的好一点了,我并不是做代码开发的,所以并不需要过多深入学习语言,所以主要就更新这么多了,不定期会做一两道题巩固语言
第一天(2022.12.5)
企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
money=float(input("请输入当月利润(单位:万):"))
money1=[100,60,40,20,10,0]
# 提成档位
raters=[0.01,0.015,0.03,0.05,0.075,0.1]
# 提成比例
money2=0
# 提成总金额
for i in range(len(money1)):
if money-money1[i]<0:
# 计算是否达到档位,达到进行计算,未到达则跳过该档位
continue
else:
money2=(money-money1[i])*raters[i]+money2
# 计算提成金额并且和之前计算的提成金额相加
money=money-(money-money1[i])
# 计算剩余金额,以便后续档位计算
print(f"应发奖金总数为{money2}万元")
运行结果如下:
第二天(2022.12.6)
输出 9*9 乘法口诀表
for i in range(1,10):
# 设定一个1到9的for循环,步长不写默认为1
print()
# 换行
for j in range(1,i+1):
# 以当前循环的i为界限设定第二个循环
print(f"{i}*{j}={i*j}\t",end='')
# 输出结果
运行结果如下:
第三天(2022.12.7)
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
原题目链接第十三题
for i in range(100, 1000):
s = str(i)
# 将i转化成字符串类型以便使用函数
if int(s[-1]) ** 3 + int(s[-2]) ** 3 + int(s[-3]) ** 3 == i:
print(i)
else:
continue
PS:这道题没有想到特别好的思路,想到的几个都比原作者的占用资源,所以我就把原作者的进行了一下改进,节省一点地址空间(一丢丢)
第四天(2022.12.8)
将一个整数分解质因数。例如:输入90,打印出90=233*5
num = int(input('请输入需要分解的整数\n'))
# 这里我没写输入验证去判断输入的是不是一个整数,只写功能,不然太冗余了
num1 = num
# 讲输入的整数提前存储留作后面做验证
list1 = []
# 创建一个列表储存分解出来的质因数
while True:
# 不确定有几个质因数,所以创建无限循环并且设置出口
for i in range(2, num + 1):
# 从2到当前值判断质因数
if num % i == 0:
# 判断当前值是否为因数
if num // i == 1:
# 判断当前值是否是本身,是则不改变值,不是则计算出除因数后的值
num = num
else:
num = num // i
list1.append(i)
# 将判断出的因数加入列表
break
if num == i:
# 如果当前循环值等于本身则判断目前所有因数之积是否和输入的数字相等
list2 = 1
for j in range(len(list1)):
list2 = list1[j]*list2
# 用for循环将所有因数相乘
if list2 == num1:
break
# 判断相等即可退出循环
print(list1)
# 打印列表
运行结果如下:
PS:虽然写了注释,但是思路这个东西不是一句两句可以说清楚的,想弄明白最好自己打个断点多走几遍(大佬就当没看见这句话)
第五天 (2022.12.9)
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?(我稍微做了一下修改,高度和次数由用户手动输入)
原题目链接第二十题
high=float(input('请输入高度'))
count=int(input('请输入弹跳次数'))
length=0
for i in range(1,count+1):
if i!=count:
# 只计算到最后一次落地时走过的路程,弹起后不算
length=high*1.5+length
elif i==count:
length=high+length
high=high/2
print(f"最后的高度是{high},走过的路程是{length}")
运行结果如下:
第六天(2022.12.10)
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
PS:这道题如果像作者一样用for循环做会很简单,不过就有点浪费这道题了,这是一道很经典的递归问题,所以我打算使用递归思想来做,并且让用户输入天数
原题目链接第二十一题
def monkey(day):
if day==1:
return 1
# 递归到最后一层设置出口返回1(其实这里把1改成参数,就也使得最后一天剩的数量也可以手动输入了)
else: peach=(monkey(day-1)+1)*2
return peach
day=int(input('请输入猴子吃桃的天数'))
print(monkey(day))
运行结果如下:(这猴子真能吃,第一天吃了700多)
第七天(2022.12.11)
求1+2!+3!+…+20!的和。(这道题用循环很简单,所以接着昨天继续使用递归思想做)
原题目链接第二十五题(第二十六题就直接把factorial函数单独调用就可以了)
def add(num):
# 计算和的函数
if num==1:
return 1
else:
num1=add(num-1)+factorial(num)
# 当前数的阶乘加上之前所有数的阶乘和
return num1
def factorial(num):
# 计算阶乘的函数
if num==1:
return 1
else:
return factorial(num-1)*num
# 当前数的阶乘
num=int(input('请输入整数'))
print(add(num))
输出结果如下:(太大了不好验证,所以使用4)
第八天(2022.12.12)
求一个3*3矩阵主对角线元素之和。 (原题目比较简单,我就加了个能让用户输入)
原题目链接第三十八题
mat = []
# 创建一个空列表储存矩阵
def shuru():
mat1 = []
# 第二个空列表储存一行矩阵
while True:
mat2 = input('请按行输入矩阵,以‘#’结束输入')
if mat2 == '#':
break
mat.append(list(mat2.split(' ')))
shuru()
# 调用函数
result = 0
# 设置参数储存结果
for i in range(len(mat)):
print(mat[i])
for i in range(len(mat)):
# 循环每一行矩阵
try:
result += int(mat[i][i])
# 无异常就直接累加
# 设置这个是防止输入的不全,比如第一行是【1,0,0】结果只输入了【1】
except:
result += 0
# 如果报异常了就直接+0
print(result)
输出结果如下:
第九天(2022.12.13)
计算两个矩阵相加。(跟昨天的题目相接近,可以继续套用部分代码,所以做这道题,同样是让用户输入)
原题目链接第四十四题
mat = []
matrix = []
matadd = []
transitionMat=[]
# 创建空列表储存矩阵
def shuru(matr):
num=0
# 创建一个参数储存最长列数
mat1 = []
# 第二个空列表储存一行矩阵
while True:
mat2 = input('请按行输入矩阵,回车结束一行输入,‘#’结束矩阵输入')
if mat2 == '#':
break
matr.append(list(mat2.split(' ')))
for i in range(len(matr)):
if len(matr[i])>num:
num=len(matr[i])
return num
# 返回最长列数
print('请输入第一个矩阵')
long1 = shuru(mat)
# 调用函数
print('请输入第二个矩阵')
long2 = shuru(matrix)
# 调用函数
if len(mat) != len(matrix) or long1 != long2:
# 判断两个矩阵的形状是否相等,相等继续计算,不相等告诉用户不相等
print('输入的两个矩阵不满足相加的最基本条件,即两个矩阵的形状不同')
else:
for i in range(len(mat)):
# 创建两个for循环以行数和列数作为循环次数创建一个空的相同形状的列表用以接受数据
for j in range(long1):
transitionMat.append(0)
# 用0占位
matadd.append(transitionMat)
# 将一行追加到里面
transitionMat=[]
# 追加一行后清空中转列表,为什么不用clear函数看昨天的代码的注释
for i in range(len(mat)):
for j in range(long1):
try:
matadd[i][j] = int(mat[i][j]) + int(matrix[i][j])
# 计算加和,改成'*'就可以变成计算乘积
except:
try:
matadd[i][j] = int(mat[i][j]) + 0
# 如果用户输入不全则会进入这里,默认为0继续计算
except:
matadd[i][j] = 0 + int(matrix[i][j])
# 如果用户输入不全则会进入这里,默认为0继续计算
print('输入的第一个矩阵是')
for i in range(len(mat)):
print(mat[i])
print('输入的第二个矩阵是')
for i in range(len(matrix)):
print(matrix[i])
print('最后的结果是')
for i in range(len(matadd)):
print(matadd[i])
# 这一段就是输出结果,没什么好说的
输入结果如下
第十天(2022.12.14)
python挑战里的鸡兔同笼问题,给出我的答案以及在解释器把这个问题重写并注释
python挑战 (bugfree.cc)https://bugfree.cc/challenge/Python/AnUaapython挑战答案如下
解释器重写如下
def rabbit_and_chick():
head=int(input('请输入头的数量'))
foot=int(input('请输入脚的数量'))
# 两个输入
rabbit=(foot-head*2)/2
# 兔子比小鸡多两只脚,所以假设兔子和小鸡都抬起两只脚
# 那么剩下的脚就都是兔子的了,除2之后就是兔子的数量了
chick=head-rabbit
# 兔子的数量知道之后小鸡的数量自然也就知道了
print(f'兔子的个数是{rabbit}')
print(f'小鸡的个数是{chick}')
rabbit_and_chick()
运行结果如下
第十一天
题目 使用lambda来创建匿名函数(今天只是复习匿名函数以及三目运算符,所以没写太复杂)
原题目链接第四十九题
# 题目 使用lambda来创建匿名函数。
# lambda 函数语法
# lambda 参数:条件以及结果,lambda函数只能写一行,故需要条件判断可以使用三目运算符
# 使用lambda函数
MAX=lambda x,y:x if x>y else y
MIN=lambda x,y:x if x<y else y
print(MAX(1,2),MIN(1,2))
运行结果如下
第十二天(2022.12.17)
昨天阳了,发烧在床上躺了一天,今天两道题把昨天的补上
篮球比赛是高分的比赛,领先优势可能很快被反超。作为观众,希望能在球赛即将结束时,就提早知道领先是否不可超越。体育作家Bill James发明了一种算法,用于判断领先是否“安全”。
算法描述:
-
获取领先的分数 ,减去3分;
-
如果目前是领先队控球,则加0.5;否则减0.5(数字小于0则变成0);
-
计算平方后的结果;
-
如果得到的结果比当前比赛剩余时间的秒数大,则领先是“安全”的。
原题目链接第二题
score=int(input('请输入领先的分数'))
time=int(input('请输入比赛的剩余时间'))
ball=int(input('请输入是否为领先队伍控球,是:1,否:2'))
if ball==1:
score+0.5
else:score-0.5
if score<0:score=0
if score**2>time:
print('领先队伍是安全的')
else:print('领先队伍不是安全的')
输出结果:
小明单位发了100元的购物卡,小明到超市买三类洗化用品:洗发水(15元)、香皂(2元)、牙刷(5元)。要把100元正好花掉,可有哪些购买组合?
原题目链接第四题
soap=2
toothbrush=5
shampoo=15
for i in range(0,int(100/15)):
for j in range(0,int(100/5)):
for k in range(0,int(100/2)):
if 10*1+5*j+2*k==100:print(f'可购买的组合为,洗发水{i}瓶,牙刷{j}把,肥皂{k}块')
输出结果如下
第十三天(2022.12.18)
设计一个猜数游戏。首先由计算机产生一个[1,100]之间的随机整数,然后由用户猜测所产生的随机数。根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You won !”,游戏结束。用户最多可以猜7次,如果7次均未猜中,则显示“You lost !”,并给出正确答案,游戏结束。游戏结束后,询问用户是否继续游戏,选择“Y”则开始一轮新的猜数游戏;选择“N”则退出游戏。
原题目链接第五题
import random
while True:
num=random.randint(0,100)
for i in range(0,7):
num1=int(input('请输入猜的数字\n'))
if num1>num:
print('大了')
continue
elif num1<num:
print('小了')
continue
elif num1==num:
print('恭喜你猜对了')
break
else:print('你输了')
num2=int(input('是否继续?1是,2否'))
if num2==2:
break
else:continue
第十四天(2022.12.20)
昨天忘记了,今天两道
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?
要求:利用递归函数编程实现。
原题目链接第八题
def duck(num):
if num==0:
return 2
else:return (duck(num-1)+1)*2
num=int(input('请输入村庄个数'))
print(duck(num))
运行结果如下:
数字加密游戏:编程程序,从键盘任意输入1个4位数,将该数字中的每位数与7相乘,然后取乘积结果的个位数对该数字进行替换,最后得到1个新的4位数。
原题目链接第十四题
while True:
num=int(input('请输入一个四位数'))
if 1000<=num<=9999:
num=str(num)
num1=str(int(num[3])*7)
num2=str(int(num[2])*7)
num3=str(int(num[1])*7)
num4=str(int(num[0])*7)
print(num4[-1]+num3[-1]+num2[-1]+num1[-1])
break
else:
print('输入错误,请重新输入')
continue
运行结果如下:
第十五天(2022.12.22)
题目名称:批阅奏章
某朝皇帝有大臣n名(1<=n<=1000),分别编号大臣1~n。某日皇帝身体抱恙,奏章堆积如山无法及时一一批阅,便命身旁內侍帮他把奏章按指定顺序排序后再阅。于是皇帝亲自挑选了几个值得信赖的重臣并排好序,要求把他们的奏章按排好的顺序放到前面,其他的按照编号升序排列即可。现在要求你写一个程序来帮皇上解决这个问题,即已知奏章总数和顺序、钦点重臣的排列顺序,求得皇帝查阅奏章的顺序。
输入描述:
第一行输入两个整数p(1<=p<=5000)和q,其中p表示堆积奏章的总数、q表示皇帝钦点重臣数
第二行输入p个数,表示所有按呈递顺序递上来的奏章来自于哪个大臣(大臣编号)
第三行输入q个数,表示皇帝钦点并排好序的重臣编号
输出描述:
输出奏章按指定顺序排好序后,皇帝按大臣编号批阅的顺序
输入样例:
5 3
5 4 3 2 1
3 5 4
输出样例:
3 5 4 1 2
原题目链接第一题
python编程考试题目大全_彭_江南的博客-CSDN博客_python编程题目https://blog.csdn.net/m0_37317411/article/details/124838758?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167167010416800184196162%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167167010416800184196162&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-5-124838758-null-null.142%5Ev68%5Econtrol,201%5Ev4%5Eadd_ask,213%5Ev2%5Et3_esquery_v2&utm_term=python%E9%A2%98%E7%9B%AE&spm=1018.2226.3001.4187我加了个判断后面输入的大臣和奏章的数量是否和之前相等的功能,其实还应该加判断大臣和奏章数量是否大于5000以及奏章和大臣是否重复的功能,不过作者给的答案也没有,我也就懒得写了
def review():
num_c_num_p=input('请输入奏章的数量的大臣的数量,使用空格隔开')
# 接收奏章和大臣的数量
num_c_num_p=num_c_num_p.split(' ')
# 接收的字符串以空格分开
num_c=int(num_c_num_p[0])
num_p=int(num_c_num_p[1])
# 将数量分配两个参数存起来并且转换成整型
num_c_all=input('请输入所有按呈递顺序递上来的奏章来自于哪个大臣,使用空格隔开')
num_c_all=list(num_c_all.split(' '))
# 接收奏章编号并且存到列表里
num_p_all=input('请输入皇帝钦点并排好序的重臣编号,使用空格隔开')
num_p_all=list(num_p_all.split(' '))
# 接收大臣编号并且存到列表里
if len(num_c_all)!=num_c:
print('您输入的奏章数量和之前输入的不相等')
return 0
elif len(num_p_all)!=num_p:
print('您输入的大臣数量和之前输入的不相等')
return 0
# 判断一下相不相等,不相等则提示
result=[]
# 创建一个列表储存结果
for i in num_p_all:
for j in num_c_all:
# 以大臣和奏章编号做两个循环
if i==j:
# 判断大臣和奏章编号是否相同
result.append(j)
# 加入结果集
num_c_all.remove(j)
# 移除已经加入结果集的
else:num_c_all.sort()
# 循环结束后将剩下的排序
result.extend(num_c_all)
# 剩下的加入结果集
print(result)
# 打印结果集
review()
运行结果如下
第十六天(2023.1.11)
先是我阳了,养了几天好差不多了,然后我姥爷新冠加脑梗,这些天一直在医院帮忙照顾,好在老爷子挺过来了,然后不知道是因为在医院还是什么原因,我又阳了,只能说我真是老倒霉蛋了,扯远了,好差不多了,继续更新
题目:编程实现计算100—1000中有多少个数其各位数字之和是9,如108各位数字之和是9(加上把所有符合条件的数输出)
题目是朋友期末考试的编程题
num=0
# 计数器
for i in range(100,1000):
j=str(i)
# int类型转换成str类型方便使用下标读取对应数字
if int(j[0])+int(j[1])+int(j[2])==9:
print(i)
num=num+1
# 计数器+1
else:print(num)
运行结果如下
第十七天(2023.1.12)
编写一个程序首先输入5行5列的二维数组的所有元素,然后找出数组的鞍点,即该位置上的元素在该行上最大,在该列上最小。如果有,输出鞍点及其所在的行号、列号,如果没有,则提示没有。
这道题也是期末考试题,c语言的考试题,所以是数组,python就用列表,没啥大差别
andian=[] # 储存元素的列表
figure=0 # 记录鞍点的变量
while True:
# 整个while True是输入部分,原理和前面矩阵那里基本一样,看不懂可以去看之前的代码的注释
# 如果想实现题目里的5*5,可以用for循环
mat=input('请按行输入元素,以空格隔开,以"#"结束输入\n')
if mat=='#':
break
andian.append(mat.split(' '))
for i in range(len(andian)):
# 按行进行循环,先找出某行的最大元素,然后去判断这个元素在它所在的列是不是最小的
for j in range(len(andian[i])):
# 找出某行的最大元素的循环
try:
if andian[i][j]>andian[i][j+1]:
figure=andian[i][j]
else:figure=andian[i][j+1]
# 将最大元素储存进变量figure中
except:
break
for k in range(len(andian)):
# 根据找到的元素去判断是不是该列最小
if andian[k][j]<figure:
# 如果该列有比它更小的那就不需要继续循环,直接打破循环输出没有即可
print(f'第{i+1}行没有鞍点')
break
else:print(f'第{i+1}行的鞍点是{i+1}行{j+1}列,数据为{andian[i][j]}')
# 循环正常结束证明之前找到的元素是鞍点
print('输入的元素为')
for i in range(len(andian)):
# 最后把输入的元素按行输出呈现给用户,方便用户检查正确与否
print(andian[i])
运行结果如下
第十八天(2023.1.13)
编写函数input(int a[],int n)完成输入n个整数功能,output(int a[],int n)输出n个整数功能,sortInt(int a[],int n) n个整数排序功能,主函数完成几个函数的测试调用。
继续做考试题
def input1(a):
a.extend(input().split(' '))
def output(a):
print(a)
def sortint(a):
# a.sort() # 想体验自带排序把这行注释回来就行
# 其实是可以用自带的排序直接完成的
# 不过那样今天的量似乎太小了些,还是手动写个排序吧
for i in range(len(a)): # 简单写个最简单的冒泡排序
for j in range(len(a)):
try:
# 因为“j+1”到最后一位会导致列表索引超出范围
# 虽然也有别的方法,但是我感觉还是用try简单些
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
except:
break
a = []
input1(a)
sortint(a)
output(a)
运行结果如下
第十九/二十天(2023.1.14/1.15)
题目:定义一个包含账号、姓名、电话和余额内容的描述储户基本信息的结构体Account,利用该结构体实现(1)输入10名储户的基本信息;(2)将10名储户的基本信息写入磁盘文件account.dat中;(3)将磁盘文件account.dat中的储户信息读出并在屏幕上显示。
还是做考试题,python我用类做的,想了想反正都做了,不如做大一点,功能稍微全一点,然后就做了两天,倒也不是两天一直在做,只是空闲时间去做然后昨天没做完。。。扯远了,完整代码放在下面,稍微完整一点的解析放在另外一篇文章里了,链接如下
使用python对银行信息管理系统的简单实现_缇友的博客-CSDN博客https://blog.csdn.net/m0_56750162/article/details/128693533
class account(object):
# 用户信息类
def __init__(self, id1, name, tel, money):
self.id = id1
# 账户
self.name = name
# 姓名
self.tel = tel
# 电话
self.money = money
# 余额
def __str__(self):
return f'{self.id},{self.name},{self.tel},{self.money}'
class accountmanager(object):
# 管理系统类
def __init__(self):
self.users_list = []
# 储存信息的列表
def function(self):
"""调用各个函数的函数"""
# 函数的说明文档,一般用来记录函数的作用
self.load_users()
# 将文件里的信息读取出来
while True:
self.show_menu()
menu_num = int(input('请输入需要的功能序号'))
if menu_num == 1:
self.add_users()
elif menu_num == 2:
self.del_users()
elif menu_num == 3:
self.modify_users()
elif menu_num == 4:
self.query_users()
elif menu_num == 5:
self.show_users()
elif menu_num == 6:
self.save_users()
elif menu_num == 7:
print('感谢使用,再见')
break
else:
print('输入有误,请重新输入')
continue
def show_menu(self):
"""展示功能菜单"""
print('1--添加用户')
print('2--删除用户')
print('3--修改用户')
print('4--查询用户')
print('5--显示所有用户')
print('6--保存用户信息')
print('7--退出系统')
def add_users(self):
"""添加用户"""
id1 = input('请输入用户账户')
for i in self.users_list:
# 增删改查里都有循环用来查找数据然后再进行对应操作
if i.id == id1:
print('输入的账户已存在!!!')
return
name = input('请输入用户姓名')
tel = input('请输入用户电话')
money = input('请输入用户余额')
# 找到之后对姓名、电话、余额进行更改,可以做到单项更改,但是太麻烦了
# 账户不做更改,做更改还要判断账户是否重复,我嫌麻烦
user = account(id1, name, tel, money)
# 将所有信息放入列表
self.users_list.append(user)
# 将列表追加进储存的列表
def del_users(self):
"""删除用户"""
del_users_id = input('请输入需要删除用户的id')
for i in self.users_list:
if i.id == del_users_id:
self.users_list.remove(i)
break
else:
print('输入的用户不存在')
def modify_users(self):
"""修改用户"""
modify_users_id = input('请输入需要修改用户的id')
for i in self.users_list:
if i.id == modify_users_id:
print('已查询到用户,下面请按提示输入修改后的信息')
i.name = input('姓名:')
i.tel = input('电话:')
i.money = input('余额:')
break
else:
print('输入的用户不存在')
def query_users(self):
"""查询用户"""
query_users_id = input('请输入需要查询用户的id')
for i in self.users_list:
if i.id == query_users_id:
print(f'账户:{i.id}\t姓名:{i.name}\t电话:{i.tel}\t余额:{i.money}')
break
else:
print('输入的用户不存在')
def show_users(self):
"""显示所有用户"""
for i in self.users_list:
print(f'账户:{i.id}\t姓名:{i.name}\t电话:{i.tel}\t余额:{i.money}')
def load_users(self):
"""加载信息"""
try:
information = open('account.dat', 'r')
except:
information = open('account.dat', 'w')
else:
# 读取数据:文件读取出的数据是字符串还原列表类型;[{}] 转换 [学员对象]
data = information.read() # 字符串
if len(data)!=0:
# 判断读取的数据长度,如果没读到数据依旧运行下一行的代码会导致异常
# 顺带着也当做优化了,没读取到也就不用运行转换循环了
new_list = eval(data)
self.users_list = [account(i['id'], i['name'], i['tel'], i['money']) for i in new_list]
# 用循环将列表转换成字典形式
finally:
information.close()
# 无论怎样最后都关闭文件
def save_users(self):
"""将信息保存"""
information = open('account.dat', 'w')
new_list = [i.__dict__ for i in self.users_list]
# ___dict___强调储存的是静态属性
information.write(str(new_list))
# 以字符串形式写入
information.close()
# 关闭文件
account_manager = accountmanager()
# 创建类
account_manager.function()
# 运行系统
第二十一天(2023.1.16)
字符串最后一个单词的长度
给出一个只包含大小写字母和空格的字符串s,请返回字符串中最后一个单词的长度,如果字符串中没有最后一个单词,则返回0,注意:单词的定义是仅由非空格字符组成的字符序列。例如:s ="Hello World",返回5。
我不太明白他这个没有最后一个单词是什么意思,是没输入还是只有一个单词哪,我就当做是没输入东西就输出0吧
题目来自于x客网,我就不挂原链接了,不是大佬给的题,是c++或者Java的练习题,没有python的解法
list1=[]
list1=input().split(' ')
print(len(list1[-1]))
运行结果如下,第二张是没输入直接回车的结果
第二十二天(2022.1.17)
2的个数
给定一个正整数n,请返回0到n(包括n)的数字中2出现了几次。
测试样例:
输入:10
返回:1
num0=0
# 计数器
num=int(input())
for i in range(0,num):
str1=str(i)
# 转换成字符串类型
for j in range(0,len(str(i))):
if int(str1[j])==2:
num0+=1
else:print(num0)
运行结果如下
第二十三天(2023.1.18)
基本字符串压缩:现给定一个string iniString字符串(长度小于等于10000),请按连续重复字母压缩的方式将该字符串压缩,返回结果为string,比如,字符串“aabbcccccaaa”经压缩会变成“a2b2c5a3”,若压缩后的字符串没有变短,则返回原先的字符串。注意保证串内字符均由大小写英文字母组成。
n = input()
# 接收输入的数据
m = []
# 用于计数的列表,比如aaaa这个字符串
# 就是往这个列表里依次写入四个a,最后使用len函数统计数量就行了
j = []
# 最后结果的储存列表
for i in range(0, len(n)):
# 整体思路就是把第一位和最后一位单独列出情况单独判断处理,中间都没啥大差别
if n[0] != n[1] and i == 0:
# 判断第一个字符和第二个是否不相等
# 比如ab,不相等就往结果集里输入a1
j.append(n[0])
# 输入a
j.append(str(1))
# 输入字符串类型的1,防止结果列表转换成字符串的时候出错
# 后续输入数字统一用字符串类型的,后面不再强调
continue
try:
# 用try是防止列表索引溢出
if n[i] == n[i + 1]:
# 判断当前字符和下一位是否相等
# 相等就输入到计数列表
m.append(n[i + 1])
else:
j.append(n[i])
# 不相等就输入这个字符
j.append(str(len(m) + 1))
# 统计计数列表的个数然后输入
m = []
# 清空计数列表然后方便下一个字符计数
except:
if n[i] == n[i - 1]:
# 判断最后一位字符和前一位是否相等
# 相等就执行上面else里的操作
j.append(n[i])
j.append(str(len(m) + 1))
break
else:
# 不相等这里就把最后一位字符输入,然后输入1
j.append(n[i])
j.append(str(1))
k = ''.join(j)
# 把结果列表转换成字符串
if len(k) < len(n):
# 判断长度,比之前短输出新结果,反之输出原来的结果
print(k)
else:
print(n)
运行结果如下
之前的几道题x客网里面没有python选项,这个有了,所以顺便放一下x客网里运行通过的截图
当然x客里是在函数里的,我上面给的代码是复制到解释器里能直接运行的
第二十四天(2023.1.19)
判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写
例如:"nowcoder Is Best tsebsi: redoc won"是回文
"race a car"不是回文
注意:
你有没有考虑过字符串可能为空?这是面试时应该提出的一个好问题。
针对这个问题,我们定义空字符串是回文
先说一下我自己的思路,去除所有符号后然后全部转换成小写字符然后分别取前一半和后一半的逆置然后对比,同时还有考虑字符串只有一个字符的情况,总之比较麻烦,然后我看了看题解部分一位大佬的解法,十分简洁,这里着重记录大佬的思路,大佬代码如下
1.第一行和第二行是自动生成的,方便传参验证代码的部分
2.第三行的作用比较多,首先生成列表“L”,“L”由对字符串s进行for循环得到
3.这里先说一下“isalnum”内置函数的作用,判断一个字符串是否完全由非符号字符组成,完全返回true,不完全返回false
4.因为是for循环,循环字符串中的每一个字符,也就是相当于去判断字符串中的每一个字符是不是符号,不是返回true,是返回false
5.又因为if判断,所以true就执行内置函数“lower”,这个函数是对字符串的操作函数,会将所有大写字符转换成小写,这样一来,所有字母都加入了列表而已都变成了小写
6.最后一行直接对比列表“L”和其逆置列表,因为是回文串所以逆置后应该相等
大佬代码拆开写如下
def isPalindrome(s):
l = []
for x in s:
if x.isalnum():
l.append(x.lower())
return l == l[::-1]
s = input()
print(isPalindrome(s))
下面是我保留自己原有思路的情况下根据大佬思路对自己代码改进后的代码
def isPalindrome(s):
punc = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ '
s = s.lower()
for ch in punc:
s = s.replace(ch, '')
return s==s[::-1]
s = input()
print(isPalindrome(s))
总结:思路不如大佬有两点原因
一、不知道“isalnum”函数,不过基本知道我估计也想不到这种用法,所以这一点原因只占20%。
二、编程的思路、思想还是有待加强,对与python的一些简便写法、用法不熟练
不定期更新
1.编写一个程序,该程序接受以逗号分隔的4位二进制数字序列作为输入,然后检查它们是否可被5整除。被5整除的数字将以逗号分隔的顺序打印。(2023.4.24)
代码如下
a = input("请输入多个四位数字,以‘,’隔开")
a = a.split(',')
j = 1
for i in a:
if int(i) % 5 == 0:
if j == 1:
print(i, end='')
j += 1
else:
print(',', i, end='')
输出如下
其实这里要求以逗号分隔打印比较麻烦,不然可以更简单一点,如下
a = input("请输入多个四位数字,以‘,’隔开")
a = a.split(',')
for i in a:
if int(i) % 5 == 0:
print(i, end=' ')
结果如下
2.Python挑战的题,easy难度,也很简单,就是for循环的堆叠而已
代码如下,这么简单应该不用写注释了吧
Rooster = 1
Hen = 1
chick = 1
for i in range(0, 20):
for j in range(0, 33):
for k in range(0, 33):
if 5 * i + 3 * j + k == 100 and i + j + 3 * k==100:
print(f"公鸡{i}只,母鸡{j}只,鸡雏{3 * k}只")
运行结果如下