Python 在问答频道中刷题积累到的小技巧(一)

x33g5p2x  于2022-05-28 转载在 Python  
字(2.8k)|赞(0)|评价(0)|浏览(271)

  1. 输入一个1到5之间的整数,输错则报错直到输入正确为止。 
Error = '输入错误,请重新输入!'
while True:
    try:
        n = int(input('请输入一个正整数n(1≤n≤5):'))
    except:
        print(Error)
        continue
    if 1<=n<=5:
        break
    else:
        print(Error)
  1. 输出的居中居右,使用f-string比较方便,:^居中,:>居右,:<居左。 
Error = '输入错误,请重新输入!'
while True:
    try:
        n = int(input('请输入一个正整数n(0退出):'))
    except:
        print(Error)
        continue
    if 1<=n<=9:
        for i in range(1,n+1):
            print(f'{(str(i)*(i*2-1)):^{n*2-1}}')
    elif n==0:
        exit(0)
    else:
        print(Error)

''' 输出结果:

实例:输出数字的等腰三角形
n=7
      1      
     222     
    33333    
   4444444   
  555555555  
 66666666666 
7777777777777
'''

  1. 多位的长整数,可以用下划线任意分开,数值不变便于观察。
>>> 10_000_000 == 10000000
True
>>> 1234_5678_9000 == 123456789000
True
  1. 非递归的斐波那契数列函数,可以输出第n项或前n项。
def fib(n, t = False):
    # n:int, n>0; fib->int or list
    if n<3: return [1]*n if t else (n+1)//2
    n1 = n2 = 1
    if t: res = [1,1]
    for i in range(2,n):
        n3 = n1 + n2
        n1,n2 = n2,n3
        if t: res.append(n3)
    if t: return res
    return n3

for i in range(1,11):
    print(i,':',fib(i))
    print(fib(i,True))

''' 输出结果:
1 : 1
[1]
2 : 1
[1, 1]
3 : 2
[1, 1, 2]
4 : 3
[1, 1, 2, 3]
5 : 5
[1, 1, 2, 3, 5]
6 : 8
[1, 1, 2, 3, 5, 8]
7 : 13
[1, 1, 2, 3, 5, 8, 13]
8 : 21
[1, 1, 2, 3, 5, 8, 13, 21]
9 : 34
[1, 1, 2, 3, 5, 8, 13, 21, 34]
10 : 55
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

''' 

  1. 矩阵乘法的通用函数, (规律:m行s列 乘 s行n列 得 m行n列)。
def matrixMultiple(A, B):
    res = [[0]*len(B[0]) for _ in range(len(A))]
    for i in range(len(A)):
        for j in range(len(B[0])):
            for k in range(len(A[0])):
                res[i][j] += A[i][k] * B[k][j]
    return res

'''输出效果:

matrixA = [[1,2],[3,4]]
matrixB = [[5,6],[7,8]]
print(matrixMultiple(matrixA, matrixB))

matrixA = [[1,2,3],[3,2,2],[2,1,2]]
matrixB = [[2,2],[3,1],[2,1]]
print(matrixMultiple(matrixA, matrixB))

matrixA = [[1,2,3],[4,5,6]]
matrixB = [[7,8,9,0],[-1,-2,-3,-4],[5,6,7,8]]
print(matrixMultiple(matrixA, matrixB))

[[19, 22], [43, 50]]
[[14, 7], [16, 10], [11, 7]]
[[20, 22, 24, 16], [53, 58, 63, 28]]

''' 

  1. 一行代码输出100以内所有素数(或称:质数)。
print(*filter(lambda n:0 if n<2 else not any(map(lambda i:not n%i,range(2,n))), range(100)))

输出结果:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

7.随机数列排序,要求正数降序负数升序,且正数在前负数在后。

import random
 
n = 10
 
random.seed(n)
lst = [random.randint(-100,100) for _ in range(10)]
print(lst)
# lst = random.choices(range(-100,101), k=10) # 也可但相同种子也与randint()输出随机数不同
lst = sorted(lst, key=lambda x:x if x>=0 else 1/x, reverse=True) # 把负数取倒数实现反序
print(lst)
 
# 或者升序,但x 1/x取负值一样也降序
random.seed(n)
lst = [random.randint(-100,100) for _ in range(10)]
lst = sorted(lst, key=lambda x:-x if x>=0 else -1/x)
print(lst)

# 或分两段分别排序
random.seed(10)
lst = [random.randint(-100,100) for _ in range(10)]
lst = list(sorted(filter(lambda x:x>=0,lst),reverse=True))+list(sorted(filter(lambda x:x<0,lst)))
print(lst)

输出结果:

[46, -92, 9, 23, 47, -97, -48, 18, 25, -29]
[47, 46, 25, 23, 18, 9, -97, -92, -48, -29]
[47, 46, 25, 23, 18, 9, -97, -92, -48, -29]
[47, 46, 25, 23, 18, 9, -97, -92, -48, -29]

附录:

矩阵乘法定义

设A为mp的矩阵,B为pn的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作 C = AB,其中矩阵C中的第i行第j列元素可以表示为:

注意事项

1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

基本性质

乘法结合律: (AB)C=A(BC). 
乘法左分配律:(A+B)C=AC+BC 
乘法右分配律:C(A+B)=CA+CB 
对数乘的结合性:k(AB)=(kA)B=A(kB).
转置 (AB).T=B.T * A.T  【.T表示矩阵转置】

矩阵乘法除以下两种情况外不满足交换律:
AA*=A*A,A和伴随矩阵相乘满足交换律。
AE=EA,A和单位矩阵或数量矩阵满足交换律。

矩阵乘法也不满足消去律,即:
AB = AC 时,不一定能推出: B = C

相关文章