这里总结一些平时写python遇到的一些美妙的代码
1. 关于矩阵边界判断
1 for p in range(max(i-1,0),min(i+2,m)): 2 for q in range(max(j-1,0),min(j+2,n)):
2. 关于变量赋值
res.append(path),后面修改path是在原地址上修改,起不到保存结果的作用,所以用path[:]切片操作,相当于创建了一个新的对象进行保存
学习链接是: https://my.oschina.net/leejun2005/blog/145911 这个博客解释得相当清楚
3. 关于变量swap和同时赋值
1 a,b = b,a 2 a,b = a-1,b+1
4.结构体排序
sorted(intervals, key=lambda i: i.start) list.sort(intervals, key=lambda i: i.start)
或者写成显式函数
1 intervals.sort(key=self.getKey) 2 def getKey(self, interval): 3 return interval.start
5. 关于list规则
1 return [n for n in (candidate1, candidate2) if nums.count(n) > len(nums) // 3]
6. 列表翻转
1 list.sort() 2 sorted(list) 3 list[::-1]
7. 去重(保持顺序)
1 l = [0,0,1,4,5,6,0,3,1,4,3,5,0,4,2] 2 a = [x for i, x in enumerate(l) if i == l.index(x)] 3 [0, 1, 4, 5, 6, 3, 2]
由于l.index(x) 代码是O(n^2) 例子取自知乎
github上别人总结的一些python中奇怪的问题,只是问题,没什么技巧
30个关于Python的小技巧 ❤❤ 【必看】 技巧总结的挺好的,都很通用
9. break 多层循环 使用for...else语句,如果for正常运行完了就会执行else语句,若for中有break,就不会执行else语句
1 for i in range(10): 2 for j in range(10): 3 if i+j == 50: 4 break 5 else: 6 continue #executed if the loop ended normally(no break) 7 break #executed if 'continue' was skipped (break)
10 Hidden features of python stackoverflow上总结的python的一些有用小性质 中文整理
1 1<x<5 is faster than 1<x and x<5
1 a = ['a','b'] 2 for index,item in enumerate(a): 3 print(index,item) 4 enumerate(list,start=1) #index will start from 1
生成器对象不需要存储中间结果可以节省开销,列表推倒式是把整个结果保存在内存中,但是列表推倒式比生成式更快
1 x=(n for n in foo if bar(n)) #foo是可迭代对象 2 >>> type(x) 3 <type 'generator'> 4 5 for n in x: 6 print(n) 7 8 x = [n for n in foo if bar(n)] 9 >>> type(x) 10 <type 'list'>
注意可变的默认参数
1 >>> def foo(x=[]): 2 ... x.append(1) 3 ... print x 4 ... 5 >>> foo() 6 [1] 7 >>> foo() 8 [1, 1] 9 >>> foo() 10 [1, 1, 1] 11 12 >>> def foo(x=None): 13 ... if x is None: 14 ... x = [] 15 ... x.append(1) 16 ... print x 17 >>> foo() 18 [1] 19 >>> foo() 20 [1]
1 x = 3 if y==1 else 2
11. import pdb
直接在想要设置断点的地方
1 import pdb 2 pdb.set_trace()
然后直接运行代码,就在设置断点停住了,dir(tensor_list)可以查看变量的各种性质和方法,直接输tensor_list就是打印它的值
注意:pdb环境里不能多行代码,比如不能with tf.Session() as sess, 转换成单行的sess=tf.Session()
1 (pdb) dir(tensor_list) 2 (pdb) tensor_list 3 (pdb) n(next) #运行当前行代码,并准备下一行 4 (pdb) p(print) #打印 5 (pdb) s(step) #进入函数内部 6 (pdb) b 18(break) #在18行处设置断点 7 (pdb) l(list) #列表告诉当前所在代码位置 8 (pdb) q(quit) #退出结束
9 (pdb) c(continue) #继续执行程序
10(pdb) r(return) #执行代码到当前函数返回
12. dict.get用法
dict.get(key,default) 如果key存在返回相应的value,如果key不存在就返回default value
这一个函数就抵上了 if key in dict: return dict[key] else: return default
1 accu_sum[s] = accu_sum.get(s,0)+1
用来累计特别方便,如果key不存在就是0+1 存在就加一
13. Fixed width number formatting / 0000-9999
14. matplotlib.pyplot作图
1 import matplotlib.pyplot as plt 2 import numpy as np 3 import time 4 5 channel_size = 512 6 plt.figure(figsize=(6,6),dpi=100) #default dpi=100 7 plt.axis('off') 8 edge = np.ceil(np.sqrt(channel_size)) 9 for i in range(1,channel_size+1): 10 plt.subplot(edge,edge,i) #i>=1 11 plt.imshow(np.random.random((5,5)),plt.cm.gray) 12 plt.axis('off') #关闭图像的坐标轴 13 plt.savefig('sample.jpg')
耗时太长,上述代码耗时20多秒
15. python遍历文件夹下所有文件
1 import os 2 file_path = os.listdir('/Users/steven/PycharmProjects/AI/RPN') 3 4 import glob as gb 5 img_path = gb.glob("/Users/steven/PycharmProjects/AI/RPN/*.jpg")
16. python opencv version3.3用来将图片连接成视频
1 # encoding: UTF-8 2 import glob as gb 3 import cv2 4 5 img_path = gb.glob("F:\filter0\*.jpg") 6 videoWriter = cv2.VideoWriter('filter0.avi',cv2.VideoWriter_fourcc(*'XVID'),25,(600,600)) 7 8 for path in img_path: 9 img = cv2.imread(path) 10 img = cv2.resize(img,(600,600)) 11 videoWriter.write(img)
17. 数值运算中%的优先级 > +/-
18. python中tuple的创建数组远远大于list的创建,如果不需要改变其中的元素,建议使用tuple
19. python中
1 res.append(i) 等价于 2 res += i, 一定要有逗号 3 4 if res==[]: 5 return [None] 6 else: 7 return res 8 9 等价于 10 return res or [None]
20. python遍历二维数组
1 A = [[i+j for i in range(5)] for j in range(5)] 2 斜对角线遍历,从中心对角线向右上方遍历 3 for k in range(5): 4 for i in range(n-k): 5 j = i + k 6 print(A[i][j]) 7 七字分别相乘遍历 8 1 2 3 4 9 5 10 6 11 7 返回 1*5+2*6+3*7 (A[i][j]==4) 12 res = 0 13 for m in range(n): 14 res += A[n-len+i][m]*A[i+m][j]
21. list规则时使用if else
1 res = [1 if i<2 else 0 for i in range(n+1) ]
22. 对python的版本管理,经常就是环境python是2.7,同时要使用3.6,那么使用anaconda来管理环境特别方便
1 conda create -n py36 python=3.6 2 conda remove -n py36 --all 3 source activate py36 4 source deactivate
23. string.format()
格式化字符串,用大括号{}围住的“代替域”,在大括号外的文本内容直接复制到输出的字符串里 类似于%,不同之处在于在此使用{}和:两个符号代替。
1 ‘%03.2f’ 等价于 '{:03.2f}' 2 T = '#'.join('^{}$'.format(s))
24. 对于python的元组排序,默认是按照第一维元素,要想按照第二维第三维:
1 print sorted(myList, key=lambda x:x[1])
25. 判断是否为整数, 取上整数,最大值inf:
1 a = 16 ** 0.5 2 a.is_integer() 3 True
1 a = 2.567 2 int(a)+1 3 import math 4 math.ceil(a)
float('inf')
sys.maxint python2
sys.maxsize python3
26. 在python3中 a += b, 比 a.append(b)要快 在python2中则相反
27. python在不同层级目录import 模块方法
python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
a. 主程序与模块程序在统一目录下
1 import mod1 2 from mod1 import *
b. 主程序所在目录是模块所在目录的父或者祖辈目录, 模块是在同级的文件夹里面,这个文件夹里须要建立空文件__init__.py
from mod2.mod2 import * import mod2.mod2
c. 主程序导入上层目录中模块或其他目录(平级)下的模块:
python test2.py 中
import sys sys.path.append("..") import mod1 import mod2.mod2
python 执行一个文件,无论执行的方式是绝对路径还是相对路径,解释器都会把文件所在的目录加入到系统查找路径中,也就是 sys.path
这个 list
中,而 sys.path
又是由系统的 python 环境变量决定的。
python 包的导入顺序是
系统包 --> 同目录 -- > sys.path
想要导入同级文件夹或者子文件夹下文件时,用.的方法太过繁琐
import sys sys.path.append("libs") sys.path.append("libs/blogModules")
或者在运行前的环境下export PYTHONPATH=$(pwd)/lib:
28. sort与sorted区别
sorted是内建函数, b = sorted(a) 就是产生新的列表,对原列表不会有改变
a.sort() 就是 in place的排序,直接改变a
28. 对于找到列表中最大的数的index对应的另外的列表的数之和
longest = max(length) return sum(c for i, c in enumerate(num) if length[i] == longest)
29. 判断两个数中是否有一个可以被除尽
1 target, rem = divmod(sum(nums), k) 2 if rem: return False
30. 判断两个字符数是否相等
忽略大小写:
c++ (x+32-'a')%32 == (y+32-'a')%32 python x.lower() == y.lower()
chr(97) = 'a' ord('a') = 97