Python细节笔记

前言:

这里是记录一些本人在开发过程中遇到的一些细节问题,与君共勉。


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.遍历文件夹下所有子文件夹和文件

import os
import os.path
rootdir = '/root/coding/python/raw'

for parent, dirnames, filenames in os.walk(rootdir):
    for dirname in  dirnames:
        # print 'parent: ' + parent
        print  'dirname: ' + dirname
        
    for filename in filenames:
        # print 'parent: ' + parent
        # print 'filename: ' + filename
        print 'file: ' + os.path.join(parent, filename)

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.Python带序号遍历

  有时我们遍历一个可迭代的参数时,需要知道此时已经遍历到第几个了。为了不用麻烦地在for循环外面另外定义变量,这里你可以使用enumerate这样来做:

  Python细节笔记_第1张图片


7.UnicodeDecodeError

  今天我在解析HTML文件的时候,出现了如下的错误:

  UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 1: ordinal not in range(128)

  Python细节笔记_第2张图片

  解决方法:

  只要在代码中添加如下代码即可:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

 

8.error: command 'gcc' failed with exit status 1

  在为Python安装MySQLdb模块时,出现以上的错误信息。解决方法如下:

  # yum install python-devel mysql-devel zlib-devel openssl-devel

你可能感兴趣的:(python,细节笔记)