Python练手经典100例(未完待续……)

标签: Python练手经典100例

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

解题思路:用枚举法列出所有数字组合,去掉不符合条件的。

numbers = [1, 2, 3, 4]
lists = []

for a in numbers:
    for b in numbers:
        for c in numbers:
            if (a == b) or (a == c) or (b == c):
                pass
            else:
                result = 100 * a + 10 * b + c
                if result not in lists:
                    lists.append(result)
print "\n总共有%d个符合条件的数字" % (len(lists))
print lists

1

例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:假设利润为5万,属于0-10区间,对应的提成为10%,奖金总数=5*10%;
例2:假设利润为70万,属于60-100区间,对应的提成为1.5%,先用70*1.5%,
奖金总数=70*1.5%+60*(3%-1.5%)+40*(5%-3%)+20*(7.5%-5%)+10*(10%-7.5%);
例3:假设利润为200万,属于100以上区间,对应的提成为1%,先用200*1%,
奖金总数 =200*1%+100*(1.5%-1%)+60*(3%-1.5%)+40*(5%-3%)+20*(7.5%-5%)+10*(10%-7.5%)

可扩展性说明:利润等级和对应奖金提成可以随意添加或更改

levels = [10, 20, 40, 60, 100]
percentage = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]

profit = float(raw_input("please input a profit(10 thousand): \n"))
bonus = 0

for i in range(len(levels)):
    if profit > levels[i]:
        bonus += levels[i] * (percentage[i]-percentage[i+1])
        if i == len(levels) - 1:
            i += 1
            bonus += profit * percentage[i]
    else:
        bonus += profit * percentage[i]
        break

print "当利润为%r万时,应发放奖金总数为%r万" %(profit, bonus)

2

例3
题目描述:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

解题思路:两个平方数中间相差168,则较大的那个数必定不超过84,遍历0至84的平方,挑选出所有相差168的平方数对

squares = []
results = []

for i in range (85):
    squares.append(i**2)

for square1 in squares:
    for square2 in squares:
        if square2 - square1 == 168:
            results.append(square1-100)

print "\n一共有%d个符合条件的数字:" % (len(results))
print results

3

例4
题目描述:输入某年某月某日,判断这一天是这一年的第几天?

解题思路:用年份来区分2月份是28天还是29天,闰年判定方法:能被4整除的为闰年,如2004年是闰年,2002不是闰年,另外,世纪年能被400整除的是闰年,否则不是闰年,如2000年是闰年,1900年不是闰年。列出1-12月每个月上一个月的天数,1月没有上一个月,它上一个月的天数为0,根据月计算截止到上个月已经过去多少天,再加上月份后面的日

date = raw_input("please input a date like '2009-8-7': ")

year, month, day = int(date.split("-",2)[0]), int(date.split("-",2)[1]), int(date.split("-",2)[2])
months_day = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]

result = sum(months_day[:month])+day
if month > 2 and year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) :
    result += 1
print "%r是%d年的第%d天" % (date, year,result)

4

例5
题目描述:输入三个整数x,y,z,请把这三个数由小到大输出

解题思路:将第一个数和第二个数依次与它后面的数比较,若前者较大,则两个相比较的数互换位置
可扩展性说明:参与排序的整数个数可以随意增加

input = raw_input("please input some integers like '1 2 3'\n:")
lists = input.split(' ',input.count(' '))
sequence = []
for number in lists:
    sequence.append(int(number))

for i in range(len(sequence)-1):
    for j in range(i+1, len(sequence)):
        if sequence[i] > sequence[j]:
            x = sequence[i]
            sequence[i] = sequence[j]
            sequence[j] = x
print sequence

5
例6-1
题目描述:用*号输出字母C的图案。

解题思路:每一行固定9个字符,第一行3个星,第二行2个星,第三行1个星……

print " "*3,"*"*3," "*3
print "  *"," "*4,"* "
print " *"," "*7
print "*"," "*8
print "*"," "*8
print " *"," "*7
print "  *"," "*4,"* "
print " "*3,"*"*3," "*3

6-1
例6-2
题目描述:斐波那契数列

解题思路:斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……

result = [1, 1]
for i in range(0, 30):
    result.append(result[i]+result[i+1])
print result

6-2
例7
题目描述:将一个列表的数据复制到另一个列表中

    list_old = range(10)
    list_new = []
    for a in list_old:
        list_new.append(a)
    print list_old
    print list_new

7
例8
题目描述:输出 9*9 乘法口诀表
解题思路:所有等式里最长的是9 X 9 = 81,一共10个字符,为了使结果美观,等式与等式之间预留3个字符的空白,即每个等式占13个字符

for i in range(1,10):
    row = ''
    for j in range(1,10):
        if j<=i:
            equation = '%d X %d = %d' %(j, i, i*j)
            row += equation + ' '* (13-len(equation))
    print row + '\n'

8

例9
题目描述:判断101-200之间有多少个素数,并输出所有素数。

解题思路:素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

lists = []
for i in range(101, 201):
    k = 0
    for j in range(2, int(i * 0.5) + 1):
        if i % j == 0:
            k += 1
    if k == 0:
        lists.append(i)
print "101-200之间共有%d个素数:" %(len(lists))
print lists

9

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

lists = []

for i in range(100, 1000):
    j = str(i)
    a, b, c = int(j[0]), int(j[1]), int(j[2])
    if i == a**3 + b**3 + c**3:
        lists.append(i)
print '总共有%d个"水仙花数":' %(len(lists))
print lists

10

例11
题目描述:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

解题思路:用该数除以2,如果能整除,就继续除以2,否则除以3,如果能整除就继续除以3……

lists = []
number = int(raw_input("please input an integer:"))
number1 = number
result = str(number) + '='
j = 2
for i in range(number):
    if number1 % j == 0:
        lists.append(j)
        number1 = number1/j
        if len(lists) == 1:
            result += str(j)
        else:
            result += '*' + str(j)
    elif j < number1:
        j += 1
    else:
        break
if number1 == 1:
    print result
else:
    print result, '*', str(number1)

11

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

score = int(raw_input("please input an integer between 0 to 100:"))
if score <90:
    if score < 60:        
        print "学习成绩为C"
    else:
        print "学习成绩为B"
else:
    print "学习成绩为A"

12

例13
题目描述:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

解题思路:ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,
它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
0~9数字的ASCII码值取值范围为48~57
a~z小写英文字母的取值范围为97~122
A~Z大写英文字母的取值范围为65~90
空格的取值为32

letters = []
spaces = []
digits = []
other_chracters = []

chracters = raw_input("please input one line chracters:")
for chracter in chracters:
    if ord(chracter) in range(65, 91) or ord(chracter) in range(97, 123):
        letters.append(chracter)
    elif ord(chracter) == 32:
        spaces.append(chracter)
    elif ord(chracter) in range(48,58):
        digits.append(chracter)
    else:
        other_chracters.append(chracter)

print "这串字符中共用%d个英文字母,%d个空格,%d个数字,%d个特殊字符。" %(len(letters), len(spaces), len(digits), len(other_chracters))

13

例14
题目描述:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

解题思路:输入两个数字,一个是a,一个是用来相加的数字数量。

a = raw_input("please input an integer between 1 to 9:")
n = int(raw_input("please input how many numbers do you want:"))
lists = []
strs = ''
for i in range (n):
    strs = strs + a
    lists.append(int(strs))

print sum(lists)

14

例15
题目描述:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

perfect_numbers = []
for i in range(1, 1001):
    factors = []
    for j in range(1, i):
        if i % j == 0:
            factors.append(j)
    if sum(factors) == i:
        perfect_numbers.append(i)

print "1000以内有%d个完数:" %(len(perfect_numbers))
print perfect_numbers

15

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

解题思路:第一次落地时,共经过100米,第一次反弹高度为50米;
第二次落地时,共经过100+50*2=200米,第二次反弹高度为25米……

height = 100
times = 10
distance = height
for i in range(times-1):
    height = height * 0.5
    distance = distance + height*2

print "第%d次落地时共经过%s米, 第%d次反弹高度为%s米。" %(times, times, distance - height, height * 0.5)

16

例17
题目描述:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

解题思路:由第10天逆推,第9天早上有(1+1)*2=4个桃子,第八天早上有(4+1)*2=10个桃子……总共逆推10-1=9次

fruits = 1
days = 10

for i in range(days-1):
    fruits = (fruits + 1) * 2

print "第一天共摘了%d个桃子。" %(fruits)

17

例18
题目描述:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。
有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

解题思路:c和y比,a和z比,b和x比……

list_xyz = ['x', 'y', 'z']

for a in list_xyz:
    for b in list_xyz:
        for c in list_xyz:
            if a != b and a != c and b != c and a != 'x' and c != 'x' and c != 'z':
                groups = {'a': a, 'b': b, 'c': c}
                print groups

18

例19
题目描述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。

a = 2.0
b = 1
result = 0
for i in range(20):
    result += a/b
    b, a = a, a+b
print result

19

例20
题目描述:求1+2!+3!+…+20!的和

a =1
result = 1
for i in range(1, 20):
    a *= i+1
    result += a
print result

20

例21
题目描述:利用递归方法求5!。

解题思路:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归函数特性:
必须有一个明确的结束条件;
每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)。

def fun(i):
    if i == 1:
        return 1
    else:
        return i*fun(i-1)

print fun(5)

21

例22
题目描述:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

def reverse(chrs):
    if len(chrs) == 1:
        return chrs
    else:
        return chrs[-1] + reverse(chrs[:-1])

print reverse('abcde')

22

例23
题目描述:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。
问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

def age(i,j):  #第1个人的年纪为j,返回第i个人的年纪
    if i == 1:
        A = j
    else:
        A = age(i-1,j) + 2
    return A
print age(5,10)

23

例24
题目描述:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

def number(n,i):
    l = len(str(n))
    if l == 1:
        print "there are %d digits in the number." % (i)
        return str(n)
    else:
        i += 1
        return str(n)[-1] + number(n/10, i)
print number(1234,1)

24

例25
题目描述:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

解题思路:注意字符串与数字两种格式之间的转换。

number = raw_input("please input an integer with 5 digits:\n")

if number[0] == number[-1] and number[1] == number[-2]:
    print "%d是回文数" %(int(number))
else:
    print "%d不是回文数" %(int(number))

25

例26
题目描述:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

解题思路:1.输入的字母全部转成大写;
2.创建两个列表,列表1非重复列举出7个单词的首字母,列表2列出列表1里每个字母对应的第二个字母;
3.定义两个函数,第一个函数:如果输入的字母不在给定的列表1里面,就要求重新输入,如果输入的字母在列表2里对应的字母只有1个,就根据输入的字母匹配到原单词; 如果输入的字母在列表2里对应的字母有多个,就跳转到第二个函数;
第二个函数:如果输入的字母不在给定的列表里面,就要求重新输入,否则就结合两个函数输入的两个字母匹配到原单词。

def week1(weekdays1):
    list1, list2 = [], []
    for weekday in weekdays1:
        if weekday[0] not in list1:
            list1.append(weekday[0])
            list2.append([])
            list2[-1].append(weekday[1].upper())
        else:
            list2[list1.index(weekday[0])].append(weekday[1].upper())
    return week2(list1, list2, weekdays1)

def week2(list_1, list_2, weekdays2):
    A = raw_input("please choose a letter in %s:" %(list_1)).upper()
    if A not in list_1:
        return week2(list_1, list_2, weekdays2)
    else:
        list_2_1 = list_2[list_1.index(A)]
        if len(list_2_1) == 1:
            return week4(A, weekdays2)
        else:
            return week3(A, list_2_1, weekdays2)

def week3(a, list_3, weekdays3):
    B = raw_input("please choose a letter in %s:" %(list_3)).upper()
    if B not in list_3:
        return week3(a, list_3, weekdays3)
    else:
        return week4(a + B, weekdays3)

def week4(c, weekdays4):
    for weekday in weekdays4:
        if c == weekday[:len(c)].upper():
            print weekday

weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']            
week1(weekdays)

26

例27
题目描述:按||分隔列表。

解题思路:熟悉join使用方法

lists = ['a', 'b', 'c', 'd', 'e']
print '||'.join(a for a in lists)

27

例28
题目描述:求一个3*3矩阵对角线元素之和。

解题思路:利用numpy创建矩阵

import numpy as np
nd = np.arange(1, 10).reshape((3, 3))
print nd
print sum(nd[i,i] for i in range(len(nd)))

28

例29
题目描述:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中

解题思路:先判定初始数组是按升序排列还是按降序排列,如果初始数组不是有序数组,则要求输入新的有序数组替换初始数组,再根据排序规则将新的数字插入数组

def insert(array,a):
    j, k = 0, 0
    for i in range(len(array)-1):
        if array[i] < array[i+1]:
            j += 1
        elif array[i] > array[i+1]:
            k += 1
        else:
            j += 1
            k += 1
    if j == len(array)-1 or k == len(array)-1:
        if j == len(array)-1:
            array.append(array[-1]+1)
            for i in range(len(array)):
                if a < array[i]:
                    break
        else:
            array.append(array[-1]-1)
            for i in range(len(array)):
                if a > array[i]:
                    break
        if i != len(array)-1:
            for m in range(1,len(array)-i+1):
                array[len(array)-m] = array[len(array)-m-1]
        array[i] = a
        print array
    else:
        inputs = raw_input("The original array is not ordered array. Please input an ordered array like '1 2 3 4':")
        lists = inputs.split(' ', inputs.count(' '))
        array = []
        for item in lists:
            array.append(int(item))
        return insert(array,a)
initial_array, a = [1, 2, 1, 3, 4, 10], 9
insert(initial_array, a)

29

原文链接:加载失败,请重新获取