Python: Exercise Examples


  1. 从低位依次打印,并计算位数
    n = int(input('number: '))
    count = 0
    
    while True:
        print(n % 10)
        n = n // 10
        count += 1
        if n == 0:
            break
    print('number of digits: ', count)
  2. 从高位依次打印(必须先得到位数)
    n = int(input('number: '))
    count = 0
    
    if n > 1000:
        if n > 10000:
            count = 5
        else:
            count = 4
    else:
        if n > 100:
            count = 3
        elif n > 10:
            count = 2
        else:
            count = 1
    
    print('digits: {0}'.format(count))
    
    prev = 0
    for i in range(count, 0, -1):
        curr = n // (10 ** (i - 1))
        print(curr - prev * 10)
        prev = curr
  3. 求1-5 factorial 和
    sum = 0
    for i in range(1, 6):
        n = 1
        for j in range(1, i + 1):
            n *= j
        sum += n
    else:
        print(sum)
    
    tmp = 1
    # method 2
    sum = 0
    for i in range(1, 6):
        tmp *= i
        sum += tmp
    else:
        print(sum)
  4. prime number

  5. 九九乘法表
    for i in range(1,10):
      for j in range(1,i+1):
        print('{1} * {0} = {2}\t'.format(i,j,i*j),end='')
      print()
    for i in range(1,10):
      for j in range(1,i+1):
        product=i*j
        if j>1 and product<10:
          product=str(product)+' '
        else:
          product=str(product)
        print(str(j)+'*'+str(i)+'='+product,end=' ')
      print()
    for i in range(1,10):
      line=''
      for j in range(1,i+1):
        line+='{0}*{1}={2:<2} '.format(j,i,i*j)
      print(line)

    for i in range(1, 10):
      line = ''
      for j in range(1, 10):
        if j < i:
          line += ' ' * 7
        else:
          line += '{}*{}={:<2} '.format(i, j, i * j)
      print(line)
    for i in range(1, 10):
      print(' ' * 7 * (i - 1), end='')  # print space 
      for j in range(i, 10):
        print('{0}*{1}={2:<2} '.format(i, j, i * j), end='')
      print()
  6. 打印 rhombus
    for i in range(-3, 4):
      if i < 0:
        prespace = -i
      else:
        prespace = i
      print(' ' * prespace + '*' * (7 - 2 * prespace))
    
      
    for i in range(-3, 4):
      prespace = i if i >= 0 else -i
      print(' ' * prespace + '*' * (7 - 2 * prespace))

    for i in range(-3, 4):
      print(' ' * abs(i) + '*' * (7 - 2 * abs(i)))

    for i in range(-3, 4):
      if i < 0:
        prev = abs(i)
        post = 3
      elif i == 0:
        prev = post = 0
      else:
        prev = 3
        post = i
      print(' ' * prev + '*' * (7 - prev - post))
      
    for i in range(-3,4):
      if i==0:
        print('*'*7)
      print(' '*abs(i)+'*'*(4-abs(i))) if i<0 else print(' '*3+'*'*(3-i))
  7. 倒序打印输入字符, 并统计出现次数
    while True:
        n = input('>').strip().lstrip('0')
        if n.isdecimal():
            break
        else:
            print('{} format wrong'.format(n))
    
    counter = [0] * 10
    
    for b in range(10):
        counter[b] = n.count(str(b))
    
    for b in range(10):
        if counter[b]:
            print(f'{b} counts: {counter[b]}')
    
    lst = list(n)
    lst.reverse()
    print(''.join(lst))
  8. 打印Fibonacci小于100项
    b, p = 0, 1
    
    print(p)
    while True:
        c = b + p
        if c > 100:
            break
        print(c)
        b = p
        p = c

    求Fibonacci第10项

    # Loop 1
    b, p = 0, 1
    
    for i in range(9):
        b, p = p, b + p
    else:
        print(p)
    
    # Loop 2
    b, p = 0, 1
    count = 0
    while True:
        b, p = p, b + p
        count += 1
        if count == 9:
            break
    print(p)
    
    
    # Recursive 1
    def fibonacci(n):
        if n < 2:
            return n
        return fibonacci(n - 1) + fibonacci(n - 2)
    
    
    print(fibonacci(10))
    
    
    # Tail Resursive
    def fibonacci(n, prev, next):
        if n == 1:
            return next
        return fibonacci(n - 1, next, prev + next)
    
    
    print(fibonacci(10, 0, 1))
  9. 求1000内的prime number
    count = 0
    lst1 = []
    lst2 = []
    for i in range(2, 1000 + 1):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            count += 1
            lst1.append(i)
    print(count)
    
    count = 1  # add 2
    # int(i**0.5)+1, 9, 15, 35
    for i in range(3, 1000 + 1, 2):
        for j in range(3, int(i ** 0.5) + 1, 2):
            if i % j == 0:
                break
        else:
            count += 1
    
    print(count)
    
    count = 2
    for i in range(3, 1000 + 1, 2):
        tmp = i ** 0.5
        for j in range(3, i, 2):
            if i % j == 0:
                break
            if j > tmp:
                count += 1
                lst2.append(i)
                break
    
    print(count)
    
    for i in lst1:
        if i not in lst2:
            print(i)
    import math
    
    n = 100
    primes = []
    for x in range(2, n + 1):
        for i in primes:
            if x % i == 0:
                break
        else:
            primes.append(x)
    
    print(len(primes))
    
    primes.clear()
    
    for x in range(2, n + 1):
        flag = True
        for p in primes:
            if x % p == 0:
                flag = False
                break
            if p == math.ceil(math.sqrt(x)):
                print(p, x)
            if p > math.ceil(math.sqrt(x)):
                break
        if flag:
            primes.append(x)
    
    print(len(primes))
  10. 猴子吃桃
    n = 1
    for i in range(9):
        n = (n + 1) * 2
    else:
        print(n)
    
    
    def peach(n):
        if n == 10:
            return 1
        return peach(n + 1) * 2 + 2
    
    
    print(peach(1))
    n = 1
    c = 0
    # while True:
    #     c += 1
    #     n = (n + 1) * 2
    #     if c == 9:
    #         break
    
    while True:
        if c == 9:  # 0-9,c==9,第十次没有执行循环
            break
        c += 1
        n = (n + 1) * 2
    print(n)
  11. 杨辉三角
    triangle = []
    
    for i in range(6):
        vex = []
        triangle.append(vex)
        for j in range(i + 1):
            if j == 0 or j == i:
                vex.append(1)
                # print(i, j, triangle, vex)
            else:
                # print(i, j, triangle, vex)
                vex.append(triangle[i - 1][j - 1] + triangle[i - 1][j])
    print(triangle)

  12.  transport matric 转置矩阵

    vex = list(range(1, 10))
    vie = []
    
    tmp = []
    for i in vex:
        tmp.append(i)
        if i % 3 == 0:
            vie.append(tmp)
            tmp = []
    
    print(vie)
    
    for i in range(len(vie)):
        for j in range(len(vie[i])):
            print(vie[j][i], end=' ')
        print()
    vex = list(range(1, 10))
    vie = []
    
    tmp = []
    for i in vex:
        tmp.append(i)
        if i % 3 == 0:
            vie.append(tmp)
            tmp = []
    
    print(vie)
    
    # 对角线 i=j,非对角线i>j或i<j, 只需交换一边
    for i in range(len(vie)):
        for j in range(i):  # i>j
            vie[j][i], vie[i][j] = vie[i][j], vie[j][i]
    
    print(vie)
    
    for i in range(len(vie)):
        for j in range(i + 1, len(vie)):  # i<j
            vie[j][i], vie[i][j] = vie[i][j], vie[j][i]
    
    print(vie)
    
    for i, row in enumerate(vie):
        for j, elem in enumerate(row):
            if i < j:
                vie[j][i], vie[i][j] = vie[i][j], vie[j][i]
    
    print(vie)

    vie = [[1, 2, 3], [4, 5, 6]]
    vole = []
    
    for i, row in enumerate(vie):
        for j, v in enumerate(row):
            if i == 0:
                vole.append([v])
            else:
                vole[j].append(v)
    
    print(vole)
    
    vole = []
    for row in vie:
        for i, v in enumerate(row):
            if len(vole) < i + 1:
                vole.append([])
            vole[i].append(v)
    
    print(vole)
    
    vole = [[0 for i in range(len(vie))] for _ in range(len(vie[0]))]
    for i, row in enumerate(vie):
        for j, v in enumerate(row):
            vole[j][i] = vie[i][j]
    
    print(vole)
  13. 随机生成10个数字,统计重复和不重复个数
    import random
    
    n = []
    for _ in range(10):
        n.append(random.randrange(21))
    
    print(n)
    
    same = []
    diff = []
    
    states = [0] * len(n)
    
    for i in range(len(n)):
        flag = False
        if states[i]:
            continue
    
        for j in range(i + 1, len(n)):
            if states[j]:
                continue
            if n[i] == n[j]:
                flag = True
                states[j] = 1
        if flag:
            same.append(n[i])
            states[i] = 1
        else:
            diff.append(n[i])
    
    print(same, diff)
  14. set 集合
    import random
    
    s1 = set()
    s2 = set()
    for _ in range(10):
        s1.add(random.randrange(10, 21))
        s2.add(random.randrange(10, 21))
    print(s1, s2)
    print(f'common: {len(s1 | s2)}')
    print(f'unique: {len(s1 ^ s2)}')
    print(f'duplicate: {s1 & s2}')
  15. 简单选择排序
    import random
    
    vixen = list(range(10))
    random.shuffle(vixen)
    print(vixen)
    
    count_iter = count_swap = 0
    for i in range(len(vixen)):
        min_index = i
        for j in range(i + 1, len(vixen)):
            count_iter += 1
            if vixen[min_index] > vixen[j]:
                min_index = j
    
        if i != min_index:
            count_swap += 1
            vixen[i], vixen[min_index] = vixen[min_index], vixen[i]
    
    print(vixen)
    print(count_iter)
    print(count_swap)

    二元选择排序

    import random
    
    vixen = list(range(10))
    random.shuffle(vixen)
    print(vixen)
    
    count_iter = count_swap = 0
    
    for i in range(len(vixen) // 2):  # len(vixen)=odd: len(vixen)//2 自然被排好序
        minindex = i
        maxindex = -i - 1  # 与minindex对称
        maxorigin = maxindex
        for j in range(i + 1, len(vixen) - i):  # 负索引也对称
            count_iter += 1
            if vixen[minindex] > vixen[j]:
                minindex = j
            if vixen[maxindex] < vixen[-j - 1]:
                maxindex = -j - 1  # not j
    
            if vixen[minindex] == vixen[maxindex]:  # 剩余元素相同
                break
    
            if i != minindex:
                vixen[i], vixen[minindex] = vixen[minindex], vixen[i]
                count_swap += 1
    
            if maxorigin != maxindex and vixen[maxorigin] != vixen[maxindex]:  # 2 2 2 2 1 情况
                vixen[maxorigin], vixen[maxindex] = vixen[maxindex], vixen[maxorigin]
                count_swap += 1
    print(vixen)
    print(count_iter)
    print(count_swap)

    b = ['{:>04}.{}'.format(n, ''.join((random.choice(string.ascii_lowercase) for _ in range(5)))) for n in range(5)]
    b = ['{:04}.{}'.format(n, ''.join((chr(random.randint(97, 122)) for _ in range(5)))) for n in range(5)]
    ['{:04}.{}'.format(n, ''.join((random.choice(bytes(range(97, 123)).decode()) for _ in range(10)))) for n in range(1, 101)]
  16. 生成随机captcha
    import random
    
    
    def captcha(size=7):
        res = ''
        for i in range(size):
            lowercase = chr(random.randint(97, 122))
            uppercase = chr(random.randrange(65, 91))
            number = chr(random.randrange(48, 58))
            res += random.choice((lowercase, uppercase, number))
        return res
    
    
    print(captcha(8))
  17. 列表解析式打印九九乘法表
    [print('{}*{}={:<3}{}'.format(j, i, i * j, '\n' if i == j else ' '), end=' ') for i in range(1, 10) for j in
     range(1, i + 1)]
  18. while True:
        n = input('>>').strip().lstrip('0')
        if n.isdecimal():
            break
        else:
            print('{} wrong'.format(n))
    d = {}
    for b in n:
        if b not in d.keys():
            d[b] = 0
        d[b] += 1
    
    # for b in n:
    #     d[b] = d.get(b, 0) + 1
    
    # for b in n:
    #     if d.get(b, None):
    #         d[b] += 1
    #     else:
    #         d.setdefault(b, 1)
    
    for b in n:
        print(f'number: {b}, count: {d[b]}')
  19. import random
    
    
    def vivify(*nums):
        return max(nums), min(nums)
    
    
    print(*vivify(*(random.randrange(10, 30) for _ in range(50))))

    def vocal(n):
        for i in range(1, 13):
            for j in range(12, 0, -1):
                if j <= i:
                    print('{:<{width}}'.format(j, width=1 if j == 1 else 3), end='')
                else:
                    print(' ' * 3, end='')
            print()
    
        print()
    
        for i in range(12, 0, -1):
            for j in range(12, 0, -1):
                if j <= i:
                    print('{:<{width}}'.format(j, width=1 if j == 1 else 3), end='')
                else:
                    print(' ' * 3, end='')
            print()
    
    
    vocal(13)
    
        
    def vivify(n):
        tail = ' '.join((str(i) for i in range(n, 0, -1)))
    
        width = len(tail)
    
        for i in range(1, n):
            print('{:>{}}'.format(' '.join((str(i) for i in range(i, 0, -1))), width))
        print(tail)
    
        print()
        
        print(tail)
        for i in range(n - 1, 0, -1):
            print('{:>{}}'.format(' '.join((str(i) for i in range(i, 0, -1))), width))
    
    
    vivify(13)
    def vivify(n):
        head = ' '.join(((str(i) for i in range(n, 0, -1))))
        print(head)
    
        for i in range(len(head)):  # 空格分隔
            if head[i] == ' ':
                print(' ' * i, head[i + 1:], sep=' ')
    
    
    vivify(13)
  20. 直接插入排序
    import random
    
    nums = list(range(10))
    random.shuffle(nums)
    
    print(nums)
    
    
    def insert_sort(vixen):
        count_assign = 0
        vixen = [0] + vixen
    
        for i in range(2, len(vixen)):
            vixen[0] = vixen[i]  # sentinel, 待插入值
            j = i - 1
            while vixen[j] > vixen[0]:
                count_assign += 1
                vixen[j + 1] = vixen[j]
                j -= 1
    
            vixen[j + 1] = vixen[0]
        print(count_assign)
        return vixen[1:]
    
    
    print(insert_sort(nums))
  21. 将数字倒序生成list
    def vixen(n, l=None):
        if l is None:
            l = []
        if n // 10:
            l.append(n % 10)
            return vixen(n // 10, l)
        l.append(n)
        return l
    
    
    print(vixen(1234))
    
    
    def vixen(n, target=None):
        if target is None:
            target = []
        x, y = divmod(n, 10)
        target.append(y)
        if x == 0:
            return target
        return vixen(x, target)
    
    print(vixen(12345))
    
    def vixen(n, target=[]):
        if n:
            target.append(int(n[-1]))
            vixen(n[:-1])
        return target
    
    
    print(vixen(str(1234)))
    
    
    def vixen(n):
        def vixen_(i):
            if i == -1:
                return ''
            return str(n)[i] + vixen_(i - 1)
    
        res = vixen_(len(str(n)) - 1)
        return [int(x) for x in res]
    
    
    print(vixen(12345))

       

  22. 猴子吃桃
    def peach(n):
        if n == 10:
            return 1
        return peach(n + 1) * 2 + 2
    
    
    print(peach(1))
    
    
    def peach(n, res=1):
        if n < 0:
            return -1
        if n == 10:
            return res
        res = res * 2 + 2
        return peach(n + 1, res)
    
    
    print(peach(1))
  23. 生成器实现febonacci
    def febonacci():
        b = 0
        p = 1
        while True:
            yield p
            b, p = p, b + p
    
    
    r = febonacci()
    for _ in range(5):
        print(next(r))
  24. 实现built-in函数sorted功能
    import random
    
    vale = list(range(10))
    random.shuffle(vale)
    
    
    def sort(iterable, reverse=False):
        ret = []
    
        # def comp()
    
        for item in iterable:
            for i, v in enumerate(ret):
                # if item > v if reverse else item < v:
                #     ret.insert(i, item)
                #     break
                if reverse:
                    if item > v:
                        ret.insert(i, item)
                        break
                else:
                    if item < v:
                        ret.insert(i, item)
                        break
            else:
                ret.append(item)
    
        return ret
    
    
    print(vale)
    print(sort(vale, True))
    print(sort(vale, 0))

    抽离函数

    def sort(iterable, reverse=False):
        ret = []
    
        def comp(v, item, reverse):
            return item > v if reverse else item < v
    
        for item in iterable:
            for i, v in enumerate(ret):
                if comp(v, item, reverse):
                    ret.insert(i, item)
                    break
            else:
                ret.append(item)
    
        return ret
    import random
    
    vale = list(range(10))
    random.shuffle(vale)
    
    
    def comp(a, b):
        return a < b
    
    
    def sort(iterable, key=lambda a, b: a < b, reverse=False):
        ret = []
    
        for item in iterable:
            for i, v in enumerate(ret):
                flag = key(v, item) if reverse else key(item, v)
                if flag:
                    ret.insert(i, item)
                    break
            else:
                ret.append(item)
    
        return ret
    
    
    print(vale)
    print(sort(vale, key=comp, reverse=True))
    print(sort(vale, key=comp, reverse=False))
    print(sort(vale))