纸上得来终觉浅,绝知此事要躬行。
光说不练假把式,所以还是需要找点题目来巩固一下自己博客中写到的基础知识,而且长时间不去复习的话很容易就会遗忘了。这样,就会让我们产生书到用时方恨少的感觉,所以练习和复习都是十分十分重要的。
1. 乘法口诀
需求说明
- 编写一个程序,执行时输出乘法口诀表。
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
标准实现
- 主要考察了
for
循环和print
的end
参数,默认的end
参数的值是\n
表示换行,而这个需求里面m
值相同时不要换行,所以需要修改end
参数的值不让它换行。
for num1 in range(1, 10):
for num2 in range(1, num1+1):
print(f'{num2}*{num1}={num1*num2}', end='\t')
print()
2. 列表去重
需求说明
- 编写一个函数,可以去除一个列表中重复的元素,并且保持元素的顺序。
In : l = [1, 3, 6, 9, 3, 4, 1, 3]
In : unique(l)
Out: [1, 3, 6, 9, 4]
代码实现
- 列表去重最基本版本。
def unique(l):
lst = []
for node in l:
if node not in lst:
lst.append(node)
return lst
- 上面写法内容太长了,可以改良成如下版本。
# 其中lst.append函数的返回值为空,导致其or的结果0
def unique(l):
lst = []
return [node for node in l if not (node in lst or lst.append(node))]
- 也可以使用
yield
的方式,改良成如下版本。
def unique2(l):
lst = []
for node in l:
if node not in lst:
yield node
lst.append(node)
标准实现
- 终极解决方案是,
Python3.6
之后可以记录插入字典的键值对顺序,所以可以这么写。
def unique3(items):
return list(dict.fromkeys(items))
3. 列表排序
需求说明
- 有
2
个列表A
和B
,其中B
是A
的子集但顺序是乱的,现在编写一个函数用A
中的元素顺序对B
进行排序。
In : A = [1, 3, 7, 10, 5, 2]
In : B = [2, 3, 5]
In : my_sort(A, B)
Out: [3, 5, 2]
代码实现
- 如下,是一个最基础版本的实现方法。
def my_sort(ListA, ListB):
lst = []
for node in ListA:
if node in ListB:
lst.append(node)
return lst
- 当然,也可以使用
enumerate
和字典。
def my_sort(ListA, ListB):
index_map = {k: i for i, k in enumerate(ListA)}
return sorted(ListB, key=lambda x: index_map[x])
标准实现
- 终极方案就是,利用
sorted
函数的参数key
来指定排序规则。
def my_sort(ListA, ListB):
return sorted(ListB, key=ListA.index)
4. FizzBuzz
需求说明
- 遍历并打印
1
到20
,如果数字能被3
整除,显示Fizz
;如果数字能被5
整除,显示Buzz
;如果能同时被3
和5
整除,就显示FizzBuzz
。
Out: 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
代码实现
- 如下,是一个最基础版本的实现方法。
s = ''
for num in range(1, 21):
if num % 3 == 0:
s += 'Fizz '
elif num % 5 == 0:
s += 'Buzz '
elif num % 3 == 0 and num % 5 == 0:
s += 'FizzBuzz '
else:
s += str(num) + ' '
print(s)
标准实现
- 注意最后可以不用写
else
,而是直接return
了对应数值。
def fizzbuzz(n):
if n % 3 == 0:
return 'Fizz'
elif n % 5 == 0:
return 'Buzz'
elif n % 3 == 0 and n % 5 == 0:
return 'FizzBuzz'
return str(n)
print(' '.join(fizzbuzz(n) for n in range(1, 21)))
5. 素数查找
需求说明
- 编写过滤
1-100
中的素数的函数,使用高阶函数filter
完成。
[2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 52, 53, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 79, 82, 83, 86, 88, 89, 92, 94, 97]
代码实现
- 如下,是一个最基础版本的实现方法。
def is_prime(n):
if n == 1:
return False
elif n==2:
return True
else:
for x in range(2, n):
if not n % x:
return False
return True
print(list(filter(is_prime, range(1, 101))))
标准实现
- 这里有个问题,
2
的倍数肯定不是素数,上面的函数可以改成。
import math
def is_prime(n):
if n == 1:
return False
elif n==2:
return True
else:
for i in range(3, int(math.sqrt(n)+1), 2):
if not n % i:
return False
return True
print(list(filter(is_prime, range(1, 101))))