python 哪些比赛项目_python练手入门小项目详解(一)

本文,是鼓励自己写知乎,并且希望和笔者一样的小白共同进步。仅此而已。

建议,和笔者一样的小白,最先挡住代码,自己看这些小项目写代码。

代码原则:只求简单便于理解。

如果更快速代码,望指出。

第一题 给任意一个的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

a = int(input('请输入任意一个的正整数:'))

count = 0

# 用while循环,直到最后的a小于1时,便计数完毕

while (a >= 1):

num_daoxu = int(a % 10)

print(num_daoxu)

a /= 10

count += 1

print('它是%d位数。'%count)

第二题 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

count = 0

num_list = []

for i in range(1, 5):

for j in range(1, 5):

for k in range(1, 5):

# 互不相同,则要三个条件放在一个if里

if i != j and j != k and k != i:

count += 1

num_list.append(100 * i + 10 * j + k)

print(count)

print('这些数字为:', num_list)

第三题 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

# 本题应该为目前网上最简单,最迅速的方法哈(求大佬喷)

# 统计字母、空格、数字这些东西,能迅速把他们进行分类的,只有正则表达式

# 正则表达式挑选符合要求的数字,以后爬虫也会经常遇到,就当练手

import re

a = str(input('请输入一串字符:'))

# 注意不要忽略了引号

# re.compile()编译正则表达式,生成正则表达式对象

zimu = re.compile('[a-zA-Z]')

kongge = re.compile(r'\s')

shuzi = re.compile(r'\d')

# findall()函数可以找到任何满足正则表达式条件的内容,并生成一个列表

count_shuzi = len(shuzi.findall(a))

count_zimu = len(zimu.findall(a))

count_kongge = len(kongge.findall(a))

count_qita = len(a) - count_kongge - count_zimu - count_shuzi

print('英文字母个数为:%d'%count_zimu)

print('空格个数为:%d'%count_kongge)

print('数字个数为:%d'%count_shuzi)

print('其他个数为:%d'%count_qita)

第四题 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定

比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

# 虽然此题可以一眼看出结果,但是从编程角度笔者想不出更简洁的编程方法

# 这道题用到很多重新赋值,以及列表删除方法

# 首先注意a不能直接赋值

team_jia = [str('a'), str('b'), str('c')]

# 第一个循环确定a和谁比赛,

for i in range(0, 3):

team_yi = [str('x'), str('y'), str('z')]

match_list = []

selected_first_yi = team_yi.pop(i)

if selected_first_yi != 'x':

# 第二个循环,产生接下来的两场比赛

for j in range(0, 2):

# 由于后面又用到了list.pop(),因此要重新赋值

team_yi = [str('x'), str('y'), str('z')]

team_yi.remove(selected_first_yi)

# 重新赋值

match_list = [tuple([team_jia[0], selected_first_yi])]

match_list.append(tuple([team_jia[1], team_yi.pop(j)]))

# 两次pop()后,team_yi只剩下一个值

match_list.append(tuple([team_jia[2], team_yi[0]]))

if ('c', 'x') not in match_list and ('c', 'z') not in match_list :

print('比赛顺序为:', match_list, '.')

第五题 企业发放的奖金根据利润提成。利润(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 = int(input('输入你的利润:'))

# input()函数再加上int()其实是让输入的结果看作一个值

num_jine = [1000000, 600000, 400000, 200000, 100000, 0]

rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]

all_jiangjin = 0

# 从0开始,累加的思想

# 分段利率,则可以从大到小计算,分段思想:i-arr[idx]

# 因此索引也要从大到小排列

# 注意累加 用r +=

for y in range(0, 6):

if i > num_jine[y]:

all_jiangjin += (i - num_jine[y]) * rat[y]

# 将大于num_jine的部分奖金已算出,故可以赋值,求更小的那个奖金段

i = num_jine[y]

print(all_jiangjin)

第六题 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

import math

x = 1

while True:

if math.sqrt(x+100) - int(math.sqrt(x+100)) == 0 and math.sqrt(x+168) - int(math.sqrt(x+168)) == 0:

print(x)

# 只求一个整数,则要在找到这个整数的时候,加入一个break,表示退出循环

break

# 如果不满足条件,x+1进行继续循环判断

x += 1

第七题 输入某年某日 判断你这是第几天?

# 此题应该是网上最容易理解的版本

import datetime

input_year = int(input('year:'))

input_month = int(input('month:'))

input_day = int(input('day:'))

# 这里要用到int()函数,确保是整数

# 下面的调用,是最简单的求时间差异的方法

time1 = datetime.datetime(input_year, input_month, input_day)

time2 = datetime.datetime(input_year, 1, 1)

days = (time1-time2).days

print('这是第%d天。'%days)

第八题 输入三个整数x,y,z,请把这三个数的最大值。

a = float(input('x:'))

b = float(input('y:'))

c = float(input('z:'))

if a >= max(b, c):

print(a)

elif b >= max(a, c):

print(b)

else:

print(c)

第九题 输出9*9口诀表,注意输出形式为直角三角形。

for i in range(1, 10):

for j in range(1, 10):

if i >= j:

print(j, "*", i, "=", i*j, end=' ')

# 下一行代码代表着内置循环结束以后,在输出一个’‘,其实这是什么都没有的,只是没有end=’‘,所以就自动换行了

print('')

第十题 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?

# 先列出来思考的顺序:

# 第一天,兔子对数1

# 第二天,兔子对数1

# 第三天,兔子对数2 构成:成年1;出生1

# 第四天,兔子对数3 构成:成年1;幼年1;出生1

# 第五天,兔子对数5 构成:成年2;幼年1;出生2

# 根据对应情况,可以认为第五天的情况是第三四天的汇总

# 因此构成斐波那契数列。

a = 1

b = 1

for i in range(3, 100):

a, b = b, a+b

print('第%d个月兔子总对数为%d'%(i,b))

第十一题 判断101-200之间有多少个素数,并输出所有素数。

import math

count = 0

for i in range(101, 201):

# 因为下文涉及到了,循环+判断,所以必须要引入一个值来记录:所有循环满足条件?还是部分符合条件?

# a的值可以看作标记。

a = 0

for j in range(2, int(math.sqrt(i)+1)):

if i % j == 0:

a = 1

# 在一个i值下,循环了j值。如果依旧a==0,就说明满足条件素数条件

if a == 0:

count += 1

print(i)

print('一共有'+str(count)+'个。')

第十二题 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。

# 第一种方法 显而易见用循环的方法,再利用取整

for a in range(100, 1000):

b = a//100

c = (a - 100*b)//10

d = a - 100*b-10*c

if a == b**3 + c**3 + d**3:

print(a)

# 第二种方法 笔者为了复习一下while True函数,用这个函数改了一下

# 注意,while True结构一定要break,否则循环一直循环下去

a = 100

while True:

b = a//100

c = (a - 100*b)//10

d = a - 100*b-10*c

if a == b**3 + c**3 + d**3:

print(a)

a = a + 1

if a > 999:

break

第十二题 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

a = int(input('您要将哪个数分解为质因数相乘的形式:'))

print(a, '=', end=' ')

while (a != 1):

# 注意对除数的循环要从2开始,从1开始会陷入死循环

for i in range(2, int(a+1)):

if a % i == 0:

# 这个地方很重要,提取完a的最小后的现值,再赋予a,这个时候就需要/=

a /= i

if a == 1:

print(i, end=' ')

else:

print(i, '*', end=' ')

# 最深层次的if循环语句是为了打印输出结果

# 但是,我们还要在这个现值a上重新开始for循环,而不是继续开始for循环

# 这时候,就可以使用break跳出for循环,去验证while条件句

# 如果不是最简,则重新开始for循环,并使用新的a值

break

第十三题 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

your_grade = int(input('你的学习成绩为:'))

# 由于是三个条件,所以要用到:条件 and 输出 or...注意这是个非主流的方法

mark = your_grade >= 90 and 'A' or your_grade >= 60 and 'B' or 'C'

print('你的成绩类型是%s.'%mark)

第十四题 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字,有几个数相加由自己来控制。例如输出:2+22+222+2222+22222(此时共有5个数相加)并求值。

# 此题的关键是借助两个循环,一个大循环产生加数式,一个小循环产生每个加数

a = int(input('输入你的a值:'))

b = int(input('你想让几个数相加:'))

s = 0

print('s=', end=' ')

# 开始循环每个加数

for i in range(0, b):

# 初始化d值

d = 0

# 实现每个加数

for y in range(0, i+1):

c = a*10**y

d += c

# 设置输出的格式

if d < 10**(b - 1):

print(d, '+', end=' ')

else:

print(d, end='')

s += d

print(' =', s)

第十五题 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。

# 首先,先设置1000以内的数循环

for wanshu in range(2, 1001):

a = 0

# 建立列表,保存因子

yinzi = []

i = wanshu

# 设置内循环,找出所有因子(前面题目有详细解释)

while (i != 1):

for y in range(2, int(i+1)):

if i % y == 0:

i /= y

yinzi.append(y)

break

# 求出列表里所有数的和

for z in range(0, len(yinzi)):

a += yinzi[z]

# 不要忘记1

if (a+1) == wanshu:

print(wanshu)

第十六题 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

s = 100

h = 50

distance = 0

for i in range(0, 10):

distance += (s + h) * 0.5 ** i

print('经过的路程为%f米。'%distance)

high = s * 0.5 ** 10

print('第十次反弹的高度为%f米。'%high)

第十七题 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下

的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?

# 从第十天倒退开始算

num_taozi = 1

for i in range(1, 10):

num_taozi = (num_taozi + 1) * 2

print('桃子总个数为%d个。'%num_taozi)

第十八题 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

# 一个数的分子是前一个数分子和分母之和

# 并且,这个数的分母是前一个数的分子

# 其中,用到到斐波那契数列的构造思想

a = 2

b = 1

s = 0

for i in range(0, 20):

s += a/b

# 其中,用到到斐波那契数列数列的构造思想

a, b = a + b, a

print(s)

第十九题 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?(用递归算法)

# 笔者在看算法,这道题可以说是递归算法一个最简答的例子吧

def age(i):

if i == 1:

return 10

# 最后的return 返回函数本身,实现递归

return age(i-1)+2

print('第五个人的年龄为%d。'%age(5))

第二十题 对10个随机个位数进行排序(从小到大)。

# 笔者最后拿这个题目镇文章哈

# 第一种方法,利用循环

# 首先,利用random生成十个随机数

import random

list_num = [random.randint(0, 10) for i in range(0, 10)]

print('需要排列的数据列表为', list_num, '。')

# 建立空列表存储排列好的值

sorted_list_num = []

# 加入一个数,作为基数,和其他几个数比较

sorted_list_num.append(list_num[0])

for i in range(1, 10):

a = i

for m in range(i, 0, -1):

# 如果要加入的数大于前一个数,则将其放在该数后面

if list_num[a] > sorted_list_num[(m - 1)]:

sorted_list_num.insert(m, list_num[a])

break

# 如果小于的话,重新循环

else:

# 若是最小数的话,则放在首位

if m == 1:

sorted_list_num.insert(0, list_num[a])

break

print('排好的序列为:', sorted_list_num, '。')

#第二种方法 和第一种方法大同小异,只不过是笔者想联系函数的思想

import random

list_num = [random.randint(0, 10) for i in range(0, 10)]

print('需要排列的数据列表为', list_num, '。')

sorted_list_num = []

sorted_list_num.append(list_num[0])

def sort_method(i):

a = i

# global 定义全局变量很重要

global sorted_list_num

for m in range(i, 0, -1):

if list_num[a] > sorted_list_num[(m - 1)]:

sorted_list_num.insert(m, list_num[a])

# return 返回函数,表明函数结束

return

else:

if m == 1:

sorted_list_num.insert(0, list_num[a])

# return 返回函数,表明函数结束

return

for i in range(1, 10):

sort_method(i)

print('排好的序列为:', sorted_list_num, '。')

笔者,入门三四个月,以前没有任何语言基础。

入门之后,一直抄书打各个方向的代码。这是第一次独立完成的。

以上代码基本上都是笔者自己的思路。

点赞,给我继续写项目详解的动力哟~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值