python数据类型:(按特征划分)

  • 数字类型:

  • ×××:布尔形、长整型L、标准×××

  • 非×××:双精度型、复数、decimal(不是内建类型)

  • 序列类型:

  • 字符串(str

  • 元组(tuple

  • 列表(list

  • 映像类型:

  • 字典(dict

  • 集合类型:

  • 可变集合(set

  • 不可变集合(frozenset

 

python数据类型(按可变性划分)

  • 可哈希的,不可变数据类型:

  • 数字类型

  • 不可变集合(frozenset

  • 字符串(str

  • 元组(tuple

  • 可变数据类型:

  • 字典(dict

  • 列表(list

  • 可变集合(set



python中引号的作用:

  1. ‘  ‘

  2. “  “

  3. '''  '''

单引号和双引号基本没区别,同样的作用;双引号可以内嵌单引号。三引号作为大段文字的注释。

 

python的编解码

  1. ASCII

  2. Unicode

  3. UTF-8



python模块

  1. import moduleName:导入一个模块

  2. from module import functionName:从一个模块中导入一个方法

  3. import moduleName asnewModuleName:把一个模块重新命名

 

python用户交互:

         使用内置函数:raw_input(),该函数接收一个字符串。

         input(),该函数接收一个数字类型




python流程控制:

  • if … else …

  • split

  • strip

  • len()

  • for variable in range(1, 10):

  • while True:

  • break

  • continue


python练习:登录测试账号。

    要求:输入用户名密码;认证成功后显示欢迎信息;输错三次后锁定



python的基本语法、数据类型、导入模块、流程控制。



python文件处理:

         读文件:代码展示

         f= file(‘filename.txt’, ‘r’)

         forline in f.readlines():

                   line= line.strip(‘\n’).split(‘:’)

                   printline

         文件处理模式:

                   r:以只读模式打开文件

                   w:以只写模式打开文件

                   a:以追加模式打开文件

                   r+b:以读写模式打开

                   w+b:以写读模式打开

                   a+b:以追加及读模式打开



python字符串处理:

         str.find(substring,[start [,end]]) #可指范围查找子串,返回索引值,否则返回-1

         str.rfind(substring,[start [,end]]) #反向查找

         str.index(substring,[start [,end]]) #find,只是找不到产生valueerror异常

         str.rindex(substring,[start [,end]]) #同上反向查找

         str.count(substring,[start [,end]]) #返回找到子串的个数

 

         str.lowercase()

         str.capitalize()首字母大写

         str.lower()转小写

         str.upper()转大写

         str.swapcase()大小写互换

         str.split(str,‘ ‘)stringlist,以空格分割

         str.join(list,’ ’)liststring以空格分割

 

         len(str)字符串长度

         cmp(“myfriend”, str) 字符串比较。第一个大返回1

         max(‘abcxyz’)寻找字符串中最大的字符

         min(‘abcxyz’)寻找字符串中最小的字符




python中的列表:

         list的方法:

         list.append(var)追加元素

         list.insert(index,var)

         list.pop(var)返回最后一个元素,并从list中删除

         list.remove(var)删除第一次出现的该元素

         list.count(var)该元素在列表中出现的个数

         list.index(var)该元素的位置,无则抛异常

         list.extend(list2)追加list2,到list上。合并

         list.sort()排序

         list.reverse()元素顺序反转

 

         list[1:]片段操作符,用于子list的提取

         [1,2]+[3,4][1,2,3,4]。同extend()

         [2]*4[2,2,2,2]

 

         dellist[1] 删除指定下标的元素

         dellist[1:3] 删除指定下表范围的元素

         list= list1 listlist1的别名,内存地址相同,对list操作就是对list1的操作

         list= list2[:] 生成list2的一个copy



python元组:

         tuple:常量数组

         tuple= (‘a’, ‘b’, ‘c’, ‘d’)

         可以用list[],:操作符提取元素,就是不能直接修改元素



little case:shopping。

初始化金钱数,商品种类、价格,选择购买商品,直到钱不够,退出时打印已购买的商品和剩余金额。



开发文件替换小程序:

使用方法:

./pythonFile.py‘source string’  ‘replace string’filename.txt

./pythonFile.py‘source string’  ‘replace string’filename.txt  --bak  filename.txt.bak



python字典DICT

         dict.get(key,0) dict[key]多了个没有则返回默认值,0[]没有则抛出异常

         dict.has_key(key)有该键返回True否则False

         dict.keys()返回字典键的列表

         dict.values()以列表的形式返回字典中的值,返回值的列表中可包含重复元素

         dict.items()将所有的字典项以列表方式返回,这些列表中的每一项都来自于(键,值)但是项在返回时并没有特殊的顺序

         dict.update(dict2)增加合并字典

         dict.popitem()得到一个pair,并从字典中删除它,已空则抛出异常

         dict.clear()清空字典,同del dict

         dict.copy()拷贝字典

         dictNaNp(dict1,dict2) 比较字典,(优先级为元素个数、键大小、键值大小

         dict1= dict2 dict2取个dict1的别名

         dict2= dict.copy() 克隆,另一个拷贝




python中列表与字典的比较:

         dict

  1. 查找和插入的速度极快,不会随着key的增加而速度变慢

  2. 需要占用大量的内存,内存浪费多。

  3. key不可变

  4. 默认无序

list

  1. 查找和插入的时间随着元素的增加而增加

  2. 占用空间小,内存浪费少。

  3. 通过下标查询

  4. 有序




python SET集合

         特点:无序;元素不重复

         功能:关系测试;去重

 

         set集合运算:

                   a= set([1, 2, 3, 4])

                   b= set([3, 4, 5, 6])

                   a& b 求交集a.intersection(b)

                   a| b 求并集 a.union(b)

                   a– b 求差集a.difference(b)

                   a^ b 求对称差集a.symmetric_difference(b)

a.issubset(b)  ab的子集

                   a.issuperset(b)  a是否包含b




查询员工信息:模糊查询员工信息,显示匹配的条数,匹配字符串高亮显示。



python中目录和python包的区别:就是包下包含一个__init__.py文件,而目录没有。

 

模块的常用方法:

__name__

__file__

__doc__

 

python中的不定参数:参数前面带一个或两个*

def fun(arg)

def fun(*args)

def fun(**args) 

dict = {‘k1’:1, ‘k2’:2}

fun(1,2,3,4,)

fun(**dict)=fun(k1=’1’, k2=’2’)

 

元组和集合只有一个星号,字典是两个星号




yield关键字:

yield的作用:在写多线程的时候,可以用它创建一个线程池。什么时候用,什么时候拿。它是一个生成器,不是一下就给他创建了。它还能保存函数的执行状态。

with关键字:

 

三元运算:

result = ‘human if 1>3 else ‘animal

result = animal

 

Lambda表达式:

a = lambda x, y: x+y

print a(4,10)

lambda的作用是:声明一个函数,接收参数,返回参数的运算结果。

lambda是一个匿名函数。



内置函数

help()

dir()

vars()

type()

import temp

reload(temp)

id()

更多:http://www.cnblogs.com/wupeiqi/articles/4276448.html

 

在使用from file import module的时候多次导入不会执行,只执行第一次导入,如果要想再次导入的话,使用reload(module)再次导入模块。

 

字符串的格式化占位符:

str = ‘i am {0}’

print s.format(‘alex’)

i am alex

 

 

函数的调用:

显示调用函数,直接写出该函数。

隐式调用函数,Function(arg)     apply(Function, (arg))

 

map()函数:遍历每一个序列里面的元素。序列里面的每一个元素当作参数传给第一个function参数。

map(function, sequce, [sequce, …..])

也可以使用lambda表达式:map(lambda arg:arg+10, li)  li = [11, 22, 33]

filter() 过滤

reduce() 累加

apply()

zip()

eval()

__import__()




都是对序列里面的函数进行操作,然后返回回来。

反射就是把你的导入工作当作字符串。

反射:用于开发大型程序,随时可以切换数据库的时候。设计模式里面的工厂模式需要用到这个。降低程序的耦合。

  • 通过字符串的形式导入模块:(代码)

temp = ‘mysqlhelper’

model = __import__(temp)

model.cont()

  • 并以字符串的形式执行函数:(代码)

temp = ‘mysqlhelper’

func = ‘count’

model = __import__(temp)

Funciton = getattr(model, func)




常用的模块:

  1. 随机数

random

random(m)

randint(m, n)

randrange(m, n)

  1. MD5加密

  2. hash = hashlib.md5()

  3. hash.update(‘admin’)

  4. hash.hexdigest()

  5. hash.digest()

  6. 序列化和json   序列化可以把一个对象和一个列表或字典,通过python特有的方式序列化一下,以二进制的方式加密一下。

import pickle

li = ['alex',11, 22, 'ok', 'sb']

printtype(pickle.dumps(li))

 

dumpsed =pickle.dumps(li)

print dumpsed

loadsed =pickle.loads(dumpsed)

print loadsed

printtype(loadsed)

pickle.dump(li,open('temp.pk' , 'w'))

printpickle.load(open('temp.pk', 'r'))

 

import json

j_str =json.dumps(data)

print j_str

withopen(‘file.json’, w’) as fp:

  json.dump(data, fp)

  1. RE 正则

六个函数:

compile   match   search  findall    group  groups

match:只能从你给的字符串的起始位置去匹配

search:在整个字符串,在整个内容里面去匹配

group:输出匹配的结果。

常用格式:

\d匹配数字

\w

\t

次数:    * + ? {m} {m,n}

  1. time模块

三种表示方法:

  • 时间戳   1970.1.1之后的秒数

  • 元组  包含了:年、日、星期等….time.struct_time

  • 格式化的字符串   2014-11-11 1111 print time.time()

time.mktime(time.localtime())

time.gmtime()   可加时间戳参数

time.localtime()  可加时间戳参数

time.strptime(‘2014-11-11’, ‘%Y-%m-%d’)

time.strftime(‘%Y-%m-%d’)  默认当前时间

time.strftime(‘%Y-%m-%d’, time.localtime())   默认当前时间

time.asctime()

time.asctime(time.localtime())

time.ctime(time.time())

 

  1. sys 模块

sys.argv  命令行参数list 第一个元素是程序本身路径

sys.exit(n)  退出程序, 正常退出时exit(0)

sys.version 获取python解释程序的版本信息

sys.maxint  最大的int

sys.maxunicode  最大的unicode

sys.path  返回模块的搜索路径,初始化时使用pythonpath

sys.platform   返回操作系统平台名称

sys.stdout.write(‘please:’)

val = sys.stdin.readline()[:-1]

print val

  1. OS 模块

os.getcwd()  获取当前工作目录,即当前python脚本工作的目录路径

os.chdir(“dirname”)  改变当前脚本工作目录;相当于shellcd

os.curdir   返回当前目录;(‘.’)

os.pardir    获取当前目录的父目录字符串名:(‘..’)

os.makedirs(‘dirname1/dirname2’)   可生成多曾递归目录

os.removedirs(‘dirname1’)   若目录为空,则删除,并递归到上一

os.mkdir(‘dirname’)   生成单级目录,相当于shellmkdir  dirname

os.rmdir(‘dirname’)  删除单级空目录,若目录不为空则无法删除,

os.listdir(‘dirname’)

os.remove()

os.rename(“oldname”, “newname”)

os.stat(‘path/filename’)

os.sep

os.linesep

os.pathsep

os.name

os.system(“bash command”)

os.environ

os.path.abspath(path)

os.path.split(path)

os.path.dirname(path)

os.path.basename(path)

os.path.exists(path)

os.path.isabs(path)

os.path.isfile(path)

os.path.isdir(path)

os.path.join(path1[,path2…..])

os.path.getatime(path)

os.path.getmtime(path)

 

  1. 装饰器(示例代码)

def foo():

  print ‘foo’

def foo():

  print ‘before dosth’

  print ‘foo’

  print ‘after’

def foo():

  print ‘foo’

def wrapper(func):

  print ‘before’

  func()

  print ‘after’

wrapper(foo)





  • 装饰器

  • 面向对象编程

  • 异常处理

  • 断言

First.     装饰器——也是一个函数,通过这个函数装饰另一个函数。

def outer(fun):

  def wrapper():

fun()

         return wrapper

       @outer

       def fun1():

         print ‘hello’

                   #后面还有无穷个函数。

                   func1()

         @outer相当于@outer=outer(func1)  func1没有括号就代表这个函数,func1()带有括号就代表执行了这个函数,结果不一样的。

         如果被调用的fun1函数带有参数,该参数放在defwrapper(arg)里面。带有参数的代码:

def outer(fun):

  def wrapper(arg):

fun(arg)

         return wrapper

       @outer

       def fun1():

         print ‘hello’, arg

                   #后面还有无穷个函数。

                   func1(‘alex’)

         如果func1有返回值的:

def outer(fun):

  def wrapper(arg):

result = fun(arg)

return result

         return wrapper

       @outer

       def fun1():

         print ‘hello’, arg

                     return ‘eric’

                   #后面还有无穷个函数。

                   request= func1(‘alex’)

                   printrequest



second. 面向对象:

类就是一个抽象

实例化一个类就是一个对象,对象里面有属性和方法。

类里面的__init__方法,就是一个对象的初始化。相当于java中的构造函数。

定义一个类:

class Person:

         name = ‘这是一个人

def __init__(self, name):

    self.name = name

                   pp= Person(‘alex’)

                   printpp.name

                   printPerson.name

                   self代表的就是一个实例化对象。就像上面的代码,self就代表的pp这个对象。

                   定义在类里面的属性,属于类的,不属于对象,直接可以使用使用类名.属性名调用,如:上段代码中的Person.name

                   属于类的字段称为静态字段。通过self调用的称为动态字段(比如说:在__init__中调用的字段)

                   类不能直接访问对象的属性,对象可以直接访问类的属性。

                   在一个类中定义静态方法的办法:直接在方法上面添加@staticmethod去掉方法中的self。因为self代表的是一个对象。

                   在类中定义的静态方法可以使用类来调用,也可以使用对象来调用。

                   对象的属性:在类中定义一个方法,在该方法上添加@property 就把该方法变成了对象的一个属性。访问的方式:对象名.属性名   pp.property   后面没有小括号。

                   这个静态方法什么时候用:

                   Python中的私有方法和私有字段:都是以双下划线__  开头的。

  • 私有方法

也是通过在内部定义一个公有的方法,该公有的方法调用该私有方法,在外部调用该公有的方法间接的访问该私有方法。

强制访问私有方法的办法是:对象调用这个类的私有方法。具体是:

对象名._类名__私有方法名()objName._class__privateFunctionName()

  • 私有字段

在类中定义了私有字段,外部是不能访问的,只能通过在内部定义函数访问这个私有字段,外部调用该函数间接的访问该私有字段。

访问私有字段代码:

@property

def Thailand(self):

                                       return self.__Thailand       __Thailand是之前定义的一个私有字段。

                                     objName.Thailand  调用该对象的这个方法来访问私有字段。

私有字段一般用在不让别人改,但是可以访问的情况下。

 

 

对象的属性的只读和可改写:它们使用的装饰器不一样。 代码:

(只读的)

@property  

defThailand(self):

  return self.__Thailand

(可改写的)  推荐使用私有字段的操作方式:

classClassName(object):

  def __init__(self, __Thailand)

@Thailand.setter    还得让这个类继承object

def Thailand(self, value):

    self.__Thailand = value  __Thailand这个私有字段改写成了value这个值了

 

 

                   析构函数:就是python解释器在销毁对象的时候,我们可以干点啥,就可以写在这个析构函数里面。就是这个__del__

                   __call__方法:就是创建对象的时候,调用类中的__call__方法,在对象中使用对象名加上()即可。

                            classFoo():

                           def __call__(self):

                                print ‘我就是__call__方法。

                            f1= Foo()

                            f1()  --à直接调用对象中的__call__方法。

                            Foo()()的效果就等于 f1=Foo() f1(),这两步

 

                   继承:

在创建子类的时候在子类名后面的括号里写上父类的名字,就继承了父类。

                            方法的重写(override):发生在类的继承中,子类重写父类的方法。

                            方法的重载(overload):发生在本类中,两个重名的函数,根据参数的不同,而重载

 

                            子类调用父类的构造函数(也就是父类的__init__函数):两种方法:

  • 显示调用:Father.__init__(self)

  • 隐式调用:super(son,self).__init__()  此种方法需要申明父类继承自object

继承自object的类称为新式类,未继承自object的类称为经典类。

 

多继承:如果在多继承中,多个父类含有同一函数的话,就从最左边的父类找到该函数并执行。

 

抽象类:代码如下:

         from abc import ABCMeta, abstractmethod

         class Bar:

                   __metaclass__ = ABCMeta

                   @abctractmethod

                   def fun(self): pass

         class Foo(Bar):

                   def __init__(self):

                           print‘__init__’

         Foo()

 

                   python中的接口:没明确讲解。




Third.  python中的异常处理:

使用的是

try:

         xxxxxxx

except Exception, e:

         xxxxxx

else:

         print ‘没有出错。

finally:

         print ‘这里的代码无论如何都会执行。

                   自定义的异常类:

                            class MyException(Exception):

                                     def__init(self, msg):

                                               self.error= msg

                                     def__str__(self, *args, **kwargs):

                                               returnself.error

                   主动触发异常:使用raise关键字

                            raiseMyException(‘自定义错误’)

                   为什么要主动触发异常:




Fourth.   断言

python中的断言:assert(1 == 1)

 




  • python操作mysql数据库

  • socket

 

  • python操作mysql数据库。

首先使用connect函数连接mysql,使用cursor获一个句柄,使用execute执行一条mysql语句,fetchall获得该数据库里面数据表的所有数据,然后关闭句柄和连接。

sql语句定义为一个字符串变量,把里面的值使用格式化字符串的形式传递一个%s,如:

sql = “insert into userinfo values(%s, %s)   这里面的占位符只能是%s.

params = (‘bababa’, ‘M’)

reCount = cur.execute(sql, params)

涉及到数据库增删改的时候需要调用commit()方法。

connect.commit()

         完整的代码:

         importMySQLdb

         connect =MySQLdb.connect(host=’localhost’, user=’root’, passwd=’root’, db=’dbname’)

         current =connect.cursor()

         sql = “insertinto tname(col1, col2, …) values(%s, %s, …)”

         params =(‘val1’, ‘val2’)

         reCount =cur.execute(sql, params)

         data =cur.fetchall()  获取所有数据

         conn.commit()   与事务相关

         conn.rollback() 与事务相关

         cur.close()

         connect.close()

         print reCount

         print data

                   获取mysqlid值的函数:lastrowid

 

  • python项目的三层架构思想

数据访问层, 业务逻辑层, 应用层。

  • socket编程:

使用:异步、多线程、socket    处理多个请求的服务端。

SocketServer:把  异步,多线程  做了处理。

socketserver和不用socketserver的区别:

  • 使用socketserver不会有阻塞,处理多个请求,可以多个客户端连接。

  • 不使用socketserver效果相反。

在之后的所有socket编程都使用socketserver库。

  •  

 

  •  








  • 线程

  • 进程

  • ftp服务器

  • paramiko

 

ftp服务器就是使用socketserver库建立一个ftp服务器数据的传输。

        

         线程:python中的多线程:

                   使用threading.Thread模块。常用的方法有:

                            start

getName()

setName()

isDaemon()

setDaemon()

join(timeout)主线程启动了子线程后,一直等到子线程执行结束,再执行主线程的其他东西。加了timeout后,就是主线程等到timeout时间后或者子线程执行结束,再执行主线程。

run()

                   使这个线程与某件事情建立关系,使用target传递参数。

                   t1= Thread(target=function, args=(1, ))  

                   target=function,这个是传递的某个方法,args=(1,))  args是传递该方法中的参数, 参数传递完毕后需要接一个逗号,  

                   代码示例:

                            defFoo(arg, v):

                                     foritem in range(100):
                                               printitem

                                               time.sleep(1)

                            print‘before’

                            t1= Thread(target=Foo, args=(‘ddfdfdffd’,11, ))

                            t1.setDaemon(True)

                            t1.start()

                   自建线程类:新建类继承Thread

                            classMyThread(Thread):

                                     defrun(self):

                                               print‘I am a thread.’

                   执行线程,其实就是调用了Thread类中的run方法。

                  

                   线程安全的问题,使用锁的功能:线程锁,能很好的保护线程安全。

                   线程安全:队列

 

                            队列:先进先出

                            线程栈:后进先出

                   多线程的使用:python不是一个线程安全语言,需要自己控制。

  • 生产者消费者模型:      生产者生产一个放到队列或者栈里面,然后消费者从队列或栈里面取一个。

  •  

  • 线程安全的问题:    使用线程锁

lock = threading.Lock()定义一个锁

lock.acquire()获取锁 给需要加锁的代码加锁。

加锁的代码执行完后要释放锁:lock.release()

python中防止死锁:定义锁的时候使用递归锁。

lock = threading.Rlock()

信号量:同时执行的线程几个。

samp = threading.BoundedSemaphore(n)

异步:

  •  

  •  

 

paramiko模块的使用:sshlinux主机批量管理。

 

sshrsa原理:使用非对称加密。

         公钥:在服务器端做加密。

         私钥:在客户端做解密。






  • 多进程

  • Paramiko

  • 审计开发

  • select异步模型

 

         进程:使用multiprocessing模块的Pool类。

                   多进程多线程可以绕过GlobalInterpreter Lock(全局解释器锁)

         多进程示例代码:

                   frommultiprocessing import Pool

                   deff(x):

                            returnx*x

                   if__name__ == ‘__main__’:

                            p= Pool(5)

                            print(p.map(f,[1,2,3]))

 

 

                   创建多个子进程的方法2,示例代码:

                            frommultiprocessing import Process

                            importos

                            definfo(title):

                                     ifhasattr(os, ‘getppid’):

                                               print‘parent process:’, os.getppid()

                            print‘process id:’, os.getpid()

                           

                            if__name__ == ‘__main__’:

                                     info(‘mainline’)

                                     p= Process(target = f, args = (‘bbbbb’, ))

                                     p.start()

                                      p.join()

 

         进程间通信:使用队列。

                   frommultiprocessing import Process,Queue

 

         进程间同步:加上锁,使用Manager()方法。也可以使用ValueArray

 

         进程池:通过Pool创建多进程。

 

         python异步:select   vs   poll&epoll   异步IO

 

         审计工具:web工具:shellinabox

 

        

 

 

8天的主要内容:实战练习:python开发一个类似nagios的监控软件。

        

 

                   python socket 开源框架:twistedmatrix

















         主题使用PYTHON开发类Nagios监控软件

知识点:

1.   使用Reids发布\订阅功能做服务器和客户端的通信通道

2.   利用面向对象思想开发监控模板

3.   实现监控项目插件化,允许用户自行开发监控插件

 

 

 

需求:

  1. 1.  每个客户端需要监控的服务不同

  2. 2.   每个服务的监控间隔不同

  3. 3.   允许模板的形式批量修改监控指标

  4. 4.   不同设备的监控阀值不同

  5. 5.   可自定最近n分钟内hit\max\avg\last\... 指标超过阈值

  6. 6.   报警策略、报警等级、报警自动升级

  7. 7.   历史数据的存储和优化

  8. 8.   跨机房、区域代理服务器

 

1000*20=20000 总指标,没5分钟一次,

1hour = 24W

1day = 576W *4Byte

Cpu :iowait 20  idle 80 system 30 user 50 

 

 

What the client side has to know before itcan invoke a plugin?

Answer: plugin_name \ interval \service name

 

 

 

 

 

 

 

 

 

 

 

 

python web框架 Django

         Controller:该模型里面存放的是一组对业务逻辑的描述代码。

         Model:该模型里面存放的是一组对数据库进行操作的代码。

         View:该模型里面存放的是一组html文件。

 

http://www.cnblogs.com/wupeiqi/articles/4491246.html

 

创建django程序,使用IDE创建一个django application,并配置运行参数。