1.python代码库,有很多开源的代码

https://pypi.python.org/pypi?%3Aaction=search&term=win32all&submit=search

如果出现错误:error: Unable to find vcvarsall.bat

则: SET VS90COMNTOOLS=%VS100COMNTOOLS%

 

2.shell启动python脚本

#!/bin/bash

python recv.py

如果要以后台形式运行,使用nohup python3 run.py >/dev/null 2>&1 

 

3.print占位符

print ('hello %s age %d' %(self.__name, self.__age))
        print ('hello age %d ' %(self.__age))

 

4. 开发工具

安装的时候选择 注册环境变量,这样在控制台命令窗口才能运行.py文件

  最好用的IDE,还是VS, 我使用的是VS2010,所以下载了PTVS 2.1 VS 2010插件,需要安装.net  framework 4.5

  可以像VS那样设置断点,调试,查看变量和堆栈   

使用Eclipse插件时,创建的工程,当前目录是以工程目录.pydevproject,.project开始的

mac下安装VSCode默认使用的是python3,如果要使用python2.7则在setting中添加python2.7的路径: python.pythonPath

验证方法

import platform

print(platform.python_version())

或者

设置Python解释器:

1〉在VS Code界面的左下角点击齿轮图标-〉Command Palette(或者在界面中直接按CTL+shift+P),

2〉输入Python:Select Interpreter,回车,

3〉点选你所装的那个Python

 

 

5. input() 和raw_input()

input 会假设用户输入的是合法的表达式(如果要输入字符串,我们得加上引号);而 raw_input 会假设输入的都是原始数据(字符串);

6. 字符串多行显示 首位添加 ''' 

 

7.多行字符串一行显示 ,使用\连接

 

8. 原始字符串

原始字符串不会把反斜杆当作特殊字符使用

path = r"C:\xiaoyu"
print path

取子串

test = text[0 : -1] 会少一位字符,取当前索引之后的整个子串

test = text[index : len(text)]

9. 解决中文错误

SyntaxError: Non-ASCII character '\xd6' in file ChineseTest.py

在文件的第一行加上#coding=gbk

 

10.判断是否是类的属性

(1)class student:

    name = ''    
#判断
if  True == hasattr(s, 'age'):  
    print "has age" 

(2)使用dir方法

objlist = dir(k)
if 'att' in objlist:
    #do some thing you need
    print k.att
else:
    #error: has not attribute
    pass

11. 编码解码

encode和decode都是针对unicode进行“编码”和“解码”,所以encode是unicode->str的过程,decode是str->unicode的过程

 

12列表

list列表的append和extend的区别

mylist = []
 youlist = []
 test = []
 list1 = ['xiaoxiaoyu']
 list2 = ['xiaoyu']
 list3 = ['xiaoyan']

 mylist.extend(list1)
 mylist.extend(list2)
 mylist.extend(list3)
 print mylist
 ##相当于向一维数组mylist中添加了元素,改变数组的大小
 ##['xiaoyu', 'xiaoyan', 'youlist']

 if mylist[0] == 'xiaoxiaoyu':
    del mylist[0]
 print mylist
 print len(mylist) 


 youlist.append(list1)
 youlist.append(list2)
 youlist.append(list3)
 print youlist
 #youlist本来是一个列表,append使得其每个元素也是个列表,youlist维度加1
 #[['youlist'], ['xiaoyu'], ['xiaoyan']]
 print len(youlist)

 #每个元素都是列表
 if youlist[0] == ['xiaoxiaoyu']:
     del youlist[0]
 print youlist 
在函数中清空list使用list[:]
def EmailToDevOnly(to_list):
     BeDevOnly = False
     #BeDevOnly = True    
     if True == BeDevOnly:
         to_list[:]=[]
         to_list.append("123")

13. 字典

默认字典是无序的

使用sorted对字典的key进行排序(返回的是key的有序列表,原字典顺序不变)

排序listKey = sorted(dictDayNum.keys(), reverse=True) 

判断一个值是否是键

if mykey in mydict.keys():
     value = mydict['china']
     print value
 else:
     print "not in keys"数值与字符串进行转换
 balance = float(rowinfo[1]) - float(rowinfo[2])
 rowinfo[5] = str(balance)

14. class类

1.私有成员,构造函数,成员函数

class CTest:
     def __init__(self, name, age, addr): #构造函数,python只能有一个构造函数,如果可以使用默认参数实现类多态
         self.__name = name;
         self.__age = age;
         self.addr = addr;
         print ('hello %s age %d' %(self.__name, self.__age))       
        
     def __del__(self):     #析构函数
         print 'bye.....'    def __GetName(self):   #任何一个成员函数,第一个参数都是self
         return self.__name;    def PrintAttr(self):
         name = self.__GetName()
         print ('hello name %s age %d' %(name, self.__age))    __name = 'fish'; #变量名之前加 __ 表示该变量是私有的
     __age = 20; #私有的
     addr = "shanghai" def Test():
     test = CTest("fish fish", 20, "pu dong ");
     #name = test.__GetName(); #报错,私有成员函数不能访问
     test.__age = 100;         #这地方,是python的一个缺陷,私有成员在类外还是可以修改
     test.PrintAttr();
     print(test.__age)
     return 0;

 

15.数据库操作

conn = self.__get_master_connection(db_name)
 cursor = conn.cursor()cursor.execute(sql, params)

遇到问题: TypeError: %d format: a number is required, not str
解决办法: 传给sql的变量写对格式就行了. sql里不需要对对应的变量写%d,只写%s就可以了(所有的都写%s)

压缩zip包

zipFileName = "./sdkfile/" + str(userid) + "apisdk_php.zip" #tmpFileName有文件夹名的话,压缩包中也有文件夹路径,不过想改变文件夹深度的话,可以建立临时文件的方式压缩
f = zipfile.ZipFile(zipFileName, 'w' ,zipfile.ZIP_DEFLATED)    
f.write(tmpFileName, "apisdk.php") # "apisdk.php" 压缩包中的新文件
f.close()

 

16.时间操作

整型时间和字符串时间互相转换

import time
 import datetimedef GetTimeByStr(strSrcTime):
 dictSrcTime = time.strptime(strSrcTime, "%Y-%m-%d %H:%M:%S")
 iTaskTime = time.mktime(dictSrcTime)
 return iTaskTime

 def GetTimeStrByGivenValue(iSrcTime):
 dictSrcTime = time.localtime(iSrcTime)
 strTaskTime = time.strftime("%Y-%m-%d %H:%M:%S", dictSrcTime)
 return strTaskTime

获取毫秒时间字符串

 

def get_time_stamp():
    ct = time.time()
    local_time = time.localtime(ct)
    data_head = time.strftime("%Y-%m-%d %H:%M:%S", local_time)
    data_secs = (ct - int(ct)) * 1000
    time_stamp = "%s.%03d" % (data_head, data_secs)
    print(time_stamp)

 

#获取一天的0份0时0秒时间戳
 def GetDayBeginTimeStamp(iSrcTime):
     day = datetime.datetime.fromtimestamp(iSrcTime)
     dtDayBegin = datetime.datetime(day.year, day.month, day.day, 0, 0, 0)
     iBeginTStamp = int(time.mktime(dtDayBegin.timetuple()))
     return iBeginTStamp

17.对象的深拷贝和浅拷贝


a=b 只是增加一个引用,id(a)和id(b)是指向同一块内存地址,函数的返回值也是一样,比如

def Test():
     name = 1
     print id(name)
     return nameif __name__ == '__main__':  
my = Test()
     print id(my) #2个地址是一样的,python使用引用计数来管理内存的释放copy.copy()只是浅拷贝,子对象还是指向同一块内存地址
copy.deepcopy()实现深拷贝

 

判断操作系统类型

 

import platform
 
def BeWindowsSystem():
return 'Windows' in platform.system()
 
def BeLinuxSystem():
return 'Linux' in platform.system()

判断进程是否存在

def CheckProcessExist(strProcessName):   
     if True == BeLinuxSystem():
         resLines = os.popen('ps -ef | grep python').readlines() 
         for line in resLines:
             if strProcessName in line:
                 return True
     return False

python发送邮件

# -*- encoding: utf-8 -*-
 import os
 import sys
 import smtplib
 from email.mime.text import MIMEText
 def send_mail(to_list, sub, content):
     mail_host = "mail.xxx.com.cn"
     mail_user = "apigateman"
     mail_pass = "xxx"
     mail_postfix = "xxx.com.cn"
     me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
     msg = MIMEText(content)
     msg['Subject'] = sub
     msg['From'] = me
     msg['To'] = ";".join(to_list)
     try:
         s = smtplib.SMTP()
         s.connect(mail_host)
         s.login(mail_user,mail_pass)
         s.sendmail(me, to_list, msg.as_string())
         s.close()
         print 'success'
         #WDLOG.Info([('topic', 'send_mail'), ('from', me), ('mailTo', msg['To']), ('subject', sub)])
         return True
     except Exception, msg:
         #WDLOG.Error([('topic', 'send_mail'), ('exception', str(msg))])
         print 'fail.....'
         #return False
         
 if __name__ == '__main__':
     to_list = []
     to_list.append('xxxx@xxx.cn')
     sub = 'topic'
     content = '1236'
     send_mail(to_list, sub, content)

18. map的使用

对可迭代函数'iterable'中的每一个元素应用‘function’方法,将结果作为list返回。

def add(x):
     return 100 + x


 if __name__ == '__main__':
     hh = [1, 2, 3]
     print map(add, hh)19.Basic Authorization
    dictHeader = {}    
     username = 'fish'
     password = '111' 
     base64string = base64.encodestring('%s:%s' % (username, password))[:-1] #注意哦,这里最后会自动添加一个\n
     authheader = "Basic %s" % base64string
     dictHeader["Authorization"] = authheader

19.assert

age = None #空字符串,0,None,空的list, 字典,tuple都会抛assert

assert age, \

            "validators and/or schema required"

 

性能

1.判断某个元素是否在字典里

第一段:

if(pos in fre_dist.keys()):
newvalue= fre_dist[pos]

第二段:

if(pos in fre_dist):
newValue=fre_dist[pos]

在处理3万条数据时,第二段代码的速度是第一段代码速度的上千倍。

原因是:第一段代码 fre_dist.keys()变成了list,python在检索list的时候是比较慢的,第二段代码 fre_dist是字典,python在检索字典的时候速度是比较快的

python中list对象的存储结构采用的是线性表,因此其查询复杂度为O(n),而dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1)

 

python虚拟目录(virtualenv)

切换到虚拟目录 source  myenv/bin/activate