Python 练习100例


本文主要内容来自Python 100例。为了加深印象,自己再敲一遍代码。如有侵权,立即删除。

运行环境:

1
2
3
操作系统:win7 64bit
Python Version:Python 2.7.13
开发IDE:PyCharm Community Edition 2.16.3.2

实例1

题目: 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数“各是多少?
程序分析: 可填在百位、十位、个位的数字都是1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
源码:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# -*- coding:UTF-8 -*-

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万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序分析: 请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。使用PyCharm的调试功能,可以更清楚程序的执行过程。

数轴
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
# -*- coding:UTF-8 -*-

i = int(raw_input('净利润:')) # 输入当月利润
arr = [1000000, 600000, 400000, 200000, 100000, 0] # 定义利润数组
rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1] # 定义提成百分比
r = 0 # 定义应发放奖金总数
for idx in range(0, 6):
if i > arr[idx]:
r += (i-arr[idx])*rat[idx]
print (i-arr[idx])*rat[idx]
i = arr[idx]
print r

实例3

题目: 一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?
程序分析: 完全平方即用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。在10000以内判断,将该数加上100后再开方,加上268后再开方,如果开方后的结果满足如下条件,即是结果。
源码:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python
# -*- coding:UTF-8 -*-

import math
for i in range(10000):
# 转化为整型值
x = int(math.sqrt(i + 100))
y = int(math.sqrt(i + 268))
if(x * x == i + 100) and (y * y == i + 268):
print i

实例4

题目: 输入某年某月某日,判断这一天是这一年的第几天?
程序分析: 以3月5日为例,应该先把前两个月的天数加起来,然后再加上5天即本年的第几天。特殊情况:闰年且输入月份大于2时需考虑多加一天:
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/python
# -*- coding:UTF-8 -*-

year = int(raw_input('Input year:\n'))
month = int(raw_input('Input month:\n'))
day = int(raw_input('Input day:\n'))

months = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334)
if 0 < month <= 12:
sumday = months[month - 1]
else:
print 'data error'

sumday += day
leap = 0 # 是否是闰年
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)): # 判断是否是闰年
leap = 1;
if (leap == 1) and (month > 2):
sumday += 1 # 如果是闰年并且月份大于2,则总的天数要加1
print 'It is the %dth day.' % sumday

实例5

题目: 输入三个数x,y,z,请把这三个数由小到大输出。
程序分析: 使用列表的sort()方法进行排序。
源码:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding:UTF-8 -*-

i = []
for idx in range(3):
x = int(raw_input('integer:\n'))
i.append(x)
i.sort()
print i

实例6

题目: 斐波那契数列。
程序分析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,费波那契数列是以递归的方法来定义:

1
2
3
F0 = 0 (n=0)
F1 = 1 (n=1)
Fn = F(n-1) + F(n-2) (n=1)

源码:
方法一:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python
# -*- coding:UTF-8 -*-


def fib(n):
a, b = 1, 1
for i in range(n-1):
a, b = b, a+b
return a

# 输出第10个斐波那契数列
print fib(10)

方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python
# -*- coding:UTF-8 -*-


# 使用递归
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)

# 输出了第10个斐波那契数列
print fib(10)

方法三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# -*- coding:UTF-8 -*-


def fib(n):
if n == 1:
return [1]
if n == 2:
return [1, 1]
fibs = [1, 1]
for i in range(2, n):
fibs.append(fibs[-1] + fibs[-2])
return fibs

# 输出了前10个斐波那契数列
print fib(10)

实例7

题目: 将一个列表的数据复制到另一个列表中。
程序分析: 使用列表[:]。
源码:

1
2
3
4
5
6
7
#!/usr/bin/python
# -*- coding:UTF-8 -*-

a = [1, 2, 3]
b = a[:]
print b

实例8

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

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# -*- coding:UTF-8 -*-

for i in range(1, 10):
for j in range(1, 10):
result = i * j
print '%d * %d = % -3d' % (i, j, result)
print ''

实例9

题目: 暂停一秒输出。
程序分析: 无。
源码:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding:UTF-8 -*-

import time

myD = {1: 'a', 2: 'b'}
for key, value in dict.items(myD):
print key, value
time.sleep(1) # 暂停1秒

实例10

题目: 暂停一秒输出。
程序分析: 无。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python
# -*- coding:UTF-8 -*-

import time

print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

# 暂停一秒
time.sleep(1)

print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

实例11

题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数是多少?
程序分析: 兔子对数(注意是对数,不是个数)的规律为数列1,1,2,3,5,8,13,21……
源码:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python
# -*- coding:UTF-8 -*-

f1 = 1
f2 = 1
for i in range(1, 21):
print '%12ld %12ld' % (f1, f2)
if (i % 3) == 0:
print ''
f1 += f2
f2 = f1 + f2

实例12

题目: 判断101-200之间有多少个素数,并输出所有素数。
程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数)之间的数,如果能被整除,则表明此数不是素数,反之是素数。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python
# -*- coding:UTF-8 -*-


from math import sqrt

h = 0 # 所有素数的个数
leap = 1 # 是否能被整除

for m in range(101, 201):
k = int(sqrt(m + 1))
for i in range(2, k + 1):
if m % i == 0:
leap = 0
break
if leap == 1:
print '%-4d' % m
h += 1
if h % 10 == 0:
print ''
leap = 1

print 'The total is %d' % h

实例13

题目: 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身,例如:153是一个“水仙花数”,因为$153=1^3+5^3+3^3$
程序分析: 利用for循环100-999之间的数,每个数分解出个位,十位,百位。
源码:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# -*- coding:UTF-8 -*-

for n in range(100, 1000):
i = n / 100
j = n / 10 % 10
k = n % 10
if n == i ** 3 + j ** 3 + k ** 3:
print n

实例14

题目: 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
程序分析: 对n进行分解质因数,应先找到一个最小的质数k(质数又称素数,一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数;否则称为合数),然后按下述步骤完成:

  1. 如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印即可。
  2. 如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
  3. 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/python
# -*- coding:UTF-8 -*-


def reduceNum(n):
print '{} = '.format(n), # print末尾加逗号把换行符替代成一个空格
if not isinstance(n, int) or n <= 0:
print '请输入一个正确的数字!'
exit(0)
elif n in [1]:
print '{}'.format(n)
while n not in [1]: # 循环保证递归
for index in xrange(2, n + 1):
if n % index == 0:
n /= index # n等于n/index
if n == 1:
print index
else: # index 一定是素数
print '{} *'.format(index),
break


reduceNum(90)
reduceNum(100)
reduceNum(3)

实例15

题目: 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用户用B表示,60分一下的用C表示。
程序分析: 程序分析:(a>b)?a:b这是条件运算符的基本例子。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python
# -*- coding:UTF-8 -*-

score = int(raw_input('input score:\n'))
if score >= 90:
grade = 'A'
elif score >= 60:
grade = 'B'
else:
grade = 'C'

print '%d belongs to %s' % (score, grade)

实例16

题目: 输出指定格式的日期。
程序分析: 使用datetime模块。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/python
# -*- coding:UTF-8 -*-

import datetime

if __name__ == '__main__':
# 输出今日日期,格式为dd/mm/yyyy。更多选项可以查看strftime()方法
print(datetime.date.today().strftime('%d/%m/%Y'))

# 创建日期对象
birthDate = datetime.date(1941, 1, 5)
print(birthDate.strftime('%d/%m/%Y'))

# 日期算数运算
birthNextDay = birthDate + datetime.timedelta(days=1)
print(birthNextDay.strftime('%d/%m/%Y'))

# 日期替换
birthNextYear = birthDate.replace(year=birthDate.year + 1)
print(birthNextYear.strftime('%d/%m/%Y'))

实例17

题目: 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析: 利用while语句,条件为输入的字符不为’\n’。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
# -*- coding:UTF-8 -*-

s = raw_input("inout a string:\n")
letters = 0
space = 0
digit = 0
others = 0
for c in s:
if c.isalpha():
letters += 1
elif c.isdigit():
digit += 1
elif c.isspace():
space += 1
else:
others += 1
print 'char = %d, space = %d, dight = %d, others = %d' % (letters, space, digit, others)

实例18

题目: 求s = a + aa + aaa + aaaa + aa…a的值,其中a是一个数字。例如3 + 22 + 222 + 2222 +22222(此时共有5个数相加),几个数相加由键盘控制。
程序分析: 关键是计算出每一项的值。
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
# -*- coding:UTF-8 -*-

Tn = 0
Sn = []
n = int(raw_input('请输入相加数的个数n = :\n'))
a = int(raw_input('请输入数的大小a = :\n'))
for count in range(n):
Tn += a
a *= 10
Sn.append(Tn)
print Tn

Sn = reduce(lambda x, y: x + y, Sn)
print '求和:%d5' % Sn

实例19

题目: 一个数如果恰好等于它的因子之和,这个数就被称为“完数”,例如6 = 1 + 2 + 3。找出1000以内的所有完数。
程序分析: 请参照程序 实例14
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python
# -*- coding:UTF-8 -*-

from sys import stdout
# j保存了1000以内的所有正整数
# s的初值与j相同,每找到一个j的因子,就用s减去这个因子的值,当s的值减为0时,j就是一个完数
# 每找到一个因子,n的值就加一
for j in range(2, 1001):
k = [] # 保存因子列表
n = -1
s = j
for i in range(1, j):
if j % i == 0:
n += 1
s -= i
k.append(i)

if s == 0:
print j
for i in range(n):
stdout.write(str(k[i]))
stdout.write(' ')
print k[n] # 打印最后一个因子并输出换行

实例20

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

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python
# -*- coding:UTF-8 -*-

Sn = 100.0
Hn = Sn / 2

for n in range(2,11):
Sn += 2 * Hn
Hn /= 2

print 'Total of road is %f' % Sn
print 'The tenth is %f meter' % Hn

参考

MathJax basic tutorial and quick reference
Hexo-NexT主题使用mathjax输入数学公式注意事项
hexo在Next主题下输入数学公式