python奇淫技巧


这里总结一些平时写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)    例子取自知乎

8. What the fuck python   

  github上别人总结的一些python中奇怪的问题,只是问题,没什么技巧

   Python Tips 

   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]==412 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

原文地址:https://www.cnblogs.com/lainey/p/7985251.html