安装pip

by jank python 0 条评论

下载pip:

wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificate

解压:

tar -zxvf pip-1.5.4.tar.gz

cd pip-1.5.4

安装:

python3 setup.py install

这时候python安装目录/usr/local/python3/bin下面会出现pip3文件,为了能直接使用pip3命令,我们

需要 ln /usr/local/python3/bin/pip3 /usr/bin/pip3

linux压缩解压格式详解

by jank linux 0 条评论

Linux操作系统中,*.zip、*.tar、*.tar.gz、*.tar.bz2、*.tar.xz、*.jar、*.7z等格式的压缩与解压

zip格式

压缩: zip -r [目标文件名].zip [原文件/目录名]解压: unzip [原文件名].zip

注:-r参数代表递归

tar格式(该格式仅仅打包,不压缩)

打包:tar -cvf [目标文件名].tar [原文件名/目录名]解包:tar -xvf [原文件名].tar

注:c参数代表create(创建),x参数代表extract(解包),v参数代表verbose(详细信息),f参数代表filename(文件名),所以f后必须接文件名。

tar.gz格式

方式一:利用前面已经打包好的tar文件,直接用压缩命令。

压缩:gzip [原文件名].tar
解压:gunzip [原文件名].tar.gz

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]
解压并解包: tar -zxvf [原文件名].tar.gz

注:z代表用gzip算法来压缩/解压。

tar.bz2格式

方式一:利用已经打包好的tar文件,直接执行压缩命令:

压缩:bzip2 [原文件名].tar
解压:bunzip2 [原文件名].tar.bz2

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -jcvf [目标文件名].tar.bz2 [原文件名/目录名]
解压并解包: tar -jxvf [原文件名].tar.bz2

注:小写j代表用bzip2算法来压缩/解压。

tar.xz格式

方式一:利用已经打包好的tar文件,直接用压缩命令:

压缩:xz [原文件名].tar
解压:unxz [原文件名].tar.xz

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -Jcvf [目标文件名].tar.xz [原文件名/目录名]
解压并解包: tar -Jxvf [原文件名].tar.xz

注:大写J代表用xz算法来压缩/解压。

tar.Z格式(已过时)

方式一:利用已经打包好的tar文件,直接用压缩命令:

压缩:compress [原文件名].tar
解压:uncompress [原文件名].tar.Z

方式二:一次性打包并压缩、解压并解包

打包并压缩: tar -Zcvf [目标文件名].tar.Z [原文件名/目录名]
解压并解包: tar -Zxvf [原文件名].tar.Z

注:大写Z代表用ncompress算法来压缩/解压。另,ncompress是早期Unix系统的压缩格式,但由于ncompress的压缩率太低,现已过时。

jar格式

压缩:jar -cvf [目标文件名].jar [原文件名/目录名]
解压:jar -xvf [原文件名].jar

注:如果是打包的是Java类库,并且该类库中存在主类,那么需要写一个META-INF/MANIFEST.MF配置文件,内容如下:

Manifest-Version: 1.0Created-By: 1.6.0_27 (Sun Microsystems Inc.)
Main-class: the_name_of_the_main_class_should_be_put_here

然后用如下命令打包:

jar -cvfm [目标文件名].jar META-INF/MANIFEST.MF [原文件名/目录名]

这样以后就能用“java -jar [文件名].jar”命令直接运行主类中的public static void main方法了。

7z格式

压缩:7z a [目标文件名].7z [原文件名/目录名]
解压:7z x [原文件名].7z

注:这个7z解压命令支持rar格式,即:

7z x [原文件名].rar


python3安装

by jank python 0 条评论

阿里云linux centos系统默认带有python2,所以之前学习python的时候都没有自己手动安装python。下面介绍python3的安装过程:

        
1.首先下载源tar包 ,这是目前最新版本
# wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0a1.tar.xz 
解压
tar -Jxvf Python-3.6.0a1.tar.xz 

进入解压缩后的文件夹 
cd Python-3.6.0a1.tar.xz 
开始编译安装 
1 ./configure --prefix=/usr/local/python3 
2 make 
3 make install 
将原来/usr/bin/python链接改为别的名字 (如果需要覆盖原来python版本运行的话),如下:
mv /usr/bin/python /usr/bin/python_old 
再建立新版本python的连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3

ln -s /usr/local/python3/bin/python3 /usr/bin/python(覆盖原版本安装)

这个时候输入: 
python3

python(覆盖原版本安装)

    显示出python的新版本信息  

[root@iZ281n5wkqrZ bin]# python3

Python 3.6.0a1 (default, Sep  7 2016, 11:38:08) 

[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux

Type "help", "copyright", "credits" or "license" for more information.




python学习笔记

by jank python 0 条评论

一,面向对象

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 jank931211

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参数不慎时将一直阻塞直到获得锁定

                       

CentOS sendmail安装及邮件域名配置

by jank linux 0 条评论

sendmail是Linux下优秀的邮件系统。在不做任何设定的情况下,sendmail发出邮件的邮箱源地址形如userid@localhost.localdo,这种地址几乎会被所有的邮箱认定为SPAM(垃圾邮件)或直接拒收。

1、 Sendmail安装

在CentOS下,sendmail一般默认是随操作系统一起安装的。如果安装系统时没有安装sendmail服务,手动安装sendmail也很简单:

view plain   copy# yum install -y sendmail # yum install -y sendmail-cf

2、 Senmail的SMTP认证配置(不需要认证的可忽略此步)

首先确认saslauthd服务是否安装或启动。

安装saslauthd服务:# yum install -y saslauthd

启动saslauthd服务:# service saslauthd start

(1) 配置Senmail的SMTP认证

# vi /etc/mail/sendmail.mc

view plain   copydnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

将上面两行的dnl去掉。在sendmail文件中,dnl表示该行为注释行,是无效的,因此通过去除行首的dnl字符串可以开启相应的设置行。

(2) 设置Sendmail服务的网络访问权限

# vi /etc/mail/sendmail.mc

view plain   copyDAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

将127.0.0.1改为0.0.0.0,意思是任何主机都可以访问Sendmail服务。如果仅让某一个网段能够访问到Sendmail服务,将127.0.0.1改为形如192.168.1.0/24的一个特定网段地址。

3、 生成Sendmail配置文件

Sendmail的配置文件由m4来生成,m4工具在sendmail-cf包中。如果系统无法识别m4命令,说明sendmail-cf软件包没有安装。

生成Sendmail的配置文件:

view plain   copym4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

需要重启Sendmail才能使配置文件生效:# /bin/systemctl restart sendmail.service 

4、 Sendmail邮件域名配置

配置sendmail使用合法的域名分两步,修改sendmail的配置文件和添加域名MX记录。

sendmail可以直接使用 “-r account@domain.com” 参数来以任意源地址发送邮件,但目前主流的邮箱都会将源地址和反向解析IP进行比较,如果解析不到或是解析的IP不匹配,轻则将邮件直接归为SPAM,严重的就直接拒绝接收。

MX记录(Mail Exchanger Record)主要是接收邮件时使用,即当投递一封新邮件时,会查询收件人域名的MX记录,然后通过MX记录得到的IP地址进行投递。同时邮件厂商在接收邮件的时候也会将源地址和MX记录进行比较,作为垃圾邮件的判断标准之一。

第一步:添加域名

(1) 将域名加入到local-host-names文件

# vi /etc/mail/local-host-names,添加

view plain   copysunchis.com

(2) 修改submit.cf文件

# vi /etc/mail/submit.cf,找到行 #Dj$w.Foo.COM,修改为

view plain   copyDjsunchis.com

至此,sendmail邮件命名配置完毕,重启sendmail使配置生效。

第二步:添加域名MX记录

找到修改域名信息的页面(不同的域名注册商页面不相同),修改结果因域名商的不同最迟会在24小时内生效。

(1) 添加域名A记录mail,直接指向你的邮件服务器的静态IP地址:

点击放大图片

(2) 添加(或是修改)域名的MX记录,形如:

点击放大图片

(3) 使用nslookup检测MX记录是否能正确解析到邮件服务器

view plain   copy# nslookup > set q=mx > sunchis.com Server:         8.8.8.8 Address:        8.8.8.8#53  Non-authoritative answer: sunchis.com  mail exchanger = 10 mail.sunchis.com.  Authoritative answers can be found from: >

OK,已经正确解析到邮件服务器所对应的域名。

5、 Relaying denied(拒绝投递)的解决

出现 550 5.7.1 <xxx@163.com>... Relaying denied. IP name lookup failed [192.168.1.133] 异常时,原因是把sendmail当做邮件中转站,需要将客户端的IP地址加入到access配置文件中。

# vi /etc/mail/access,添加

view plain   copyConnect:192.168.1.133                   RELAY

重新生成访问权限的数据库:

view plain   copy# cd /etc/mail/ # makemap hash access.db < access

这样,问题就会得到解决.

本文摘自网络:http://www.centoscn.com/CentosServer/lighttpd/2013/0726/650.html

mysql主从配置

by jank mysql 0 条评论

一、安装MySQL

说明:在两台MySQL服务器192.168.21.169和192.168.21.168上分别进行如下操作,安装MySQL 5.5.22

 二、配置MySQL主服务器(192.168.21.169)
mysql  -uroot  -p    #进入MySQL控制台
create database osyunweidb;   #建立数据库osyunweidb
insert into mysql.user(Host,User,Password) values('localhost','osyunweiuser',password('123456'));   #创建用户osyunweiuser

#建立MySQL主从数据库同步用户osyunweidbbak密码123456 

flush privileges;   #刷新系统授权表

#授权用户osyunweidbbak只能从192.168.21.168这个IP访问主服务器192.168.21.169上面的数据库,并且只具有数据库备份的权限
grant replication slave  on *.* to 'osyunweidbbak'@'192.168.21.168' identified by '123456' with grant option; 


三、把MySQL主服务器192.168.21.169中的数据库osyunweidb导入到MySQL从服务器192.168.21.168中
1、导出数据库osyunweidb

mysqldump -u root -p osyunweidb > /home/osyunweidbbak.sql    #在MySQL主服务器进行操作,导出数据库osyunweidb到/home/osyunweidbbak.sql 

备注:在导出之前可以先进入MySQL控制台执行下面命令

flush tables with read lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入

unlock tables;   #解除锁定

2、导入数据库到MySQL从服务器

mysql  -u root -p  #进入从服务器MySQL控制台

create database osyunweidb;   #创建数据库

use osyunweidb    #进入数据库

source  /home/osyunweidbbak.sql  #导入备份文件到数据库

mysql -u osyunweidbbak -h 192.168.21.169 -p  #测试在从服务器上登录到主服务器
四、配置MySQL主服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=1   #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
log_bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=osyunweidb  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db=mysql   #不同步mysql系统数据库
service mysqld  restart  #重启MySQL
mysql -u root -p   #进入mysql控制台
show master status;  查看主服务器,出现以下类似信息
+------------------+----------+--------------+------------------+
| File                        | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000019 |    7131    | osyunweidb    | mysql                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注意:这里记住File的值:mysql-bin.000019和Position的值:7131,后面会用到。
五、配置MySQL从服务器的my.cnf文件
vi /etc/my.cnf   #编辑配置文件,在[mysqld]部分添加下面内容
server-id=2   #配置文件中已经有一行server-id=1,修改其值为2,表示为从数据库
log-bin=mysql-bin  #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
replicate-do-db=osyunweidb   #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
replicate-ignore-db=mysql   #不同步mysql系统数据库
:wq!    #保存退出
service mysqld restart   #重启MySQL
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
mysql  -u root -p  #进入MySQL控制台
slave stop;   #停止slave同步进程
change master to master_host='192.168.21.169',master_user='osyunweidbbak',master_password='123456',master_log_file='mysql-bin.000019' ,master_log_pos=7131;    #执行同步语句
slave start;    #开启slave同步进程
SHOW SLAVE STATUS\G   #查看slave同步信息,出现以下内容
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.21.169
                  Master_User: osyunweidbbak
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 7131
               Relay_Log_File: MySQLSlave-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: osyunweidb
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
1 row in set (0.00 sec)
注意查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上这两个参数的值为Yes,即说明配置成功!
 

六、测试MySQL主从服务器双机热备是否成功
1、进入MySQL主服务器

mysql -u root -p  #进入主服务器MySQL控制台

use osyunweidb   #进入数据库

CREATE TABLE test ( id int not null primary key,name char(20) );   #创建test表
2、进入MySQL从服务器

mysql -u root -p  #进入MySQL控制台

use osyunweidb   #进入数据库

show  tables;  #查看osyunweidb表结构,会看到有一个新建的表test,表示数据库同步成功


centos下安装mysqldb实现python与mysql连接

by jank mysql 0 条评论
  1. 安装mysqldb之前需安装mysql_devel

    yum install mysql-devel (centos下的安装方法)

    sudo apt-get install python-dev (ubuntu下安装的方法)

  2. 下载解压mysqldb

    wget http://pypi.python.org/packages/source/M/MySQL-python/MySQL-python-1.2.3.tar.gz

    tar zxvf MySQL-python-1.2.3.tar.gz

  3. 配置安装

    cd MySQL-python-1.2.3文件夹中,修改site.cfg文件中的mysql_config文件的路径。

    先找到mysql_config文件的路径(前提是已经安装好了mysql)

  find / -name mysql_config

  修改:

    blob.png

4.执行命令:python setup.py build

        python setup.py install

5.检测是否安装成功:

新建一个mysql.py文件写入import MySQLdb

执行:python mysql.py如果没有出现报错则说明配置成功


apache配置

by jank linux 0 条评论

一、apache+php配置

   cd /usr/local/apache

   vim conf/httpd.conf

   1.在 AddType application/x-compress .Z

     AddType application/x-gzip .gz .tgz

   后面添加:

     AddType application/x-httpd-php .php .php3 .phtml .inc

     AddType application/x-httpd-php-source .phps

   2.编译php的时候务必加上:

   --with-apxs2=/usr/local/apache/bin/apxs

   3.设置默认服务器名称:

     配置服务器名:ServerName localhost:80

     修改双引号中的路径为网站根目录:

      DocumentRoot "/home/www"

二、apache虚拟机配置

1.首先打开

blob.png













2.修改

blob.png

3.打开/usr/local/apache/conf/extra/httpd.vhost.conf文件(配置虚拟目录文件)

blob.png

注:需加上默认主机配置,并与httpd.conf文件中主机配置一致

三、apache url重写

  1. 首先查看httpd.conf 文件下是否存在“LoadModule rewrite_module modules/mod_rewrite.so”,

    这是配置url必备的扩展。

  2. 如果没有则需要重新编译apache并加上“--enable-rewrite=shared”

  3. 在对应的虚拟主机根目录下新建一个.htaccess文件在文件中添加rewrite规则,如下:

    blob.png


lamp环境搭建

by jank linux 0 条评论

人们常说的lamp环境指的是linux(系统)+ apache(web服务器) + mysql(数据库)+ php(脚本语言)组合的php开发环境。

  一、安装mysql

由于Mysql的某些版本在未来可能会收费,所以有些linux会默认安装mysql的一个开源分支mariadb,我们要自定义安装mysql就需要先把它删除掉。

先查出所有软件

rpm -qa|grep mariadb

然后依次卸载以及依赖包

rpm -e --nodeps mariadb-libs-5.5.40-1.el7_0.x86_64

解压mysql安装包

tar -xf mysql-5.7.13-1.el7.x86_64.rpm-bundle.tar

官方文档说安装mysql-community-client-5.7.9-1.el7.x86_64.rpm和mysql-community-server-5.7.9-1.el7.x86_64.rpm就可以获得标准功能的MySQL。但是由于RPM包的依赖关系,所以实际上我们还要多装2个RPM包:mysql-community-common-5.7.9-1.el7.x86_64.rpm和mysql-community-libs-5.7.9-1.el7.x86_64.rpm。

以下为安装,由于依赖关系,顺序不要出错:

rpm -ivh mysql-community-common-5.7.13-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-5.7.13-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-5.7.13-1.el7.x86_64.rpm 

rpm -ivh mysql-community-server-5.7.13-1.el7.x86_64.rpm

如果遇到类似‘头V3 DSA/SHA1 Signature’的错误,下面正常安装则忽略,否则在安装语句后面加上--force --nodeps强制安装

指定用mysql用户来运行mysqld初始化

mysqld --initialize --user=mysql

5.7版本的mysql密码默认会在/var/log/mysqld.log下,如下,localhost:后面显示的就是密码。

A temporary password is generated for root@localhost: DO:w=<i:;3uw< span="">

启动mysqld

systemctl start mysqld

检测是否启动成功

systemctl status mysqld

登陆mysql客户端

mysql -u root -p

输入刚才log中的密码即可登录

修改mysql登录密码(在后续其他操作之前必须修改mysql的登录密码)

set password = password('‘);引号中输入新的密码

flush privileges;(使新密码生效)

退出,重启mysqld

systemctl restart mysqld

yum -y install openssl*

InnoDB: Unable to lock ./ibdata1, error: 11 的报错解决方法

通过ps aux |grep mysql 找到mysqld进程,用kill加进程号杀掉

Please read "Security" section of the manual to find out how to run mysqld as root错误的解决方法,在/etc/my.cnf的mysqld下面添加user=mysql让程序以mysql运行

TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option错误的解决方法,在/etc/my.cnf的mysqld下面添加explicit_defaults_for_timestamp=true

二、安装apache

下载:cd  /usr/local/src/

wget  http://apache.fayea.com//httpd/httpd-2.4.23.tar.gz

解压:tar zxvf httpd-2.2.31.tar.gz   

安装:cd httpd-2.2.31

./configure --prefix=/usr/local/apache --enable-module=so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --enable-static-rotatelogs --enable-static-logresolve --enable-authn-dbm=shared --enable-so


三、安装php5.6

下载:cd /usr/local/src

wget http://php.net/get/php-5.6.25.tar.gz

解压:tar zxvf  php-5.6.25.tar.gz(下载后的压缩包)

安装:cd php-5.6.25(解压后的文件夹)

./configure \

--prefix=/usr/local/php5 --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/php5/lib   --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir  --with-mysqli  --with-openssl --with-pcre-regex --with-pdo-mysql=mysqlnd --with-pear --with-png-dir --with-xmlrpc --with-xsl --with-zlib --with-zlib-dir --with-mhash --with-mcrypt --with-openssl-dir --with-jpeg-dir --enable-gd-jis-conv  --enable-fpm  --enable-bcmath --enable-libxml --enable-inline-optimization  --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache  --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-zip

 配置php:

    1.cd /usr/local/php5/etc

    mv php-fpm.conf.default php-fpm.conf

    2.cd /usr/local/php5/lib

    cp /usr/local/src/php-5.6.25/php.ini.production php.ini

配置:apache+php

cd /usr/local/apache

vim conf/httpd.conf

在 AddType application/x-compress .Z

  AddType application/x-gzip .gz .tgz

下面添加以下两行代码:

 AddType application/x-httpd-php .php .php3 .phtml .inc

 AddType application/x-httpd-php-source .phps

修改:

 配置服务器名:ServerName localhost:80

 修改双引号中的路径为网站根目录:

 DocumentRoot "/home/www"

 <Directory "/usr/local/apache/htdocs"> 

最后在指定的网站根目录中添加一个index.php看看是否能正常运行,

并测试连接mysql是否顺利。如果顺利则环境搭建ok。


python2基础

by jank python 0 条评论

一.语法部分

    1.学习Python与其他语言最大的区别就是,Python的代码块不使用大括号({})来控制类,函数以及其他逻辑判断。python最具特色的就是用缩进来写模块。

        注:缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。

        例:

    a=1
    b=2
    if(a < b):
        print "jank";
    else:            #elif代表elseif
        print "占魁";

    2.Python语句中一般以新行作为为语句的结束符。

      但是我们可以使用斜杠( \)将一行的语句分为多行显示,如下所示:

      例:

    total = a + \
      b + \
      c
        print total;

    3.Python 引号

    Python 接收单引号(' ),双引号(" ),三引号(''' """) 来表示字符串,引号的开始与结束必须的相同类型的。

    其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释"

    python 中多行注释使用三个单引号(''')或三个双引号(""")。'

    4.同一行显示多条语句加';'号

    5.Python空行

    函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

    空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

    记住:空行也是程序代码的一部分。

二.变量类型

      1.python中的变量赋值不需要声明

        如:

        a=1; b=1.23; c='jank';

        python不仅可以同时为多个变量赋一个值,还可以为多个变量同时赋不同的值

        如:

        a=b=c=1; a,b,c=1,2,3;

      2.python中的标准赋值类型

        Numbers(数字):int(整形),long(长整形),float(浮点型),complex(复数)

        String(字符串)

        List(列表)

        Tuple(元组)

        Dictionary(字典)

      3.python中的字符串中的字符选取

        例:

            str = 'Hello World!'
            print str # 输出完整字符串
            print str[0] # 输出字符串中的第一个字符
            print str[2:5] # 输出字符串中第三个至第五个之间的字符串
            print str[2:] # 输出从第三个字符开始的字符串
            print str * 2 # 输出字符串两次
            print str + "TEST" # 输出连接的字符串

      4.python列表list

        List(列表) 是 Python 中使用最频繁的数据类型。

        列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。

        列表用[ ]标识。

        例:

        list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
            tinylist = [123, 'john']
            print list # 输出完整列表
            print list[0] # 输出列表的第一个元素
            print list[1:3] # 输出第二个至第三个的元素 
            print list[2:] # 输出从第三个开始至列表末尾的所有元素
            print tinylist * 2 # 输出列表两次
            print list + tinylist # 打印组合的列表

         删除列表元素

      list1 = ['physics', 'chemistry', 1997, 2000];
            del list1[2];

      5.python元组

        元组是另一个数据类型,类似于List(列表)。

        元组用"()"标识。内部元素用逗号隔开。但是'元组不能二次赋值,相当于只读列表'。

        例:

        tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
                tinytuple = (123, 'john')
                print tuple # 输出完整元组
                print tuple[0] # 输出元组的第一个元素
                print tuple[1:3] # 输出第二个至第三个的元素 
                print tuple[2:] # 输出从第三个开始至列表末尾的所有元素
                print tinytuple * 2 # 输出元组两次
                print tuple + tinytuple # 打印组合的元组

      6.python元字典                                                         元字典是python中除列表外最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。

       两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

       字典用"{ }"标识。字典由索引(key)和它对应的值value组成。

      例:

              dict = {}
           dict['one'] = "This is one"
           dict[2] = "This is two"
           tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
           print dict['one'] # 输出键为'one' 的值
           print dict[2] # 输出键为 2 的值
           print tinydict # 输出完整的字典
           print tinydict.keys() # 输出所有键
           print tinydict.values() # 输出所有值

        

三.运算符

   1.算数运算符:

    +加 - 两个对象相加a + b 输出结果 30

    -减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10

    *乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200

    /除 - x除以yb / a 输出结果 2

    %取模 - 返回除法的余数b % a 输出结果 0

    **幂 - 返回x的y次幂a**b 为10的20次方, 输出结果 100000000000000000000

    //取整除 - 返回商的整数部分9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

   2.比较运算符:

    ==等于 - 比较对象是否相等(a == b) 返回 False。

    !=不等于 - 比较两个对象是否不相等(a != b) 返回 true.

    <>不等于 - 比较两个对象是否不相等(a <> b) 返回 true。这个运算符类似 != 。

    >大于 - 返回x是否大于y(a > b) 返回 False。

    <小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。(a < b) 返回 true。

    >=大于等于- 返回x是否大于等于y。(a >= b) 返回 False。

    <=小于等于 -返回x是否小于等于y。(a <= b) 返回 true。

    由上可见:python算数运算符和比较运算符跟php几乎没什么区别。

   3.赋值运算符

    =简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c

    +=加法赋值运算符c += a 等效于 c = c + a

    -=减法赋值运算符c -= a 等效于 c = c - a

    *=乘法赋值运算符c *= a 等效于 c = c * a

    /=除法赋值运算符c /= a 等效于 c = c / a

    %=取模赋值运算符c %= a 等效于 c = c % a

    **=幂赋值运算符c **= a 等效于 c = c ** a

    '//='取整除赋值运算符'c //= a' 等效于 'c = c // a'

   4.逻辑运算符

    and x and y布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。(a and b) 返回 20。

    or x or y布尔"或"- 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。

    not not x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

    5.身份运算符

    isis是判断两个标识符是不是引用自一个对象x is y, 如果 id(x) 等于 id(y) , is 返回结果 1

    is notis not是判断两个标识符是不是引用自不同对象x is not y, 如果 id(x) 不等于 id(y). is not 返回结果 1

    例:

a = 20
b = 20
if ( a is b ):
   print "a 和 b 有相同的标识"
else:
   print "a 和 b 没有相同的标识"

    输出结果为:a 和 b 有相同的标识

    5.成员运算符

    in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。

    not in如果在指定的序列中没有找到值返回 True,否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

    例:

a = 1
b = 6
list = [1, 2, 3, 4, 5 ];
if ( a in list ):
   print "变量 a 在给定的列表 list 中"
elif( b not in list):
   print "变量 b 不在给定的列表 list 中"


四.循环语句

    1.循环类型

    while 循环在给定的判断条件为 true 时执行循环体,否则退出循环体。

    for 循环重复执行语句

    嵌套循环你可以在while循环体中嵌套for循环

      例:

      num = 0;
      while(num < 9):
        print '当期数值为:' , num;
        num += 1;

   while 循环 '还支持else语句,这是php所不允许的'

    nun = 0;
    while(num < 10):
        print '当前数值为:' , num;
    else
        print '当前数值已超出循环范围';

   for 循环 

   //字符串

   for string in 'python':
     print '当前字母:', string;

   //列表

   names = ['jank', 'jack', 'jackson', 'jason'];
    for name in names:
     print '当前的名字:', name

   //序列索引迭代

   fruits = ['banana', 'apple',  'mango']
   for index in range(len(fruits)):
      print '当前水果 :', fruits[index]

   //for循环也支持else

    for num in range(3,9):
      print '当前数字:', num;
    else:
      num += 1;
       print num, ' 加数字';

循环嵌套

i = 2
while(i < 100):
   j = 2
   while(j <= (i/j)):
      if not(i%j): break
      j = j + 1
   if (j > i/j) : print i, " 是素数"
   i = i + 1



2.循环控制语句

break 语句在语句块执行过程中终止循环,并且跳出整个循环

continue 语句在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。

pass 语句pass是空语句,是为了保持程序结构的完整性。

五.日期和时间

    1.获取当前时间戳:

    import time;  # 引入time模块
    ticks = time.time()
    print "当前时间戳为:", ticks

   2.获取当前时间:

    import time;
    localtime = time.localtime(time.time())
    print "本地时间为 :", localtime

    打印结果:time.struct_time(tm_year=2016, tm_mon=8, tm_mday=23, tm_hour=18, tm_min=25,     tm_sec=34, tm_wday=1, tm_yday=236, tm_isdst=0)   

   3.获取当前带格式时间:

    import time
    localtime = time.asctime(time.localtime(time.time()))
    print "当前时间为 :", localtime
    打印结果:Tue Aug 23 18:28:03 2016

   4.格式化时间:使用 time 模块的 strftime 方法来格式化日期

    # 格式化成2016-03-20 11:45:39形式

      print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


    # 格式化成Sat Mar 28 22:24:24 2016形式

    print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())

 

      

    # 将格式字符串转换为时间戳

    a = "Sat Mar 28 22:24:24 2016"
    print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

    5.获取日历

    import calendar
    cal = calendar.month(2016, 1)
    print "以下输出2016年1月份的日历:"
    print cal;

六.函数

   1.定义一个函数

    你可以定义一个由自己想要功能的函数,以下是简单的规则:

    函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。

    任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。

    函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

    函数内容以冒号起始,并且缩进。

    return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

    例:

 def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

   2.实例

    以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。

    def printme( str ):
   "打印传入的字符串到标准显示设备上"
   print str
   return

   3.函数调用

  def printme( str ):
    "打印任何传入的字符串"
    print str;
    return;

     

    # 调用函数

    printme("我要调用用户自定义函数!");

    printme("再次调用同一函数");

   4.不定长函数

    所谓不定长函数,就是为了解决使用超过当初设定的参数问题

    例:

def jank(arr, *vartuple):
    print '输出:', arr;
    for val in vartuple:
        print '数字:', val;
jank(1,2,3,4);

    打印结果:

    输出:1

        数字:2

        数字:3

    数字:4

    注:默认先输出上面的一个,后面的参数走循环


七.匿名函数

    python 使用 lambda 来创建匿名函数。

    例:

    sum = lambda arg1, arg2: arg1 + arg2;

    # 调用sum函数

    print "相加后的值为 : ", sum( 10, 20 )

    print "相加后的值为 : ", sum( 20, 20 )


八.模块

    模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。

    模块的概念有点类似php中的类。

    1.import文件名(相当于require_once,且不需要加后缀名)

    使用方法为:文件名.函数名/类名

    例:

    import jank

    jank.add_name('jank');

    2.From…import 语句Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。

    例:

     # -*- coding: UTF-8 -*-
    from python import add_name
    add_name('艾占魁','男', '23','江西省,上饶市,余干县','17777793319');

   3.From…import* 语句把一个模块的所有内容全都导入到当前的命名空间也是可行的,但不该过多的使用

    例:

    from python import *

   4.定位模块

    当你导入一个模块,Python解析器对模块位置的搜索顺序是:

    当前目录

    如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。

    如果都找不到,Python会察看默认路径。

    模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决      定的默认目录

   5.PYTHONPATH变量

    作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。PYTHONPATH的语法和shell变量PATH的一样。

    在Windows系统,典型的PYTHONPATH如下:

    set PYTHONPATH=c:\python20\lib;

    在UNIX系统,典型的PYTHONPATH如下:

    set PYTHONPATH=/usr/local/lib/python

   6.dir()函数

    dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字。

   7.globals()和locals()函数

    根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。

    如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。

    如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。

    两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。

   8.reload()函数

    当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

    因此,如果你想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块。

    例:

    reload(module_name)

    

九.文件I/O

    1.打印输出结果:print

    2.读取键盘输入:input(), raw_input()

    例:str = raw_input('请输入')

         print '请输出', str

    注:input()和raw_input(),基本类似,但是input()可以输入一个表达式,并输出一个结果

    3.打开和关闭文件

    open()函数

    file object = open(file_name , access_mode, buffering)

    各个参数的细节如下:

    file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。

    access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。

    buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。 

    file.closed返回true如果文件已被关闭,否则返回false。

    file.mode返回被打开文件的访问模式。

    file.name返回文件的名称。

    file.softspace如果用print输出后,必须跟一个空格符,则返回false。否则返回true。

    例:

    # 打开一个文件

    fo = open("python.py", "wb")

    print "文件名: ", fo.name

    print "是否已关闭 : ", fo.closed

    print "访问模式 : ", fo.mode

    print "末尾是否强制加空格 : ", fo.softspace  

    close()方法

    File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

    当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。 

    write()方法

    write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

    write()方法不会在字符串的结尾添加换行符('\n'): 

    

    4.文件定位

    tell()方法告诉你文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后。

    seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。

    如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

    例:

    # 打开一个文件

    fo = open("foo.txt", "r+")

    str = fo.read(10);

    print "读取的字符串是 : ", str

    # 查找当前位置

    position = fo.tell();

    print "当前文件位置 : ", position

    5.重命名

    rename()方法需要两个参数,当前的文件名和新文件名。

    语法:

    import os

    os.rename(current_file_name, new_file_name)

    6.删除文件

    remove()方法删除文件,需要提供要删除的文件名作为参数。

    语法:

    import os

    os.remove(file_name)

    7.创建目录

    例:

    import os

    os.mkdir('jank');

    8.chdir()方法

    可以用chdir()方法来改变当前的目录。

    例:

    import os

    # 将当前目录改为"/home/newdir"

    os.chdir("/home/newdir")

    9.显示当前目录

    getcwd()方法显示当前的工作目录。

    例:

    import os

    print os.getcwd();

    10.删除目录

    例:

    rmdir()方法删除目录,目录名称以参数传递。


Pages:  1 2 3 4