Python入门第一次练习


纸上得来终觉浅,绝知此事要躬行。

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循环和printend参数,默认的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个列表AB,其中BA的子集但顺序是乱的,现在编写一个函数用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

需求说明

  • 遍历并打印120,如果数字能被3整除,显示Fizz;如果数字能被5整除,显示Buzz;如果能同时被35整除,就显示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))))

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录