美文网首页
Python可以这么玩

Python可以这么玩

作者: 浪尖儿 | 来源:发表于2016-08-17 17:14 被阅读0次

    使用Python若干年,虽然没有研究过源码,但也总结了不少实用技巧,在这里分享给大家。玩蛇是个愉快的过程。

    Python可以这么玩

                    /^\/^\
    
                  _|__|  O|
    
         \/     /~     \_/ \
    
          \____|__________/  \
    
                 \_______      \
    
                         `\     \                 \
    
                           |     |                  \
    
                          /      /                    \
    
                         /     /                       \\
    
                       /      /                         \ \
    
                      /     /                            \  \
    
                    /     /             _----_            \   \
    
                   /     /           _-~      ~-_         |   |
    
                  (      (        _-~    _--_    ~-_     _/   |
    
                   \      ~-____-~    _-~    ~-_    ~-_-~    /
    
                     ~-_           _-~          ~-_       _-~   
    
                        ~--______-~                ~-___-~
    

    1. 调用外部程序

    os.startfile(filename)
    

    系统会使用默认的程序打开filename指定的文件

    2.去掉csv写文件时多余的空行

    You need to open the file in binary b mode to take care of blank lines in Python 2. This isn't required in Python 3.
    So, change open('test.csv', 'w') to open('test.csv', 'wb')

    3.使用正则表达式:用多种分隔符分割字符串

    import re
    DATA = "Hey, you - what are you doing here!?"
    print re.findall(r"[\w']+", DATA)
    # Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']
    

    4.字符串转datetime

    方法a:

    >>> import datetime,time
    >>> stringDate = "2006-05-18 19:35:00"
    >>> dt = datetime.datetime.fromtimestamp(time.mktime(time.strptime(stringDate,"%Y-%m-%d %H:%M:%S")))
    >>> print dt
    2006-05-18 19:35:00
    >>> print type(dt)
    <type 'datetime.datetime'>
    >>>
    #该代码片段来自于: http://www.sharejs.com/codes/python/835
    

    方法b:
    也可以直接调用datetime.strptime()

    datetime.strptime(sj, "%Y-%m-%d %H:%M:%S")
    

    5.安装pip

    执行get-pip.py就可以!
    点击这里下载

    python get-pip.py
    

    6.测试程序的性能

    执行

    python -m cProfile xxx.py
    

    或者

    import cProfile
    cProfile.run('foo()')
    

    7.列表解析(List Comprehension)

    List Comprehension是在Python2.0版本中加进入的,是一种更高效、简洁的for结构替代品,作为新手写上几个后就对它爱不释手,惊呼太好用了。
    例子:将原始列表中的所有元素进行某种操作后赋值给新的列表。
    如果用for循环,代码如下:

    oldlist = []
    for item in oldlist:
        newlist.append(func(item))
    

    如果使用List Comprehension,代码如下:

    newlist = [func(item) for item in oldlist]  
    

    我们明显看到差别,3行变一行,代码可读性增强,而且性能也提升很多,据说基本可以达到C语言的速度。
    List Comprehension还支持过滤功能,在列表生成过程中套用for if字句,非常好用。示例如下:

    evens = [even for even in range(10) if even % 2 == 0]
    

    只需要一行,就将得到0到9的数字中的所有偶数,过滤掉了奇数。

    8.生成器表达式(Generator Expression)

    Python2.4中引入了Generator Expression。它功能上类似于List Comprehension,这你就要问了,为什么要加入这个呢。因为Generator Expression更加高效,避免了生成整个列表,改善性能及内存占用,取而代之的是返回一个generator object,通过它迭代的返回列表中的每一个值。

    而且Generator Expression的使用方法也很简单,就是将List Comprehension中的中括号[]改成小括号(),示例如下:

    newlist = (func(item) for item in oldlist)
    

    这个返回的newlist其实并不是一个list,而是前面提到的generator object,可以理解为列表的一个迭代器,类似于C++中的iter。 可以通过newlist.next()迭代获得列表中的每一项。
    List Comprehension和Generator Expression实在是Python中的亮点,简洁高效,一定要经常用、时时用、秒秒用。

    9.字符串拼接

    使用’’.join进行字符串拼接,而不是a += b这种形式。因为join将保证这个过程的时间复杂度为线性的,效率更高。道理很多人都知道,但是大多数人还是喜欢用“+”,因为这个实在太简洁了。其实很多语言都提供了拼接字符串的方法或者相应的类,良好编程习惯从拼接字符串开始。

    10.None判断

    判断一个实例变量是否为空的时候,应该总是用’is’或者’is not’,而不要使用相等操作符。

    11.对象类型判断

    对象类型的比较应该始终用isinstance()代替直接比较类型。例如:
    使用

    if isinstance(obj, int):
    

    而不是

    if type(obj) is type(1):
    

    12.字符串前后缀判断

    在检查前缀或后缀时避免对字符串进行切片。用startswith()和endswith()代替,因为它们是明确的并且错误更少。例如:

    使用

    if foo.startswith('bar'): 
    

    替代

    if foo[:3] == 'bar':
    

    13.变量值交换

    在其他语言中,我们经常这样交换两个变量的值。

    t=a; a=b; b=t;
    

    但是在Python中,我们还有一个简单的办法:

    a, b = b, a
    

    并且这种方法更快,更酷。

    14.异常类型

    基于类的异常总是好过基于字符串的异常。我们最好构造一个基于Exception的子类。
    当抛出一个异常的时候,使用”raise ValueError(‘message’)”替代”raise ValueError, ’message’”的形式。

    15.如何判断一个字符串只包含数字字符

    Q:如何判断一个字符串只包含数字字符
    A:一种方法是 a.isdigit()。但这种方法对于包含正负号的数字字符串无效,因此更为准确的为:

    try:
        x = int(aPossibleInt)
        … do something with x …
    except ValueError:
        … do something else …
    

    这样更准确一些,适用性也更广。但如果你已经确信没有正负号,使用字符串的isdigit()方法则更为方便。

    还可以用正则表达式:

    re.match(r’[+-]?\d+$’, ‘-1234′)
    

    在数字很大时,可能比用int类型转换速度更快。

    16.判断一个数值是否是NaN

    math.isnan()
    

    17.数值列表转字符串

    比如:a=[1,2.3,4]
    不能直接' '.join(a),因为a里面不是字符串
    要把a的每项都转成字符串,然后在join

    18.快速去除字符串中的空格

    "".join(s.split())
    

    19.各进制之间的转换

    #十进制转换二进制
    >>> bin(10)
    '0b1010'
    #十进制转换十六进制
    >>> hex(10)
    '0xa'
    #二进制转换十进制
    >>> int('1010',2)
    10
    #十六进制转换十进制
    >>> int('0xa',16)
    10
    #十六进制转换二进制
    >>> bin(0xa)
    '0b1010'
    #二进制转换十六进制
    >>> hex(0b1010)
    '0xa'
    

    20.查看模块的地址

    import a_module
    print a_module.__file__
    

    上述代码将范围 .pyc 文件被加载的路径,如果需要跨平台解决方案,可用下面代码:

    import os
    path = os.path.dirname(amodule.__file__)
    

    21.判断ajax请求

    I am using exactly this base on the 'is_ajax' method in Django:

    def is_ajax(self):
        return "X-Requested-With" in self.request.headers and \
            self.request.headers['X-Requested-With'] == "XMLHttpRequest"
    

    22.执行shell命令

    • os.system(cmd) 不过取不了返回值

    • os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如

         a=os.popen(cmd).read()
      
    • 用 commands 模块。其实也是对popen的封装。此模块主要有如下方法:

        commands.getstatusoutput(cmd) 返回(status, output).
        commands.getoutput(cmd) 只返回输出结果
        commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法.
      

    23.有序字典

    http://www.python.org/dev/peps/pep-0372/

    24.读写同一个文件

    If you don't want to close and reopen the file, to avoid race conditions, you could truncate it:

    f = open(filename, 'r+')
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()
    f.close()
    

    25.下载文件到本地

    f = urllib2.urlopen(url)
    with open("code2.zip", "wb") as code:
        code.write(f.read())
    

    26.写入utf-8编码的文件

    import codecs
    f = codecs.open("pru_uni.txt", "w", "utf-8")
    txt = unicode("campeón\n", "utf-8")
    f.write(txt)
    f.write(u'中文\n’)f.close()
    

    27.获取文件大小

    使用os.path.getsize()函数

    相关文章

      网友评论

          本文标题:Python可以这么玩

          本文链接:https://www.haomeiwen.com/subject/zkwmsttx.html