import sys
def zhihe(n):
result = 0
for a in range(1,n):
for k in range(1,a):
if(a == k*(k+1)):
result += a
break
print(result)
b = sys.argv[1]
b1 = int(b)
zhihe(b1)
~
分类:python
以字符串长度来归类
import sys
def changdu(a):
b1 = []
b2 = []
b3 = []
for k in a:
k1 = len(k)
if(k1 <= 3):
b1.append(k)
elif(k1 <= 10):
b2.append(k)
elif(k1 > 10):
b3.append(k)
print('字符串长度小于或等于3的有',','.join(b1))
print('字符串长度小于或等于10的有',','.join(b2))
print('字符串长度大于10的有',','.join(b3))
# print('字符串长度小于或等于3的有',b1,'字符串长度小于或等于10的有',b2,'字符串长度大于10的有',b3)
a = sys.argv[1:]
changdu(a)
~
求一个数字是否是一个平方数
# coding=utf-8
import sys
def pingfang(n):
result = False
for k in range(0, n + 1):
if(n == k**2):
result =True
break
if(result):
print('这是一个平方数')
else:
print('这不是一个平方数')
#取命令行第1号参数。注意,第0号参数就是被执行的文件名。命令行执行示例 python zhishu.py 100,则这里a = '100'
a = sys.argv[1]
#这是做强制类型转化,因为a是字符串类型,而后面的函数只接受自然数为参数。'100' -> 100
a1 = int(a)
#执行函数
zhishuqiuhe(a1)
~ ~
写一个函数求N以内能被3整除的数之和
import sys
def zhihe(a):
result = 0
for k in range(1,a + 1):
if(k % 3 == 0):
result += k
print(result)
w = sys.argv[1]
w1 = int(w)
zhihe(w1)
~
已知长宽和中心点,求四个角坐标和转换机代码,用仿真CNC把长方形面积挖出来
def createPocket(width,length,toolDiameter,center):
resultPoints = []
while(min(width, length) > toolDiameter):
width = width - toolDiameter/2
length = length - toolDiameter/2
currentPoints = biankuan(length, width, center)
resultPoints = resultPoints + currentPoints
p = [i for i in resultPoints[0]]
p[2] = p[2]+20
p = [p]
i = [i for i in resultPoints[-1]]
i[2] = i[2]+20
i = [i]
gCode0 = moveTool2(0, p)
gCode1 = moveTool2(1, resultPoints)
gCode2 = moveTool2(0, i)
gcode = gCode0 + '\n' + gCode1 + '\n' + gCode2
return gcode
def getGcode(method,k):
x = 'X'
y = 'Y'
z = 'Z'
g00 = 'G00 '
g01 = 'G01 '
if(method == 0):
result = g00
elif(method == 1):
result = g01
if(k[0] != None):
result += x + str(k[0]) + ' '
if(k[1] != None):
result += y + str(k[1]) + ' '
if(k[2] != None):
result += z + str(k[2]) + ' '
return result
def moveTool2(method,polygon):
if(method != 0 and method != 1):
print('cuowu de canshu')
# raise()
return
c = []
result = ''
for k in polygon:
#根据坐标得到G代码
#tp = g00 + ' ' + x + str(k[0]) + ' ' + y + str(k[1]) + ' ' + z + str(k[2])
tp = getGcode(method,k)
c.append(tp)
#result += tp + '\n'
#print(c)
return '\n'.join(c)
#return result
# points = [[35, 35 , 25], [35,150,25], [150,150,25],[150,35,25],[35,35,25],[35,35,50]]
# method = 0 输出G00, method = 1输出G01
#points0 = [[0,150,35]]
#points1 = [[0.0, 150.0, 25], [0.0, 0.0, 25], [150.0, 0.0, 25], [150.0, 150.0, 25], [0.0, 150.0, 25]]
#points2 = [[0,0,50],[100,100,60]]
def biankuan(i,w,c):
a1 = [c[0] - i/2 ,c[1] + w/2 ,c[2]]
a2 = [c[0] - i/2 ,c[1] - w/2 ,c[2]]
a3 = [c[0] + i/2 ,c[1] - w/2 ,c[2]]
a4 = [c[0] + i/2 ,c[1] + w/2 ,c[2]]
b = [a1,a2,a3,a4,a1]
return b
#points1 = biankuan(140,140,[70,70,15])
#p = [i for i in resultPoints[0]]
#p[2] = p[2]+20
#p = [p]
#i = [i for i in resultPoints[-1]]
#i[2] = i[2]+20
#i = [i]
#print(p,i)
def min(x, y):
if(x < y):
return x
else:
return y
##width = 140
#length = 140
#toolDiameter = 5
#center = [75, 70, 15]
#resultPoints = []
#while(min(width, length) > toolDiameter):
# width = width - toolDiameter/2
# length = length - toolDiameter/2
# currentPoints = biankuan(length, width, center)
# resultPoints = resultPoints + currentPoints
#print(w, l)
#gCode0 = moveTool2(0, p)
#gCode1 = moveTool2(1, resultPoints)
#gCode2 = moveTool2(0, i)
#print(gCode0)
#print(gCode1)
#print(gCode2)
def createPocket(width,length,toolDiameter,center):
resultPoints = []
while(min(width, length) > toolDiameter):
width = width - toolDiameter/2
length = length - toolDiameter/2
currentPoints = biankuan(length, width, center)
resultPoints = resultPoints + currentPoints
p = [i for i in resultPoints[0]]
p[2] = p[2]+20
p = [p]
i = [i for i in resultPoints[-1]]
i[2] = i[2]+20
i = [i]
gCode0 = moveTool2(0, p)
gCode1 = moveTool2(1, resultPoints)
gCode2 = moveTool2(0, i)
gcode = gCode0 + '\n' + gCode1 + '\n' + gCode2
return gcode
gcode = createPocket(140, 140, 10, [70, 70, 15])
print(gcode)
def createpocket(width,length,toolDiameter,center):
resultPoints = []
while(min(width, length) > toolDiameter):
width = width - toolDiameter/2
length = length - toolDiameter/2
currentPoints = biankuan(length, width, center)
resultPoints = resultPoints + currentPoints
p = [i for i in resultPoints[0]]
p[2] = p[2]+20
p = [p]
i = [i for i in resultPoints[-1]]
i[2] = i[2]+20
i = [i]
gCode0 = moveTool2(0, p)
gCode1 = moveTool2(1, resultPoints)
gCode2 = moveTool2(0, i)
bkzb = gCode0 + '\n' + gCode1 + '\n' + gCode2
return bkzb
gcode = createPocket(140, 140, 10, [70, 70, 15])
print(gcode)
判断一个数字是否是质数
import sys
def zhishu(a):
if(a == 1):
print('这即不是质数也不是合数')
else:
r = False
for i in range(2,a):
if(a % i == 0):
r = True
break
if(r == True):
print('这不是质数')
else:
print('这是质数')
b = sys.argv[1]
b1= int(b)
zhishu(b1)
写一个函数求出已知队列数值最大值
a = [1.2,26,-3,-1,684,'sfggh',"896",412,'asdf']
k = 'x'
for v in a:
#if(isinstance(v,int) or isinstance(v,float)):
try:
v1 = float(v)
if(k == 'x'):
k = v1
else:
if(v1 > k):
k = v1
except Exception as err:
print('错误信息:',err)
if(k == 'x'):
print('找不到最大值')
else:
print('最大值为',k)
#找最大值
~ ~
python中的列表的函数笔记
append
append的功能是给队列的末尾添加数据
a = [1,2,3]
a.append(4) -> a = [1,2,3,4]
copy
copy是对队列做一级深度复制
python经典的文件操作
下面一段代码,从下载,解压再到装载数据一气呵成,动作毫不拖泥带水。非常漂亮的一段代码
from pathlib import Path
import requests
DATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"
PATH.mkdir(parents=True, exist_ok=True)
URL = "https://github.com/pytorch/tutorials/raw/master/_static/"
FILENAME = "mnist.pkl.gz"
if not (PATH / FILENAME).exists():
content = requests.get(URL + FILENAME).content
(PATH / FILENAME).open("wb").write(content)
import pickle
import gzip
with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")
这段代码的亮点是对pathlib库的Path模块的应用。如果使用python自带的open函数获取文件实例,然后再做read和write操作,那代码估计就要冗长得多了。
计算分类值的精确度
我们直接看下面一段代码:
def accuracy(out, yb):
preds = torch.argmax(out, dim=1)
return (preds == yb).float().mean()
这是一个计算分类数据精确度的函数,这段代码简直是神一样的代码,让人惊叹到下巴都掉到火星上去了!实现这么复杂的任务,居然能够如此优雅!
假设函数的参数out = [[a00, a01, a02], [a10, a11, a12]],其中0维度中每一项的数据对应这一个实体在第1维度的3个可能的权值。第1维度中,我们判定那个值最大,则认可该值对应的项目为所选项目。yb = [b0, b1]表示期望值。例如,a00, a01, a02中,如果a02最大,那么我们认为这一项对应的值为2, 如果b0也等于2,那么我们就说out的第一项判断是准确的。否则,则为错误。我们把准确的记为1, 错误的记为0, 然后统计这些1和0的平均值,并认为这个平均值为out中的准确度。如果是我来解决这个问题,我的代码可能就是这个样子了:
def accuracy(out, yb):
preds = torch.argmax(out, dim=1)
total = 0
def f(i):
if(preds[i] == yb[i]):
total += 1
for i in range(preds.shape[0]):
if(preds[i] == yb[i]):
total += 1
return total / preds.shape[0]
我感觉自己永远需要铭记一点,任何时候我打算用for来遍历一个数组时,我都应该想想有没有可能直接使用数组运算来代替!数组思维!数组思维!目前的我在数据处理的问题上,太缺乏数组思维了!
相比而言,最上面那段代码太完美了!
使用(preds == yb)运算,得到一个bool型的数组,(preds==yb).float()将数组转化为float类型,然后(preds==yb).float().mean()对所有数据求平均值!完美!完美!完美!这段代码中对数组的操作应用得太成熟了!
那么,我应该怎么样思考,才能写出那么优雅的代码呢?以下是我的一些想法:
前面我也提到"我们把准确的记为1, 错误的记为0, 然后统计这些1和0的平均值,并认为这个平均值为out中的准确度。",那么在这里,我就应该想办法要去构建一个描述可能正确与否的一个数组。这要这么想,如果我又熟悉数组级别的条件判断应用,我也应该能写出preds == yb来!
总结起来,我与别人差距至少有以下2个点:
- 缺乏构建数组的思维
- 对数组的条件判断运算操作缺乏认知