phyton题库+解析

数字组合

题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析 遍历全部可能,把有重复的剃掉。

total=0
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if ((i!=j)and(j!=k)and(k!=i)):

                total+=1
                #美化打印的结果
                if (total%6==0):
                    print(i,j,k)
                else:
                    print(i,j,k,end="|")

print(total)

1 2 3|1 2 4|1 3 2|1 3 4|1 4 2|1 4 3
2 1 3|2 1 4|2 3 1|2 3 4|2 4 1|2 4 3
3 1 2|3 1 4|3 2 1|3 2 4|3 4 1|3 4 2
4 1 2|4 1 3|4 2 1|4 2 3|4 3 1|4 3 2
24

内置模块排列方式`

import itertools
sum2=0
name=[]
a=[1,2,3,4]
for i in itertools.permutations(a,3):
    name.append(i)
print(name[:6])
print(name[7:13])
print(name[14:20])
print(name[20:])

[(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 4), (1, 4, 2), (1, 4, 3)]
[(2, 1, 4), (2, 3, 1), (2, 3, 4), (2, 4, 1), (2, 4, 3), (3, 1, 2)]
[(3, 2, 1), (3, 2, 4), (3, 4, 1), (3, 4, 2), (4, 1, 2), (4, 1, 3)]
[(4, 2, 1), (4, 2, 3), (4, 3, 1), (4, 3, 2)]

在itertools.permutations不在字符格式转化期间
美化只能用切片

四个任意的数字

题目 有四个任意的数字:能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析 遍历全部可能,把有重复的剃掉。

# 手动输入四个不同的整数,并添加到一个列表中
list1 = []
while len(list1) < 4:
    num = int(input('请依次输入第%d整数:' % (len(list1) + 1)))
    list1.append(num)

# 开始排序
count = 0  # 计数器
for i in list1:
    for j in list1:
        for k in list1:
            if i != j and i != k and j != k:
                count += 1

                # 美化打印结果
                if count % 4 == 0: # 如果等于4,则不打印 | 符号,直接换行
                    print('%d%d%d' % (i, j, k))
                else:
                    print('%d%d%d' % (i, j, k), end='|')

print('这样的数一个有%d个' % count)

请依次输入第1整数:4
请依次输入第2整数:5
请依次输入第3整数:6
请依次输入第4整数:1
456|451|465|461
415|416|546|541
564|561|514|516
645|641|654|651
614|615|145|146
154|156|164|165
这样的数一个有24

如果中间有相同过的会如何,

请依次输入第1整数:4
请依次输入第2整数:5
请依次输入第3整数:4
请依次输入第4整数:6
456|465|546|546
564|564|456|465
645|654|654|645
这样的数一个有12个

解释内置模块itertools.permutations
itertools.permutations格式

itertools.permutations(iterable[, r])

itertools.permutations通俗地讲,就是返回可迭代对象的所有数学全排列方式。
如果r未指定或为None,则r默认为可迭代对象的长度,并生成所有可能的全长度排列。

for i in itertools.permutations('ijig',3):
    print(i)

(‘i’, ‘j’, ‘i’)
(‘i’, ‘j’, ‘g’)
(‘i’, ‘i’, ‘j’)
(‘i’, ‘i’, ‘g’)
’‘’‘’‘’‘’‘’‘’‘’‘’

for i in itertools.permutations('ijig',):
    print(i)

(‘i’, ‘j’, ‘i’, ‘g’)
(‘i’, ‘j’, ‘g’, ‘i’)
(‘i’, ‘i’, ‘j’, ‘g’)
(‘i’, ‘i’, ‘g’, ‘j’)
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘

个税计算

题目 企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
程序分析,分区间计算

# 填入公司的利润
profit=int(input("请输入公司的利润:"))
if profit<10:
    bonus=profit*0.1
elif 10<=profit<20:
    bonus=profit*0.1+(profit-10)*0.075
elif 20<=profit<40:
    bonus=profit*0.1+(profit-10)*0.075+(profit-20)*0.05
elif 40<=profit<60:
    bonus = profit * 0.1 + (profit - 10) * 0.075 + (profit - 20) * 0.05+(profit-40)*0.03
elif 60<=profit<100:
    bonus = profit * 0.1 + (profit - 10) * 0.075 + (profit - 20) * 0.05+(profit-40)*0.03+(profit-60)*0.015
else:
    bonus = profit * 0.1 + (profit - 10) * 0.075 + (profit - 20) * 0.05 + (profit - 40) * 0.03 + \
            (profit-60)*0.015+(profit-100)*0.01
print("你的奖金是:"+str(bonus)+"万!")

请输入公司的利润:40
你的奖金是:7.25万!

不一样的计算方法
可能不对

profit=int(input('Show me the money: '))
bonus=0
thresholds=[100000,100000,200000,200000,400000]
rates=[0.1,0.075,0.05,0.03,0.015,0.01]
for i in range(len(thresholds)):
    if profit<=thresholds[i]:
        bonus+=profit*rates[i]
        profit=0
        break
    else:
        bonus+=thresholds[i]*rates[i]
        profit-=thresholds[i]
bonus+=profit*rates[-1]
print(bonus)

Show me the money: 500000
30500.0

完全平方数

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

for i in range(0,1000):             #寻找这个数
    for k in range(0,1000):
        if (i+100==k*k):            #判断这个数加上100为k的平方
            for n in range(0,10000):
                if (i+168==n*n):    #判断这个数加上168为n的平方
                    print(i)

这个数为156

三数排序

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

程序分析 练练手就随便找个排序算法实现一下,偷懒就直接调函数。

list_1=[]
list_2=[]
while len(list_1)<3:
    num = int(input('请依次输入第%d整数:' % (len(list_1) + 1)))
    list_1.append(num)
if list_1[0]>=list_1[1]:
    list_2.append(list_1[1])
    list_1[1]=list_1[0]
    list_1[0]=list_2[0]
if list_1[1]>=list_1[2]:
    list_2.append(list_1[2])
    list_1[2] = list_1[1]
    list_1[1] = list_2[1]
for n in list_1:
    print(n)

请依次输入第1整数:7
请依次输入第2整数:2
请依次输入第3整数:8
2 7 8

第二种排列

raw=[]
for i in range(3):
    x=int(input('int%d: '%(i)))
    raw.append(x)
    
for i in range(len(raw)):
    for j in range(i,len(raw)):
        if raw[i]>raw[j]:
            raw[i],raw[j]=raw[j],raw[i]
print(raw)

int0: 1
int1: 2
int2: 8
[1, 2, 8]

调用函数

raw2=[]
for i in range(3):
    x=int(input('int%d: '%(i)))
    raw2.append(x)
print(sorted(raw2))

函数sorted是对列表的临时排列
函数sort则是对列表的永久排序
函数reverse是倒着列表

这是一年的多少天

题目 输入某年某月某日,判断这一天是这一年的第几天?
程序分析 特殊情况,闰年时需考虑二月多加一天:

def year_1(self_1):
    """定义函数判断是不是闰年"""
    return (self_1%400==0)or((self_1%4==0) and (self_1%100!=0))
month_1=[0,31,28,31,30,31,30,31,31,30,31,30]
"""month_1[0]=0是做填充作用,因为月份是重第一个月开始
    而month_1只有11个月的天数,是因为当道12月的时候就填入这个月的天数"""
month_day=0
year=int(input("请输入你要查询的年份:"))
month=int(input("请输入你要查询的月份:"))
day=int(input("请输入现在的天数:"))				#调用函数
if year_1(year):
    month_1[2]+=1
for i in range(month):
    month_day+=month_1[i]
print(day+month_day)

请输入你要查询的年份:2000
请输入你要查询的月份:12
请输入现在的天数:31
366

斐波那契数列

题目 斐波那契数列。
程序分析 斐波那契数列(Fibonacci sequence),从1,1开始,后面每一项等于前面两项之和。图方便就递归实现,图性能就用循环。

def Fibon(self_1):
    if self_1==1:
        return [0]
    if self_1==2:
        return [0,1]
    if self_1==3:
        return [0,1,1]
    name=[0,1,1]
    for i in range(1,self_1):
        name.append(name[i]+name[i+1])
    return name
print(Fibon(10))

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

寻找斐波那契数列的第n个数是

def Fibon(self_1):
    if self_1==1:
        return [0]
    if self_1==2:
        return [0,1]
    if self_1==3:
        return [0,1,1]
    name=[0,1,1]
    for i in range(1,self_1):
        name.append(name[i]+name[i+1])
    return name[self_1]
print(Fibon(10))

55

copy

题目 将一个列表的数据复制到另一个列表中。
程序分析 使用列表[:],拿不准可以调用copy模块。

import copy
a = [1,2,3,4,['a','b']]
b = a					# 赋值
c = a[:]				# 浅拷贝
d = copy.copy(a)		# 浅拷贝
e = copy.deepcopy(a)	# 深拷贝
a.append(5)
a[4].append('c')
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
print('e=',e)

a= [1, 2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
b= [1, 2, 3, 4, [‘a’, ‘b’, ‘c’], 5]
c= [1, 2, 3, 4, [‘a’, ‘b’, ‘c’]]
d= [1, 2, 3, 4, [‘a’, ‘b’, ‘c’]]
e= [1, 2, 3, 4, [‘a’, ‘b’]]

  • 论述赋值,切片,浅拷贝,深拷贝的且别。转载外篇。

九九乘法表

题目 输出 9*9 乘法口诀表。
程序分析 分行与列考虑,共9行9列,i控制行,j控制列。

for i in range(1,10):
    for j in range(1,i+1):
        print('%d*%d=%2d' %(i,j,i*j),end='')
    print('')
1*1= 1|	
2*1= 2|	2*2= 4|	
3*1= 3|	3*2= 6|	3*3= 9|	
4*1= 4|	4*2= 8|	4*3=12|	4*4=16|	
5*1= 5|	5*2=10|	5*3=15|	5*4=20|	5*5=25|	
6*1= 6|	6*2=12|	6*3=18|	6*4=24|	6*5=30|	6*6=36|	
7*1= 7|	7*2=14|	7*3=21|	7*4=28|	7*5=35|	7*6=42|	7*7=49|	
8*1= 8|	8*2=16|	8*3=24|	8*4=32|	8*5=40|	8*6=48|	8*7=56|	8*8=64|	
9*1= 9|	9*2=18|	9*3=27|	9*4=36|	9*5=45|	9*6=54|	9*7=63|	9*8=72|	9*9=81|

九九乘法表倒着排序。

name=[1,2,3,4,5,6,7,8,9,]
for i in reversed(name):
    for j in range(1,i+1):
        print('%d*%d=%2d' %(i,j,i*j),end='|\t')
    print('')
9*1= 9|	9*2=18|	9*3=27|	9*4=36|	9*5=45|	9*6=54|	9*7=63|	9*8=72|	9*9=81|	
8*1= 8|	8*2=16|	8*3=24|	8*4=32|	8*5=40|	8*6=48|	8*7=56|	8*8=64|	
7*1= 7|	7*2=14|	7*3=21|	7*4=28|	7*5=35|	7*6=42|	7*7=49|	
6*1= 6|	6*2=12|	6*3=18|	6*4=24|	6*5=30|	6*6=36|	
5*1= 5|	5*2=10|	5*3=15|	5*4=20|	5*5=25|	
4*1= 4|	4*2= 8|	4*3=12|	4*4=16|	
3*1= 3|	3*2= 6|	3*3= 9|	
2*1= 2|	2*2= 4|	
1*1= 1|

暂停一秒输出

题目 暂停一秒输出。
程序分析 使用 time 模块的 sleep() 函数。

100到200的素数

判断101-200之间有多少个素数,并输出所有素数。
程序分析 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 用else可以进一步简化代码.
素数的概念:
就是在所有比1大的整数中,除了1和它本身以外,不再有别的约数,这种整数叫做质数或素数。

递归输出

题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
程序分析 递归真是蠢方法。

list_1=[]
name=[]
while len(list_1)<=4:
    num = int(input('请依次输入第%d整数:' % (len(list_1) + 1)))
    list_1.append(num)
print(list_1)
for i in reversed(list_1):
    name.append(i)
print(name)

请依次输入第1整数:88
请依次输入第2整数:222
请依次输入第3整数:7
请依次输入第4整数:12
请依次输入第5整数:44
[88, 222, 7, 12, 44]
[44, 12, 7, 222, 88]

调用函数

题目 练习函数调用。
程序分析 无。

def name(self_1):
	return self_1
n=name(7)
print(n)

7

设置输出颜色

题目 文本颜色设置。
程序分析 :字体规则
实现过程:
终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。
转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)
书写格式:
开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m
数值表示的参数含义:在这里插入图片描述
常见开头格式:
\033[0m 默认字体正常显示,不高亮
\033[32;0m 红色字体正常显示
\033[1;32;40m 显示方式: 高亮 字体前景色:绿色 背景色:黑色
\033[0;31;46m 显示方式: 正常 字体前景色:红色 背景色:青色

实例:
  (1)print("\033[1;31;40m您输入的帐号或密码错误!\033[0m")
  上方代码的输出格式为:字体高亮,红色前景,黄色背景 PS:前景色也就是字体的颜色
  在这里插入图片描述

(2)print("\033[0;31m%s\033[0m" % “输出红色字符”)
  #上方代码的输出格式为:字体默认,红色前景
在这里插入图片描述

class bcolors:
    HEADER = '\033[95m'     #紫色字体
    OKBLUE = '\033[94m'     #蓝色字体
    OKGREEN = '\033[92m'    #钱黄色字体
    WARNING = '\033[93m'    #深黄色字体
    FAIL = '\033[91m'       #浅红色字体
    ENDC = '\033[0m'        #结尾字符
    BOLD = '\033[1m'        #显示方式高亮
    UNDERLINE = '\033[4m'   #显示方式下划线
print('\033[0;31;40m'"警告的颜色字体?"'\033[0m')
print('\033[0;95;42m'"红烧小强强"'\033[0m')

完数

题目 一个数如果恰好等于它的因子之和(除了自身之外),这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
程序分析 将每一对因子加进集合,在这个过程中已经自动去重。最后的结果要求不计算其本身。

result=[]
for i in range(1,1000):
    tmp=[]
    for k in range(1,i+1):
        if k<i:
            if not i%k:
                tmp.append(k)
    count=0
    for m in tmp:
        count=count+m		#i的全部因数(除了自身)之和等于i
    if count==i:
        result.append(i)
    else:
        continue
print(result)

[6, 28, 496]

高空抛物

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

high=100
total=100
for i in range(1,11):
    high/=2
    total+=high
print(high)
print('总长:',total)

0.09765625
总长: 199.902343

猴子偷桃

题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析 按规则反向推断:猴子有一个桃子,他偷来一个桃子,觉得不够又偷来了与手上等量的桃子,一共偷了9天。

peach=1
for i in range(9):
    peach=(peach+1)*2
print(peach+1)

1535

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了半个,第二天早上又将剩下半个的桃子吃掉,又多吃了一个。以后每天早上都吃了前一天剩下的半个零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析,倒着计算,重第十天计算到第一天

peach=[]
peach_1=0
peach_2=0
for i in reversed(range(1,11)):
    if i==10:
        peach_1=1
        name.append(peach_1)
    elif 2<=i<=9:
        peach_2=peach_2+1.5
    else:
            peach=(peach_1+peach_2)*2
print(peach+0.5)

26.5

数归档

题目 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析 用条件判断即可。

collect=[]
for i in range(1,11):
	name=input("请输入名字:")
	grade=int(input("输入分数:"))
	if grade>=90:
		grade="A"
	elif 60<=grade<=89:
		grade="B"
	else:
		grade="C"
	name_grade={name:grade}
	collect.append(name_grade)
print("这十个人的成绩:"+str(collect))

画菱形
题目 打印出如下图案(菱形):

    *
   ***
  *****
 *******
  *****
   ***
   *
def draw(num):
    a="*"*(2*(4-num)+1)
    print(a.center(9,' '))
    if num!=1:
        draw(num-1)
        print(a.center(9,' '))
draw(4)

菱形失败,画三角形

for i in range(1,10):
    if i<=5:
        a="*"*i
        print('\033[0;31;40m'+a.center(9,' ')+'\033[0m')
    else:
        a="*"*(2*(i-4)+1)
        print('\033[0;31;40m' +a.center(9,' ') +' \033[0m')
    *    
    **   
   ***   
   ****  
  *****  
  *****   
 *******  
********* 
*********** 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值