Python 基础案例实战
搞懂Python的核心语言元素(变量、类型、运算符、表达式、分支结构、循环结构等)
学完前面的内容,知识点还是有点多的,需要用一些案例来讲解和做一些练习来巩固之前所学的知识,虽然所学的内容只是Python基础中的基础,但是这些内容确是Python基础和总要的部分。对于Python初学者来说,了解Python的变量、类型、运算符、表达式、分支结构和循环结构之后,就可以尝试用所学知识去解决现实中的问题,从学会到应用中间需要大量的练习,下面整理了一些经典的案例和习题,来帮助大家巩固所学的Python知识,同时帮助大家了解如何建立程序中的逻辑以及如何运用一些简单的算法解决现实中的问题。
寻找1000以内水仙花数
如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此153就是一个水仙花数。如何求1000以内的水仙花数呢?
方法一:先求得百、十、个位的数字值,再按照水仙花数的定义来找符合条件的数
for num in range(100, 1000):
low = num % 10
mid = num // 10 % 10
high = num // 100
if num == low ** 3 + mid ** 3 + high ** 3:
print(num)
执行结果:
方法二:将数字先转化为字符串,利用字符串索引找到百、十、个位的数字值,再按照水仙花数的定义来找符合条件的数
for i in range(100,1000):
s = str(i)
bai = int(s[0])
shi = int(s[1])
ge = int(s[2])
if i == bai ** 3 + shi** 3 + ge ** 3:
print(i)
执行结果:
百钱买百鸡
有100文钱,要买100只鸡,公鸡5文一只,母鸡3文一只,小鸡三只一文,问公鸡母鸡小鸡各多少只?
用穷举法进行暴力破解,通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。
for x in range(1, 20):
for y in range(1, 33):
z = 100 - y - x
if z % 3 == 0 and 5 * x + 3 * y + z / 3 == 100:
print('公鸡:', x, '只', '母鸡:', y, '只', '小鸡:', z, '只')
执行结果:
公鸡: 4 只 母鸡: 18 只 小鸡: 78 只
公鸡: 8 只 母鸡: 11 只 小鸡: 81 只
公鸡: 12 只 母鸡: 4 只 小鸡: 84 只
两数之和
寻找列表中满足两数之和等于目标值的元素的下标。例如:arr = [1,2,7,4,9,13],target = 6 则返回 [0,2],若不存在,返回空列表[]。
两数之和面试中经常会被问到,这个问题是考察用空间换取时间这个特性的理解。
arr = [1,2,7,4,9,13]
target = 15
for i in range(len(arr)):
res = target - arr[i]
if res in arr and arr.index(res) != i:
print([i,arr.index(res)])
执行结果:
合并两个有序数组
给定两个按升序排列的有序数组,将它们合并成一个新的有序数组。例如:a = [1,2,6,8], b = [2,4,7,10],输出为 arr = [1,2,2,4,6,7,8,10]
这道题目考察的是归并排序的基本思想。
arr = []
i,j = 0,0
arr1 = [1,2,6,8]
arr2 = [2,4,7,10]
while True:
if i==len(arr1):
arr.extend(arr2[j:])
print(arr)
break
elif i==len(arr2):
arr.extend(arr1[i:])
print(arr)
break
else:
if arr1[i] < arr2[j]:
arr.append(arr1[i])
i = i+1
else:
arr.append(arr2[j])
j = j+1
执行结果:
[1, 2, 2, 4, 6, 7, 8, 10]
最长不重复字符串
给定一个字符串,找出没有重复字符的最长的子串。例如输入“abcbefgf”,答案是 “cbefg”。
这是一道动态规划+哈希查找的综合应用题。这道题能做出来,你的代码功底很可以啊。
str = "asldfjaslfuowqerlkashdkfhasdlfkksadfoqwer"
start,maxlen,substr = 0,0,""
dic = {}
for i,x in enumerate(str):
if x in dic:
start = max(dic[x]+1,start)
dic[x] = i
else:
dic[x] = i
if i-start+1>maxlen:
maxlen = i-start+1
substr = str[start:i+1]
print(substr)
执行结果:
全排列
给定一个数组,找出其所有可能的排列。例如: arr = [1,1,3],输出为 [[1,1,3],[1,3,1],[3,1,1]]。
这是一道动态规划+排列组合的综合应用题。
import numpy
arr = [1,1,3,7,6,4,5]
if len(arr)<=1:
print(arr)
t = [arr[0:1]]
i = 1
while i<=len(arr)-1:
a = arr[i]
t = [xs[0:j]+[a]+xs[j:] for xs in t for j in range(i+1)]
t = numpy.unique(t,axis=0).tolist() # unique函数去除重复的元素,并按元素由大到小排列
i = i + 1
print(t)
执行结果:
课后练习
生成斐波那契数列的前20个数。
说明:斐波那契数列(Fibonacci sequence),又称黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中提出一个在理想假设条件下兔子成长率的问题而引入的数列,所以这个数列也被戏称为"兔子数列"。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,形如:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。
找出10000以内的完美数。
说明:完美数又称为完全数或完备数,它的所有的真因子(即除了自身以外的因子)的和(即因子函数)恰好等于它本身。例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美数。完美数有很多神奇的特性,有兴趣的可以自行了解。
输出100以内所有的素数。
说明:素数指的是只能被1和自身整除的正整数(不包括1)。
上面练习的参考答案自行查找,如果需要帮助请读者留言。