zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LeetCode:387字符串中唯一出现一一次的字符
    LeetCode-79. 单词搜索
    LeetCode-75. 颜色分类
    LeetCode-121. 买卖股票的最佳时机
    LeetCode-58. 最后一个单词的长度
    LeetCode-1103. 分糖果 II
    LeetCode:283. 移动零
    LeetCode:38. 外观数列
    LeetCode:70. 爬楼梯
    获取美拍视频的链接--JS分析
  • 原文地址:https://www.cnblogs.com/lainey/p/7985251.html
Copyright © 2011-2022 走看看