美文网首页
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