在网上找了一些python的题目进行练习,都会先自己实现一遍,然后再看网上比较好的其他解法。做的过程中也看到自己很多不足的地方,要多学习多积累多思考。继续努力~。

这些题目的链接是:python100练习

1.有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

# 1、by_nico 利用set去重后判断是否是3个不同数据
number = [1,2,3,4]
data_set = []
for i in number:
for j in number:
for k in number:
if len(set([i,j,k]))==3:
data = i*100+j*10+k
data_set.append(data)
print(data)
else:
continue
print('不重复的三位数一共有%d个'% len(data_set))
# 2、by_nico 减少循环的次数,用filter函数去掉前一个数,避免重复
number = [1,2,3,4]
for i in number:
for j in filter(lambda x : x!=i,number): # 留下满足条件的数据
for k in filter(lambda x : (x!=i)&(x!=j),number):
data = i*100+j*10+k
print(data)
# 3、网上解法,在最后一层用三个不等于进行筛选
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if( i != k ) and (i != j) and (j != k):
print i,j,k

2.企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?

# 1、by_nico 看过答案后才知道自己写得太复杂了。继续努力~
# 异常处理,避免输入非数值时报错
try:
account = float(input("请输入当月利润"))
except:
print("请重新输入正确利润:")
list_money = [100000,200000,400000,600000,1000000]
list_sec =[100000,100000,200000,200000,400000] # 每段的金额
list_profit = [0.1,0.075,0.05,0.03,0.015,0.01]
#定义分段计算函数
def cal_money(account):
sum_m=0
for i in range(5):
if (list_money[i]) <= account:
sum_a = (list_sec[i])*list_profit[i]
sum_m += sum_a
else:
if i == 0: # account<10的时候会直接执行这一步
sum_m = account*list_profit[i]
else:
sum_a = (account-list_money[i-1])*list_profit[i] #大于最后一个阶段的余数进行处理
sum_m += sum_a
break
# 正常循环完没有通过break跳出说明account大于100,再处理
else:
sum_a = (account-100)*list_profit[-1]
sum_m += sum_a
return sum_m
result = cal_money(account)
print(result)
# 2、网上解法
# 思考:以后再遇到数轴分界定位的问题,考虑倒序排列。改变count值为边界值循环相加
try:
account = float(input("请输入当月利润"))
except:
print("请重新输入正确利润:")
arr = [1000000,600000,400000,200000,100000,0]
rat = [0.01,0.015,0.03,0.05,0.075,0.1]
r = 0
for i in range(0,6):
if account>arr[i]:
r+=(account-arr[i])*rat[i]
account=arr[i] # 不断的改变account值为下一个边界值,循环递减,求得每个分段的数值相加。
print(r)

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

# 1、by_nico,缺点,有点暴力。前期没有做任何计算,缩小范围。人为的定个范围,答案有遗漏
import math
for i in range(1000):
if math.sqrt(i+100)== int(math.sqrt(i+100)): # 判断开方后是否为整数
if math.sqrt(i+100+168)== int(math.sqrt(i+100+168)):
print(i)
# 2、网上解法
# 分析:
# x + 100 = n^2
# x + 100 + 168 = m^2
# m^2 - n^2 = 168
# (m + n) * (m - n) = 168
# m > n >= 0
# m最大值为168
for m in range(168):
for n in range(m):
if (m+n)*(m-n)==168:
x=n**2-100
print("符合条件的整数有:",x)

4.输入某年某月某日,判断这一天是这一年的第几天?

# 1.by_nico
import datetime
date_str = input('请输入日期(格式如:2018-09-11)')
#将str格式转换为date模式,方便提取年、月、日的值
date_data = datetime.datetime.strptime(date_str,'%Y-%m-%d')
# 判断是否为闰年
list_days = [31,28,31,30,31,30,31,31,30,31,30,31]
if (date_data.year%4 ==0 and date_data.year%100 !=0) or date_data.year%400 ==0:
list_days[1]=29 # 如果为闰年,把2月改成29天
count_days = date_data.day # 初始赋值为day的取值
for i in range(date_data.month-1):
count_days += list_days[i]
print(count_days)

5.输入三个整数x,y,z,请把这三个数由小到大输出。

# 1.by_nico 一次性输入三个整数
list_data = input('请输入三个整数,以逗号分隔:')
list_data = list(map(int,list_data.split(','))) # map返回迭代器,使用list()可获取其列表,
print(sorted(list_data))
# 2.by_nico 分三次输入
list_data = []
for i in range(1,4):
a = int(input('请输入第%d个整数'% i))
list_data.append(a)
sorted(list_data) # 返回的是新列表,不回改变原有列表的值
# 补充1:
# list_data.sort() # 如果使用列表的sort方法,没有返回值,改变原有的列表。
# print(list_data)
# 补充2:
# 使用map将列表中的元素转换为int类型的时候也可以使用列表生成式
# li2 = [int(i) for i in li]
将一个列表的数据复制到另一个列表中。
这题很简单,但是在这基础上可以扩展直接赋值、浅拷贝、深拷贝的知识
# by_nico 赋值、浅拷贝、深拷贝
from copy import deepcopy
list_a = [23,345,78,'host',89,['no1','no2']]
list_b = list_a
list_c = list_a.copy()
list_d = deepcopy(list_a)
# 更改 最浅层
list_a[0] = 999
print(list_a) # 已改变 [999, 345, 78, 'host', 89, ['no1', 'no2']]
print(list_b) # 已改变
print(list_c) # 不变
print(list_d) # 不变
# 更改 深层
list_a[5].append("c")
print(list_a) # 已改变 [999, 345, 78, 'host', 89, ['no1', 'no2', 'c']]
print(list_b) # 已改变
print(list_c) # 已改变
print(list_d) # 不变
输出9*9乘法表
# by_nico
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d'% (i,j,i*j),end = '\t') # end也可以用' ',使用'\t'能保证列对齐
print('') # 代表换行
# 结果
1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81
暂停1秒输出。
# by_nico
import time
li=[1,2,3,4]
for i in li:
print(i)
time.sleep(1) # 暂停一秒输出
暂停一秒输出,并格式化当前时间。
# 看到第十题才发现第9题我已经用这种方法实现了,只有把它拷贝下来
# by_nico
import time
print(time.strftime("%Y-%m-%d %X",time.localtime()))
time.sleep(1) # 暂停一秒输出
print(time.strftime("%Y-%m-%d %X",time.localtime()))