美文网首页
2021-03-10钱学长之50题

2021-03-10钱学长之50题

作者: Cipolee | 来源:发表于2021-03-10 23:18 被阅读0次

    pycharm在有代码处可以加断点
    点击debug 甲虫标志后即可运行,左侧可以选择文件
    NO.14 去重+排序

    a=[1,4,3,21,3,4,15]
    t=list(set(a)).sort()
    t
    

    NO.15

    一个易错点:在对一个数仅查找一次时,加上bool索引且一旦匹配就应该break,防止接着匹配

    布尔型变量的匹配
    if bool_var
    if not bool_var

    def is_str_equal(str1,str2):
        if len(str1)!=len(str2):
            return False
        length_str2=len(str2)
        bool_str2=[True]*length_str2
        for i in str1:
            flag=False
            for j in range(length_str2):
                if(bool_str2[j]):
                    if str2[j]==i:
                        bool_str2[j]=False
                        
                        flag=True
                        #print(flag)
                        print(i)
                        break
            print(flag)            
            if not flag:
                print("run there")
                return False
        return True
    
    • ==是对值判断,is是对id进行判断
      NO.16 随机矩阵以及转置

    矩阵再理解,维度是向量里的参数个数

    python里都是行向量的概念,一般的shape[0]未矩阵的行的个数

    numpy中的random

    import numpy as np
    import random
    np里的random.rand(x,y)
    np里的random.randint(a,b,(x,y))
    具体示例

    import numpy as np
    print(np.random.rand(4,5))
    print(np.random.randint(2,4,(3,4)))
    

    输出如下

    [[0.24339799 0.44274717 0.50422167 0.47575132 0.40122367]
    [0.86733814 0.99626793 0.95559074 0.27959164 0.69695999]
    [0.43087412 0.29731663 0.92051722 0.79591298 0.71303126]
    [0.60939638 0.56888583 0.82017134 0.01018477 0.79773632]]
    [[2 2 3 3]
    [3 3 2 2]
    [2 3 3 2]]

    NO.17 二维数据的行排序

    排序+lamda表达式

    score_table=[['张飞',78,75],['李大刀',92,67],['李默白',50,50],['雷军',99,98]]
    def print_sort(score_table):
        sorted_score=sorted(score_table,key=lambda x:x[1]+x[2],reverse=True)
        for i in range(len(sorted_score)):
            print('姓名',sorted_score[i][0],' 总分',sorted_score[i][1]+sorted_score[i][2])
    print_sort(score_table)
    

    绝对路径不加'./' 直接'C:'
    lambda表达式key=x,是对总的列表中的元素而言的
    如x=list则key=实对x[i]而言的,故key=lambda x:x[1]+x[2]是对元素的第一个维度和第二个维度的和进行排序的
    NO.18 生成幻方
    幻方的数学规律是:
    (贪吃蛇规律,左出右进,上出下进)

    1. 第一个1在第一列中间
    2. 下一个在第一个的相邻左上位置
    3. 若左上位置有数,则选择该数字的正下相邻位置

    1 :设置行和列变量,使用从1到n**2的循环
    2:左加可以直接除余,而上减则要判断是否达到“-1”
    3:设置两个变量,pre_保存之前的值,先初始化一个-1矩阵,用来判断有没有被更新,若已被更新则使用之前的值来进行下一步操作

    矩阵输出不好看 可以拆分生行向量依次输出

    def print_magic_matrix(n):
        col=0
        line=n//2
        x=[[-1 for i in range(n)]for j in range(n)]
        #x[pre_col][pre_line]=1
        i=1
        while(i<=n**2):
            x[col][line]=i
            pre_col=col
            pre_line=line
            col=pre_col-1
            line=(pre_line+1)%n
            if col==-1:
                col=n-1
            if(x[col][line]!=-1):
                col=(pre_col+1)%n
                line=pre_line
    
            i+=1
        for i in range(len(x)):
            print(x[i])
    

    NO.19 二次函数求解,公式法求解

    在一个括号内可以换行,绝对值函数是系统函数,不需要包调用

    def seek_value(t):
        if t[0]==0:
            print("无效参数a")
            return;
        is_R=t[1]**2-4*t[2]*t[0]
        print(is_R)
        change_part=math.sqrt(abs(is_R))
        if(is_R>=0):
            print('根1{:10.5f}\n根2{:10.5f}'.format((-t[1]+change_part)/(2*t[0]),
    (-t[1]-change_part)/(2*t[0])))
        else:
            print('根1{:10.5f}+{:9.5f}i'.format(-t[1]/(2*t[0]),change_part/(2*t[0])))
            print('根1{:10.5f}-{:9.5f}i'.format(-t[1]/(2*t[0]),change_part/(2*t[0])))
          
    t=[]
    for i in range(3):
        funVar=float(input("请输入参数"))
        t.append(funVar)
    

    NO.20 三角形的面积和周长

    遇到的精度损失问题如何解决

    海伦公式,p为半周长
    def square_areaAndperimeter(t):
        l1=math.sqrt((t[1][1]-t[0][1])**2+(t[1][0]-t[0][0])**2)
        l2=math.sqrt((t[1][1]-t[2][1])**2+(t[1][0]-t[2][0])**2)
        l3=math.sqrt((t[2][1]-t[0][1])**2+(t[2][0]-t[0][0])**2)
        if l1+l2<=l3 or l1+l3<=l2 or l2+l3<=l1:
            print("ERROR,不能构成三角形")
            return
        perimeter_tri=l1+l2+l3
        half_p=perimeter_tri/2
        square_area=math.sqrt(half_p*(half_p-l1)*(half_p-l2)*(half_p-l3))
        return perimeter_tri,square_area
        peri_tri,area_tri=square_areaAndperimeter(t)
    

    疑问,精度损失如何解决

    NO.21 某点是否在确定的圆内

    for i in range(3):
        if i==1:
            radius=float(input("please input radius"))
        else:
            t.append([float(i) for i in input("请输入点坐标,例如3,2").split(',')])
    def is_inCircle(t,radius):
        point_distance=math.sqrt((t[1][0]-t[0][0])**2+(t[1][1]-t[0][1])**2)
        if point_distance<= radius:
            return True
        else:
            return False
    is_inCircle(t,radius)
    

    输出

    t
    radius=0
    [[1.0, 1.0], [0.0, 0.0]]
    False

    NO 22数字的问题,数字长度用str的len处理比较好
    逆转字符串用切片比较好

    digit_str=input("请输入一个不超过五位数的数字")
    print("数字位数是{}".format(len(digit_str)))
    for i in digit_str:
        print(i)
    print(digit_str[::-1])
    

    NO.23

    #没有选择嵌套,只好选择了sort函数
    for i in range(3):
        t.append(float(input("please input the number")))
    t.sort()
    

    NO.24分支结构

    def caculate_money(start_money):
        w=10000
        if start_money<10*w:
            print(start_money*1.015)
        elif start_money<50*w:
            print(start_money*1.02)
        elif start_money<100*w:
            print(start_money*1.03)
        else:
            print(start_money*1.035)
    

    NO.25

    正则表达式是两个字符串之间的匹配,不需要compile出正则对象

    可以使用r'[a-zA-Z]'表示所有字母

    import re
    def transAndJudge(i):
        if re.match(r'[a-zA-z]',i):
            print("true")
        else:
            print("false")
            return
        if i.isupper():
            i=i.lower()
            print(i)
        else:
            i=i.upper()
            print(i)
    i='1'
    transAndJudge(i)
     
    

    NO.26 打点图题

    解决该类规律简单 题 重要的是在草纸上画出图形,找规律

    同时可以利用字符串的乘法原理

    def print_equal_tri(i):
        n=2*i-1
        mid=n//2
        for j in range(i):
            print(" "*(mid-j),"*"*(2*j+1))
    print_equal_tri(7)
    

    输出

           *
          ***
         *****
        *******
       *********
      ***********
     *************
    

    NO.27乘法表打印,要点,print 中end='\t'可实现自动对齐,而print()实现换行

    def multi_table(i):
        n=len(str(i))
        print('',end="\t")
        for j in range(1,i+1):
            print(j,end='\t')
        print()
        for j in range(1,i+1):
            print(j,end='\t')
            for k in range(1,j+1):
                print(j*k,end='\t')
            print()
    multi_table(9)
    
    输出

    “%10d”%i也可以实现对齐

    对于长度不固定的输出方式print(“%*s”%(len,A))

    其中*表示len指定长度
    NO.28 六边形的输出 仿照三角形的做题规则,一般在纸上画图比较好

    从状态a==k开始随着a的增大,结果result减小,a+=1

    则结果result+=k-a

    def print_six_edge(i):
        for j in range(1,2*i):
            if j<=i:
                print(" "*(i-j),"* "*(i+j-1))
            else:
                print(" "*(j-i),"* "*(3*i-1-j))
    print_six_edge(5)
    
    

    输出,该行和相邻行对应的是空格

         * * * * * 
        * * * * * * 
       * * * * * * * 
      * * * * * * * * 
     * * * * * * * * * 
      * * * * * * * * 
       * * * * * * * 
        * * * * * * 
         * * * * * 
    

    NO.29关于数字的瑕疵
    format在任何时候都可以使用,在input时也可以格式化输出
    不好的地方,使用match匹配,不如使用isdigit()
    重复该操作时应该想到递归

    def sub_sum_n(t):
        cnt=0
        for i in range(1,t+1):
            cnt+=int(input("please input number {}".format(i)))
        print("sum = {}".format(cnt))
            
    def sum_n():
        this_str=input("请输入n=数字,样例输入:n=10")
        regex=re.compile(r'n=(.+)')
        t=regex.findall(this_str)[0]
        flag=True
        for i in t:
            if not re.match(r'[0-9]',i):
               
                flag=False
        if flag:
            t=eval(t)
            if isinstance(t,int):
                if t==0:
                    print("退出程序")
                    #return
                else:
                    sub_sum_n(t)
                    sum_n()
            else:
                print("不是整数,请重新输入")
                sum_n()
        if not flag:
            print("不是数字,请重新输入")
            sum_n()
                
    

    NO.30 素数

    
    def is_prime(list_prime_index,list_prime,ma):
        for j in range(2,ma+1):
            if list_prime_index[j]:
                list_prime.append(j)
                for k in range(2,ma//j+1):
                    list_prime_index[j*k]=False
                    
                
    def print_prime(list_prime):
        n=len(list_prime)
        for i in range(n):
            if i!=n-1:
                print(list_prime[i],end=',')
            else:
                print(list_prime[i],end='')
        list_prime.clear()
                
    prime_len=int(input("please input the maximum number"))
    list_prime_index=[True]*(prime_len+5)
    list_prime=[]
    is_prime(list_prime_index,list_prime,prime_len)
    print_prime(list_prime)
    #输出 2,3,5,7,11,13,17,19
    

    NO.31循环求值

    a=input("请输入a的值")
    n=int(input("请输入n的值"))
    ans,cnt=0,""
    for i in range(n):
        cnt+=a
        print(cnt)
        ans+=int(cnt)
    print(ans)
    
    

    输出

    请输入a的值2
    请输入n的值6
    2
    22
    222
    2222
    22222
    222222
    246912

    pta非零返回,最好不用序列解包

    使用map进行统一的格式映射,不用列表推导式

    n, m = map(int, input().split())

    pta 1008,字符串.join(列表)

    n, m = map(int, input().split())
    s =input().split(' ')
    
    for i in range(m):
        s.insert(0, s[-1])  ##insert()指定位置插入元素
        s.pop()  ##pop()指定位置弹出元素,默认弹出最后一个元素(index=-1)
    
    print(" ".join(s))
    
    

    No.32

    矩阵的输入与相加,先使用一维的向量相加,再使用切片切成矩阵

    def my_input():
        n=int(input("please input the number of row"))
        m=int(input("please input the number of columns"))
        list1,list2,list3=[],[],[]
        t1=0
        while(t1<n):
            for j in range(m):
                list1.append(int(input("please input A[{},{}]".format(t1,j))))
            t1+=1
        t2=0
        while t2<n:
            for j in range(m):
                list2.append(int(input("please input B[{},{}]".format(t2,j))))
            t2+=1
        t3=0
        while(t3<n*m):
            list3.append(list1[t3]+list2[t3])
            t3+=1
        return [list3[i:i+m] for i in range(0,len(list3),m)]
    print(my_input())
    
    输出效果

    相关文章

      网友评论

          本文标题:2021-03-10钱学长之50题

          本文链接:https://www.haomeiwen.com/subject/xqhgqltx.html