Python入门第一次练习
纸上得来终觉浅,绝知此事要躬行。

光说不练假把式,所以还是需要找点题目来巩固一下自己博客中写到的基础知识,而且长时间不去复习的话很容易就会遗忘了。这样,就会让我们产生书到用时方恨少的感觉,所以练习和复习都是十分十分重要的。
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))))