python学习笔记

 : jank    :   : 2134    : 2016-09-06 21:58  python

一,面向对象

1.创建类

class Employee:
   '所有员工的基类'
   empCount = 0
   def __init__(self, name, salary):    #类似php中的构造函数__constuct()
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
#"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
#"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()

print "Total Employee %d" % Employee.empCount

2.可以使用以下函数的方式来访问属性:

getattr(obj, name[, default]) : 访问对象的属性。

hasattr(emp1, 'age')# 如果存在 'age' 属性返回 True。

hasattr(obj,name) : 检查是否存在一个属性。

getattr(emp1, 'age')    # 返回 'age' 属性的值

setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。

setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8

delattr(obj, name) : 删除属性。

delattr(empl, 'age')    # 删除属性 'age'

3.Python内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串

__name__: 类名

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,

那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组

4.析构函数 __del__ 

__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行。

例:

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "销毁"

5.类的继承

特点:

1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

        2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时

           并不需要带上self参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。

 (先在本类中查找调用的方法,找不到才去基类中找)。

例:

class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print "调用父类构造函数"
   def parentMethod(self):
      print '调用父类方法'
   def setAttr(self, attr):
      Parent.parentAttr = attr
   def getAttr(self):
      print "父类属性 :", Parent.parentAttr
class Child(Parent): # 定义子类
   def __init__(self):
      print "调用子类构造方法"
   def childMethod(self):
      print '调用子类方法 child method'
c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法

注:python可以支持多继承,语法:class Child(Parent1,Parent2...parent100):

检测父子类关系:

issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)

isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true

6.方法重写

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法(重写,即重新书写)

例:

class Parent:
  def jank(self):
    print '我是中国人'
class Child(Parent):
  def jank(self):
    print '我热爱祖国'

7.类的属性

类的私有属性

__private_attrs:声明为私有,不能在类外部被使用或直接访问。在类内部的方法中使用 self.__private_attrs

类的私有方法

__private_method:声明为私有方法,不能在类地外部调用。在类内部调用 self.__private_methods


二.正则表达式

1.re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

例:

import re

print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配

print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

2.re.search 扫描整个字符串并返回第一个成功的匹配。

 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

 例:

import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"

   以上实例执行结果如下:

searchObj.group() :  Cats are smarter than dogs

searchObj.group(1) :  Cats

searchObj.group(2) :  smarter

3.re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,

函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

4.检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。

例:

import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments

num = re.sub(r'#.*$', "", phone)

print "Phone Num : ", num

# Remove anything other than digits

num = re.sub(r'D', "", phone)    

print "Phone Num : ", num 

以上实例执行结果如下:

Phone Num :  2004-959-559

Phone Num :  2004959559

三.CGI(Common Gateway Interface),

    定义:通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口

    1.基本语法:

   #!/usr/bin/python

   # -*- coding: UTF-8 -*-


print "Content-type:text/html"

print                 #告诉服务器结束头部

print """

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<h1>我爱你祖国</h1>

</body>

</html>

"""


2.get url地址栏信息

访问:http://www.jankl.com/cgi-bin/get.py?name=%E8%89%BE%E5%8D%A0%E9%AD%81%E7%9A%84&url=www.jankl.com&mid=110

代码:

#!/usr/bin/python

# -*- coding: UTF-8 -*-


#引入cgi 处理模块

import cgi, cgitb


#创建 fieldstorage的实例化

form = cgi.FieldStorage()


#获取数据


site_name = form.getvalue('name')

site_url = form.getvalue('url')

site_mid = form.getvalue('mid')


print "Content-type:text/html"

print

print """

<html>

<meta charset = utf-8>

<head>

<title>get url测试</title>

</head>

<body>

"""

print "<h2>%s官网:%s</h2>.文章id:%s" % (site_name,site_url,site_mid) #使用占位符

print """

</body>

</html>

"""


3.post 获取表单数据

#!/usr/bin/python

# -*- coding: UTF-8 -*-


#获取cgi模块

import cgi, cgitb


#创建 fieldStorage的实例化

form = cgi.FieldStorage()


#获取数据

site_name = form.getvalue('name')

site_url = form.getvalue('url')


print "Content-type: text/html"

print

print """

<html>

<meta charset=utf-8>

<head>

<title>python post表单</title>

</head>

<body>

"""

print "<h1>%s官网:%s</h1>" % (site_name, site_url)

print """

</body>

</html>

"""

4.cookie

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 

name=name: 需要设置cookie的值(name不能使用";"和","号),有多个name值时用 ";" 分隔,例如:name1=name1;name2=name2;name3=name3。

expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"

path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如: path="/cgi-bin/",如果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"。

domain=domain: 对cookie生效的域名,例如:domain="www.runoob.com"

secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息

1设置cookie

#!/usr/bin/python

# -*- coding: UTF-8 -*-


print 'Content-Type: text/html'

print 'Set-Cookie: name="jank";expires=Wed, 7 SEP 2016 18:30:00 GMT'

print

print """

<html>

<head>

<title>设置cookie

</title>

<body>

<h1>Cookie设置ok</h1>

</body>

</html>

"""

2获取cookie

   #!/usr/bin/python

# -*- coding: UTF-8 -*-

import os

import Cookie


print "Content-type: text/html"

print


print """

<html>

<head>

<meta charset="utf-8">

<title>获取cookie信息</title>

</head>

<body>

<h1>读取cookie信息</h1>

"""


if 'HTTP_COOKIE' in os.environ:

   cookie_string=os.environ.get('HTTP_COOKIE')

   c=Cookie.SimpleCookie()

   c.load(cookie_string)


   try:

       data=c['name'].value

       print "cookie data: "+data+"<br>"

   except KeyError:

       print "cookie 没有设置或者已过去<br>"

print """

</body>

</html>

"""


5.file文件

1文件上传

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import cgi, os

import cgitb; cgitb.enable()


form = cgi.FieldStorage()


# 获取文件名

fileitem = form['filename']


# 检测文件是否上传

if fileitem.filename:

  # 设置文件路径 注:linux/unix下得加上替换文件分隔符如下

  fn = os.path.basename(fileitem.filename.replace("", "/" ))

  open('/home/www/' + fn, 'wb').write(fileitem.file.read())


  message = '文件 "' + fn + '" 上传成功'


else:

  message = '文件没有上传'


print "Content-Type: text/html"

print

print """

<html>

<meta charset="utf-8">

<head>

<title>上传文件</title>

</head>

<body>

<h1>%s</h1>

</body>

</html>

""" % (message,)


2文件下载

#!/usr/bin/python

# -*- coding: UTF-8 -*-


# HTTP 头部

print "Content-Disposition: attachment; filename="foo.txt"";

print

# 打开文件

fo = open("foo.txt", "rb")


str = fo.read();

print str


# 关闭文件

fo.close()


6.mysql

1连接mysql:


import MySQLdb

#连接数据库

db = MySQLdb.connect("localhost","root","******","blog",charset="utf8");

2创建数据表

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import MySQLdb


# 打开数据库连接

db = MySQLdb.connect("localhost","root","******","blog",charset="utf8");


# 使用cursor()方法获取操作游标 

cursor = db.cursor()


# 如果数据表已经存在使用 execute() 方法删除表。

cursor.execute("DROP TABLE IF EXISTS jank")

#新建表

sql = """

       create table jank(

               id int unsigned primary key auto_increment,

               name varchar(20) not null default '',

               address varchar(35) not null default '',

               age tinyint unsigned not null default 0,

               unique name(`name`),

               key age(`age`)

       )engine=innodb charset=utf8;

     """

cursor.execute(sql);

db.close()

3插入数据

#!/usr/bin/python

# -*- coding: UTF8 -*-

import MySQLdb


db = MySQLdb.connect("localhost","root","*******","blog",charset="utf8");

cursor = db.cursor()

sql = """

       insert into jank values(1,'占魁', '江西,上饶市,余干县', 23);

     """

cursor.execute(sql)

db.commit()

db.close()

4查询数据

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

fetchone(): 该方法获取下一个查询结果集。结果集是一个对象

fetchall():接收全部的返回结果行.

rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。

例:

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import MySQLdb

db = MySQLdb.connect("localhost","root","******","blog",charset="utf8");

sql = "select * from jank"

cursor = db.cursor()

cursor.execute(sql)

jank = cursor.fetchall()

print jank

db.close()

5修改数据


#!/usr/bin/python

# -*- coding: UTF-8 -*-


import MySQLdb

db = MySQLdb.connect("localhost","root","*****","blog",charset="utf8")

cursor = db.cursor()

sql = "update jank set age=22 where id=1"

cursor.execute(sql)

db.commit()

db.close()  

6删除数据,执行事务

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import MySQLdb

db = MySQLdb.connect("localhost","root","****","blog",charset="utf8")

cursor = db.cursor()

sql = "delete from jank where id=1"

try:

cursor.execute(sql)

db.commit()

except:

db.rollback()

db.close()  


7.python网络编程

1Python 提供了两个级别访问的网络服务。:

低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。

高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

2socket的含义:

Socket又称"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

服务端:


#!/usr/bin/python

# -*- coding:UTF-8 -*-


import socket  #导入socket模块


s = socket.socket() #创建socket对象

host = socket.gethostname() #获取本机名

port = 12345         #设置端口

s.bind((host,port))  #绑定端口


s.listen(5)          #等待连接,并设置最大连接数为5

while True:

       c, addr = s.accept() #建立客户端连接

       print '连接地址:', addr

       c.send('欢迎访问自由风!')

       c.close()       #关闭连接


客户端:


#!/usr/bin/python

# -*- coding: UTF-8 -*-


import socket


s = socket.socket()

host = socket.gethostname()

port =12345


s.connect((host, port))

print s.recv(1024)   #打印,接收TCP数据,数据以字符串形式返回,设置最大数据量为1024字节

s.close()


8.python smtp发送邮件

 

SMTP(Simple Mail Transfer Protocol):

即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

   1使用本机发送

   首先确保linux下安装了sendmail

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import smtplib

from email.mime.text import MIMEText

from email.header import Header


sender = 'ai@jankl.com'

receivers = ['1150662577@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱


# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码

message = MIMEText('我的世界因为有你才会美...', 'plain', 'utf-8')  #邮件内容

message['From'] = Header("最美的太阳", 'utf-8') #发件人

message['To'] =  Header("艾占魁", 'utf-8')  #收件人


subject = '我的世界,因为有你才会美!'    #邮件标题

message['Subject'] = Header(subject, 'utf-8')#给标题编码


try:

   smtpObj = smtplib.SMTP('localhost')

   smtpObj.sendmail(sender, receivers, message.as_string())

   print "邮件发送成功"

except smtplib.SMTPException:

   print "Error: 无法发送邮件"

2使用其他邮件服务商访问如qq,163等rhaerzkppblcddhj

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import smtplib

from email.mime.text import MIMEText

from email.header import Header


# 第三方 SMTP 服务

mail_host="smtp.qq.com"  #设置服务器

mail_user="3205464302@qq.com"    #用户名

mail_pass="abfojrrogppadhdb"   #口令 授权码



sender = '3205464302@qq.com'

receivers = ['1150662577@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱


message = MIMEText('这世界那么大我的爱只想要你懂,陪伴我无尽旅程。', 'plain', 'utf-8')

message['From'] = Header("张杰", 'utf-8')

message['To'] =  Header("艾占魁<1150662577@qq.com>;", 'utf-8')


subject = '我们都一样'

message['Subject'] = Header(subject, 'utf-8')



try:

   smtpObj = smtplib.SMTP_SSL(mail_host, 465)  #腾讯SMTP发送端口号465

   # 25 为 SMTP 端口号

   smtpObj.login(mail_user,mail_pass)  #登陆

   smtpObj.sendmail(sender, receivers, message.as_string())  #发送

   print "邮件发送成功"

except smtplib.SMTPException:

   print "Error: 无法发送邮件"


3使用html格式发送邮件并附带图片


#!/usr/bin/python

# -*- coding: UTF-8 -*-


import smtplib

from email.mime.image import MIMEImage

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import smtplib

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.header import Header


sender = 'ai@jankl.com'

receivers = ['1150662577@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱


msgRoot = MIMEMultipart('related')

msgRoot['From'] = Header("艾占魁", 'utf-8')

msgRoot['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'

msgRoot['Subject'] = Header(subject, 'utf-8')


msgAlternative = MIMEMultipart('alternative')

msgRoot.attach(msgAlternative)



mail_msg = """

<p>Python 邮件发送测试...</p>

<p><a href="http://www.jankl.com">自由风的博客</a></p>

<p>图片演示:</p>

<p><img src="cid:image1"></p>

"""

msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))


# 指定图片为当前目录

fp = open('test.png', 'rb')

msgImage = MIMEImage(fp.read())

fp.close()


# 定义图片 ID,在 HTML 文本中引用

msgImage.add_header('Content-ID', '<image1>')

msgRoot.attach(msgImage)


try:

   smtpObj = smtplib.SMTP('localhost')

   smtpObj.sendmail(sender, receivers, msgRoot.as_string())

   print "邮件发送成功"

except smtplib.SMTPException:

   print "Error: 无法发送邮件"

"


    8.python多线程

    Python中使用线程有两种方式:函数或者用类来包装线程对象。

    1使用函数创建多线程

    #!/usr/bin/python

# -*- coding: UTF-8 -*-


import thread

import time


#为线程定义一个函数


def print_time( threadName, delay):

 count = 0

 while count < 5:

       time.sleep(delay)

       count += 1

       print "%s: %s" % (threadName, time.ctime(time.time()))


#创建三个线程

try:

 thread.start_new_thread( print_time, ("thread_1", 1,))

 thread.start_new_thread( print_time, ("thread-2", 2,))

 thread.start_new_thread( print_time, ("thread-3", 4,))

except:

 print "线程书写有误"


while 1:

 pass

2使用Threading模块创建线程

常用方法:

run(): 用以表示线程活动的方法。

start():启动线程活动。

join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

isAlive(): 返回线程是否活动的。

getName(): 返回线程名。

setName(): 设置线程名。

使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法:

#!/usr/bin/python

# -*- coding: UTF-8 -*-


import threading

import time


exitFlag = 0


class myThread (threading.Thread):     #继承父类threading.Thread

 def __init__(self, threadID, name, counter):

       threading.Thread.__init__(self)

       self.threadID = threadID

       self.name = name

       self.counter = counter

 def run(self):    #把要执行的代码写到run函数里面,线程在创建后会直接运行run函数

       print "Starting" + self.name

       print_time(self.name, self.counter, 5)

       print "Exiting" + self.name


def print_time(threadName, delay, counter):   #输出时间函数

       while counter:

         if exitFlag:

           thread.exit()

         time.sleep(delay)

         print "%s: %s" % (threadName, time.ctime(time.time()))

         counter -= 1


#创建新线程

thread1 = myThread(1, "Thread-1", 1)

thread2 = myThread(2, "Thread-2", 2)

thread3 = myThread(3, "Thread-3", 4)


#开启线程

thread1.start()

thread2.start()

thread3.start()

print "Exiting Main Thread"


        3线程同步

        如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。

        #!/usr/bin/python

# -*- coding: UTF-8 -*-


#线程同步


import threading

import time


class myThread (threading.Thread):

 def __init__(self, threadID, name, counter):

       threading.Thread.__init__(self)

       self.threadID = threadID

       self.name = name

       self.counter = counter

 def run(self):

       print "Starting" + self.name

       #获得锁,成功获得锁定后返回True

       #可选的timeout参数不慎时将一直阻塞直到获得锁定

                       

   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com