python基础刷题_python100刷题 1-10

在网上找了一些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()))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值