Python代码优化及技巧笔记(一)
前言
这里是记录一些本人在开发过程中遇到的一些细节问题。与君共勉。
版权说明
著作权归作者全部。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Coding-Naga
链接:http://blog.csdn.net/lemon_tree12138/article/details/50736887
来源:CSDN
1.Python实现全排列
方案一:
- a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
- result = list(itertools.permutations(a, 9))
方案二:
上面是使用python的内建函数itertools.permutations对于仅仅有9个元素的全排列速度上是惊人的。
假设是我们自己来写全排列逻辑,能够是以下这种:
- # get full permutation list
- def full_permutation(l):
- if(len(l) <= 1):
- return [l]
- r = []
- for i in range(len(l)):
- s = l[:i] + l[i + 1:] # 将l的前三项以及l的第i+1后的字串赋给s
- p = full_permutation(s)
- for x in p:
- r.append(l[i : i + 1] + x)
- return r
全部在项目中还是建议使用Python内建的全排列函数,当中的第二个參数能够是1-9之间的不论什么一个整数,非常方便。
2.遍历文件夹下全部子文件夹和文件
在Python中能够非常方便地对文件文件夹进行循环遍历。检查文件及文件夹,代码例如以下:
- import os
- import os.path
- def cycle_visiting(root_dir=None):
- for parent, folder_names, file_names in os.walk(root_dir):
- for folder_name in folder_names:
- print 'folder: ' + folder_name
- for file_name in file_names:
- print 'file: ' + os.path.join(parent, file_name)
3.针对字符串的进制转化
假设你有其它语言的编程功底,可能你已对进制转化十分熟悉。只是我这里要说的进制转化可不是简单从十进制转化为二进制或是转成十六进制。以下你能够试着来解决以下几个问题:
a.将a = 'ff'的十六进制数转成十进制的255
b.将a = 14的十进制数转成十六进制的0e
解决方法:
a.这里须要用一个參数指明原来的进制数
decstr = int(a, 16)
b.这里须要用一个切片操作用来去掉前缀'0x'
decstr = hex(a)[2:]
if len(decstr) % 2 == 1:
decstr = '0' + decstr
4.IP的点分型和整形数字之间的转化
首先须要import两个模块:socket和struct
1.将ip1 = '172.123.156.241'转化为ip2 = 2893782257L
ip2 = socket.ntohl(struct.unpack("I",socket.inet_aton(ip1))[0])
2.将ip2 = 2893782257L转化为ip1 = '172.123.156.241'
ip1 = socket.inet_ntoa(struct.pack('I',socket.htonl(ip2)))
5.Python获得Linux控制台中的输出信息
能够通过两种方式来解决问题,分别例如以下:
方法一:
- import subprocess
- import os
- output = os.popen('cat /proc/cpuinfo | grep model')
- print output.read()
方法二:
- status, model = commands.getstatusoutput(shell)
- print model
6.使用enumerate()函数获取序列迭代的索引和值
有时我们在对序列进行迭代的时候,不单单是仅仅要知道序列中的值,还想要知道这个值在序列的什么位置。
假设要使用代码实现。的确不难。只是会显得多余,由于Python已经为我们做了这些工作。例如以下:
- def test_enumerate():
- array = [1, 2, 3, 4, 5, 6]
- for index, data in enumerate(array):
- print("%d: %d" % (index, data))
- e = enumerate(array)
- print(e.next())
- print(e.next())
- print(e.next())
7.i+=1与++i有差别
我们知道Python中是不支持自增操作的。所以,你是不是就会以为这里的++i会抛出一个语法错误呢?
非常可惜,这里并不会抛出语法错误。
对于i++的确是有这种问题,只是对于++i则不会。比如在PyCharm编辑器中,我们能够看到例如以下现象:
在上面的图示中。我们能够看到PyCharm对a++抛出了一个错误提示,对于++a则是一个警告。
原因是在Python里。++a会被看成是+(+a),也就是说,“+”被理解成了一个正符号。
所以,++a的结果还是a。同理,--a的结果也是a.
8.使用DeprecationWarning定义过时方法
Python中也有相似Java中一样的注解方法。这里我们就以过时注解为例,代码例如以下:
- @DeprecationWarning
- def test_dep(name):
- print("Hi, %s." % name)
与Java不同的是,在Python中使用过时注解。程序被抛出异常而终止执行。例如以下:
9.使用Counter进行计数统计
怎样实现对一个列表进行计数统计呢?
遍历、打表、集合,还有呢?然而。这些操作对于Python而言却并不那么优雅。
以下就是一段比較优雅的操作方式,使用了Python自带的Counter实现。
代码例如以下:
- from collections import Counter
- def get_counter(data):
- print(data)
- print(Counter(data))
- if __name__ == '__main__':
- get_counter(['d', 'a', 'd', 'a', 's', 'e', 'f', 'h', 'w', 'e', 'q', 'd', 'e', 'w', 'f', 's', 'd', 'a'])
程序执行的结果例如以下所看到的:
10.准确推断文件类型
假设准确推断一个文件的类型呢?这里所说的类型比如:png、jpg、doc、csv等等。
不要说从文件的后缀中获得。
假设真的是这样,这个问题就没有不论什么意义了。并且。我们知道在日常的开发中,我们遇到的文件常常是没有后缀的。这个时候可还怎么用后缀去推断呢?
但是,万变不离其宗。同一种类型的文件的文件头都是一样的,不同类型的文件的头部是不同的。
通过这一点,就能够推断出不同的文件类型了。代码也非常好写,例如以下:
- import struct
- # 支持文件类型
- # 用16进制字符串的目的是能够知道文件头是多少字节
- # 各种文件头的长度不一样。少则2字符,长则8字符
- def type_list_table():
- return {
- "FFD8FF": "JPEG",
- "89504E47": "PNG",
- "47494638": "GIF",
- "49492A00": "TIFF",
- "424D": "BMP",
- "41433130": "CAD",
- "38425053": "Adobe Photoshop",
- "7B5C727466": "Rich Text Format(rtf)",
- "3C3F786D6C": "XML",
- "68746D6C3E": "HTML",
- "D0CF11E0": "MS Word/Excel (xls.or.doc)",
- "5374616E64617264204A": "MS Access (mdb)",
- "4357530A": "Flash data [swf]"
- }
- # ----------------------------------------- #
- # 字节码转16进制字符串 #
- # ----------------------------------------- #
- def bytes2hex(byte_array):
- num = len(byte_array)
- hex_string = u""
- for i in range(num):
- t = u"%x" % byte_array[i]
- if len(t) % 2:
- hex_string += u"0"
- hex_string += t
- return hex_string.upper()
- # ----------------------------------------- #
- # 获取文件类型 #
- # ----------------------------------------- #
- def file_type(file_name):
- file_reader = open(file_name, 'rb') # 必须二制制读取
- type_list = type_list_table()
- type_label = 'unknown'
- for value in type_list.keys():
- num_of_bytes = len(value) / 2 # 须要读多少字节
- file_reader.seek(0) # 每次读取都要回到文件头,不然会一直往后读取
- hbytes = struct.unpack_from("B" * num_of_bytes, file_reader.read(num_of_bytes)) # 一个“B”表示一个字节
- type_code = bytes2hex(hbytes)
- if type_code == value:
- type_label = type_list[value]
- break
- file_reader.close()
- return type_label
- if __name__ == '__main__':
- print file_type('xxx/xxx.jpg')
Ref:
- 《编写高质量代码:改善Python程序的91个建议》
- 编程中遇到
Python代码优化及技巧笔记(一)的更多相关文章
- python基础===Python 代码优化常见技巧
Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 8 ...
- Python 代码优化常见技巧
代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方 ...
- 【转】python代码优化常见技巧
https://blog.csdn.net/egefcxzo3ha1x4/article/details/97844631
- Python代码优化概要
Python即是面向过程语言,也是面向对象语言,很多其它情况下充当脚本语言的角色.虽是脚本语言,但相同涉及到代码优化的问题,代码优化可以让程序执行更快,它是在不改变程序执行结果的情况下使程序执行效率更 ...
- 理解 python metaclass使用技巧与应用场景分析
理解python metaclass使用技巧与应用场景分析 参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...
- Requests:Python HTTP Module学习笔记(一)(转)
Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...
- 关于Python网络爬虫实战笔记③
Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...
- <转> 30 个有关 Python 的小技巧
目录[+] 1.1 拆箱 1.2 拆箱变量交换 1.3 扩展拆箱(只兼容python3) 1.4 负数索引 1.5 切割列表 1.6 负数索引切割列表 1.7指定步长切割列表 1.8 负数步长切割列表 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
随机推荐
- Http1.1和http2.0
HTTP2.0 最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1 ...
- CSS动态实现文本框清除按钮的隐藏与显示
当前现代浏览器中,Chrome浏览器下type=search的输入框会有清除按钮的动态呈现,不过搜索input框尺寸不太好控制(padding无视):FireFox浏览器貌似任何类型的输入框都无动于衷 ...
- vue组件中 IS 用法
//html <link rel="stylesheet" href="http://www.jq22.com/demo/animate-141106223642/ ...
- C_数组详解
数组: 一 一维数组 1.1 一维数组的定义: 类型符 数组名[常量表达式]; int a[10]; 说明: 1.数组的命名规则遵循标识符命名规则. 2.定义时需要指定元素的个数.方括号里的常量表达式 ...
- 查看JSP和Servlet版本+
如何查看JSP和Servlet版本 找到jsp-api.jar和servlet-api.jar ,分别打开META-INF下的MAINMEFT.MF文件,查看对应的版本. 例: JSP版本: Mani ...
- 阅读笔记—EL表达式
表达式语言(EL) 表达式语言是一种在JSP页面中使用的数据访问语言,通过它可以很方便地在JSP页面中访问应用程序数据. 使用EL访问数据 表达式语言的使用形式: ${exp ...
- JavaScript学习总结(11)——JS常用函数(二)
37. getElementsByClassName ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function getElementsByClassName( ...
- Ternary Tree
前一篇文章介绍了Trie树.它实现简单但空间效率低.假设要支持26个英文字母,每一个节点就要保存26个指针,因为节点数组中保存的空指针占用了太多内存.让我来看看Ternary Tree. When y ...
- CSS布局篇——固宽、变宽、固宽+变宽
学了前端挺久了.近期写一个项目測试系统,布局时发现自己对变宽+固宽的布局还没有全然掌握,所以在这里总结一下,以后须要的时候回头看看. 1.最简单的当然是一列或多列固宽 比如两列固宽: <1> ...
- 控制面板项 .cpl 文件说明
控制面板项 .cpl 文件说明 appwiz.cpl 程序和功能.卸载或更改程序 bthprops.cpl 蓝牙控制面板 desk.cpl ...