python基础学习06

python基础语法学习-理解python装饰器

概念

装饰器(Decorator)的基本定义:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”。

装饰器的定义是:装饰器实质上是一个函数。它把一个函数作为输入并且返回另外一个函数。其实其是闭包概念的深化

优点

抽离出大量函数中与函数功能本身无关的雷同代码并继续重用

可以将函数“修饰”为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限和身份验证从业务中独立出来

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

装饰器入门

In [43]: def foo():
    ...:     print('in foo()')
    ...: foo()
    ...:
in foo()

In [44]:
In [44]: import time

In [45]: def foo():
    ...:     start = time.clock()
    ...:     print('in foo()')
    ...:     end = time.clock()
    ...:     print('used:', end - start)
    ...: foo()
    ...:
in foo()
used: 2.1999999997746045e-05

In [46]:
[Read More]

python基础学习04

python基础语法学习-元组与切片

元组

元组是一个不可变结构 是不允许修改的,只查询
In [164]: t = tuple()

In [165]: t
Out[165]: ()

In [166]: t = (1,2,3)

In [167]:

In [171]: t.count(1)
Out[171]: 1

In [175]: t = (1)

In [176]: t
Out[176]: 1

In [177]: t = (1,)

In [178]: t
Out[178]: (1,)

In [179]:

列表和元组的区别

list是[]号
元组是()号
list可以修改
元组不可以修改
[Read More]

python基础学习05

python基础语法学习-字符串

1.什么是字符串

	什么是字符串?
		python3里面是unicode序列
		在python2里面是byte序列
		字符串也是不可变的
		支持切片 也支持索引 支持解包操作
		支持遍历
	用在哪些特定的环境
	为什么是内置数据结构
	In [26]: s = 'geek'

In [27]: s
Out[27]: 'geek'

In [28]: s[0]
Out[28]: 'g'

可以反转:
In [30]: s[::-1]
Out[30]: 'keeg'

In [31]:
支持解包
In [36]: a = 'geek'

In [37]: g,*s = a

In [38]: g
Out[38]: 'g'

In [39]: s
Out[39]: ['e', 'e', 'k']

In [40]:

2.字符串的连接

**join使用方法:**
In [45]: list = ['my','name','is ','steven']

In [46]: list
Out[46]: ['my', 'name', 'is ', 'steven']

In [47]: ' '.join(list)
Out[47]: 'my name is  steven'

In [48]: ','.join(list)
Out[48]: 'my,name,is ,steven'

In [49]:

###字符串的分割
**split**  从左边开始分割
**rsplit**  从右边开始分割
**splitlines**
**partition**
**rpartotion**

**split练习使用**
In [119]: a = "my name is steven"

In [120]: a
Out[120]: 'my name is steven'

In [121]: a.split()
Out[121]: ['my', 'name', 'is', 'steven']

In [122]: a.split('is')
Out[122]: ['my name ', ' steven']

In [123]: a.split(' ', 1)
Out[123]: ['my', 'name is steven']

In [124]: a.split(' ', 2)
Out[124]: ['my', 'name', 'is steven']

In [125]: a.split(' ', 3)
Out[125]: ['my', 'name', 'is', 'steven']

In [126]: a.split(' ', 4)
Out[126]: ['my', 'name', 'is', 'steven']

In [127]: a.split(' ', -1)
Out[127]: ['my', 'name', 'is', 'steven']

案例:

In [131]: line = 'usr:http://opsnotes.net'

In [132]: line.split()
Out[132]: ['usr:http://opsnotes.net']

In [133]: line.split(':', 1)
Out[133]: ['usr', 'http://opsnotes.net']
In [135]: key, value = line.split(':', 1)

In [136]: key
Out[136]: 'usr'

In [137]: value
Out[137]: 'http://opsnotes.net'

In [138]:

**splitlines的使用方法:**
In [138]: text = '''i an geek
   .....: i an a boy'''

In [139]: text
Out[139]: 'i an geek\ni an a boy'

In [140]: text.splitlines()
Out[140]: ['i an geek', 'i an a boy']

In [141]:

**partition的使用方法:**
In [141]: a
Out[141]: 'my name is steven'

In [142]: a.partition(' ')
Out[142]: ('my', ' ', 'name is steven')

In [143]: a.split(' ', 1)
Out[143]: ['my', 'name is steven']

In [144]: line.partition(':')
Out[144]: ('usr', ':', 'http://opsnotes.net')

In [145]: key, _, value = line.partition(':')

In [146]: key
Out[146]: 'usr'

In [147]: _
Out[147]: 'usr'

In [148]: value
Out[148]: 'http://opsnotes.net'

In [149]:
[Read More]

python基础学习03

python基础语法学习-list使用

1.list增加的使用方法

1.append使用方法
	原地修改list,给list增加一个元素,append的方法的返回值是None
list.append(12)

In [4]: list.append(12)

In [5]: list
Out[5]: [1, 2, 3, 4, 5, 12]
In [8]: help(list.append)

2.insert的使用方法,根据索引位置添加.
	insert操作的索引超出范围,如果是正索引,等效于append,如果是负索引.等效于insert(0, object)
In [10]: list
Out[10]: [1, 2, 3, 4, 5, 12]

In [11]: list.insert(0,7)

In [12]: list
Out[12]: [7, 1, 2, 3, 4, 5, 12]

In [13]: list.insert(3,0)

In [14]: list
Out[14]: [7, 1, 2, 0, 3, 4, 5, 12]

In [15]:
超出列表不存在的话
In [16]: list.insert(12,3)

In [17]: list
Out[17]: [7, 1, 2, 0, 3, 4, 5, 12, 3]

In [18]: list.insert(13,13)

In [19]:

3.extend的使用方法
	把一个list扩展到我们的list后边
In [20]: list.extend([1,2,3])

In [21]: list
Out[21]: [7, 1, 2, 0, 3, 4, 5, 12, 3, 13, 1, 2, 3]

In [22]:
In [23]: help(list.extend)####学会使用
Help on built-in function extend:

extend(...) method of builtins.list instance
    L.extend(iterable) -> None -- extend list by appending elements from the iterable
(END)
[Read More]

python基础学习01

python基础语法学习运算符

python算数运算符
 ~/code ⮀ cat yunsuanfu1.py
#!/usr/bin/env python
# -*- encoding: UTF-8 -*-

'''
    python算数运算符
'''

a = 21
b = 10
c = 0

c = a + b
print "1 - c的值为: ", c

c = a - b
print "2 - c的值为: ", c

c = a * b
print "3 - c的值为: ", c

c = a / b
print "4 - c的值为: ", c

c = a % b
print "5 - c的值为: ", c


'''
修改变量: a,b,c
'''

a = 2
b = 3
c = a ** b
print "6 - c的值为: ", c

a = 10
b = 5
c = a // b
print "7 - c的值为: ", c
 ~/code ⮀
[Read More]

python基础学习02

python基础语法学习

**Python range用法**
range([start ,] stop [, step])


上面方括号内的参数表示是可选的,但所有参数必须是整数。如果参数step被省略的话,它的默认值是1;如果参数start被省略的话,它的默认值将是0。但是无论如何,参数stop是不允许省略的,所以range()函数只有一个参数时,它表示range(stop);当range()函数带有两个参数时,它表示range(start,stop)。

我们知道range()返回的是一个列表,列表中的整数值为[start, start + step, start + 2 * step, start + 3 * step,...]。如果参数step为正值,那么列表中最后一个元素为小于参数stop的那个最大的整数 start + i * step ;如果参数step为负值,那么列表中最后一个元素为大于参数stop的那个最小的整数 start + i * step 。但是任何时候参数step的值都不能为零。只要将上面的列举的range()示例跟这里的一般性介绍相结合,我们就能更好的理解该内建函数的用法。

需要注意,当参数step为正值时,参数start必须小于参数step;当参数step为负值时,参数start必须大于参数step,否则range()函数将返回一个空表

习题练习1:写一个猜数字游戏,预先设定一个数字,游戏玩家输入一个数字,如果与预设的数字相等,玩家获胜,如果不等,提示玩家太大还是太小,玩家有三次猜数字的机会。
!/usr/bin/env python
# -*- coding: utf-8 -*-

result =  4
count = 3

while not count == 0:
    guess = int(raw_input('Please enter Guess Number: '))
    if  guess == result:
        print u'猜对了,游戏结束'
        break

    elif guess > result:
        print u'数字偏大,再猜一次'
        count -= 1

    else:
        print u'数字偏小,再猜一次'
        #continue
        count -= 1

else:
    print u'只能猜三次游戏结束!!'
[Read More]

Python多版本管理软件pyenv

Python多版本管理软件pyenv

Pyenv是什么

git地址:https://github.com/yyuu/pyenv
1.pyenv是python版本多功能切换工具,对系统无任何依赖关系和损坏.
2.能支持多个python版本
3.可以在多个python不同版本之间切换

安装部署

环境:
Centos7.0  阿里云
安装:
1.curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
2.修改配置/etc/profile文件,添加如下文件
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
3. source /etc/profile
更新pyenv版本:
pyenv update
删除pyenv:
只需要删掉目录就可以(注意是隐藏文件)
rm -fr ~/.pyenv

使用pyenv在CentOS7.1上安装python3.5.2

1.先解决依赖关系
yum -y install gcc patch make gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel readline-devel
2.下载python3.5.2压缩包
wget http://7d9qvq.com1.z0.glb.clouddn.com/Python-3.5.2.tgz
3.把下载的文件重命名移动到如下目录
[root@zm-test-ops-01 ~]# mkdir /root/.pyenv/cache
[root@zm-test-ops-01 ~]# mv Python-3.5.2.tar.gz /root/.pyenv/cache/
[Read More]

使用flask发送邮件

使用flask发送邮件

安装flask-mail

sudo pip install flask-mail

设置环境变量

export MAIL_USERNAME='XXXXX@qq.com'    #发送邮件的邮箱
export MAIL_PASSWORD='password'      #发送邮件的邮箱密码

使用flask-mail发送邮件

    (venv)zhangkeyuan@opsnotes:~/Test/flask » cat flask-mail.py
    #!/bin/env python
    #-*- coding:utf-8 -*-
    from flask import Flask, render_template
    from flask.ext.mail import Mail,Message
    import os


    app = Flask(__name__)
    ####SMTP server config
    app.config['MAIL_SERVER'] = 'smtp.qq.com' #电子邮件服务器的地址
    app.config['MAIL_PORT'] = '25'   #邮箱服务器的端口
    app.config['MAIL_USE_TLS'] = True  #启用安全传输
    app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')  #邮件账户用户名,已定义环境变量
    app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')  #邮件账密码,已定义环境变量


    mail = Mail(app)

    @app.route('/')
    def index():
        msg = Message('主题',sender=os.environ.get('MAIL_USERNAME'),recipients=['431054426@qq.com'])
        msg.body = '文本 body'
        msg.html = '<b>测试flask发送邮件</b>'
        mail.send(msg)

        return '<h1>邮件发送成功</h1>'


    if __name__ == '__main__':
        app.run(debug=True)
    (venv)zhangkeyuan@opsnotes:~/Test/flask »
[Read More]

Python学习之邮件发送

Python学习之邮件发送

测试环境

Python 2.7.6  

脚本如下

zhangkeyuan@opsnotes:~/Test/smtplib » cat simple2.py  
#!/usr/bin/python  
#coding: utf-8  
import smtplib  
from email.mime.text import MIMEText  
HOST = "smtp.qq.com"  
SUBJECT = u"博客流量数据统计"  
TO = "zhangky@jiagouyun.com"  
FROM = "431054426@qq.com"  
msg = MIMEText("""  
    <table width="800" border="0" cellspacing="0" cellpadding="4">  
    <tr>  
        <td bgcolor="#CECFAD" height="20" style="font-size:14px">* 博客数据 <a href="opsnotes.net">更多>></a></td>  
    </tr>  
    <tr>  
        <td bgcolor="#EFEBDE" height="100" style="font-size:13px">  
        1) 日访问量: <font color=red>154333</font> 访问次数:12834 页面浏览:12345 点击数:12306 数据流量:521MB<br>  
        2) 状态码信息<br>  
        &nbsp;&nbsp;500:105 404:3264 503:214<br>  
        3) 访问浏览信息<br>  
        &nbsp;&nbsp;IE:50% firefox:10% chrome:30% other:10%<br>  
        4) 页面信息<br>  
        &nbsp;&nbsp/index.php 42153<br>  
        &nbsp;&nbsp/viwe.php 21451<br>  
        &nbsp;&nbsp/login.php 5112<br>  
        </td>  
    </tr>  
    </table>""","html","utf-8")  

msg['Subject'] = SUBJECT  
msg['From'] = FROM  
msg['To'] = TO  
try:  
        server = smtplib.SMTP()  
        server.connect(HOST, "25")  
        server.starttls()  
        server.login("431054426@qq.com","XXWWXX))000")  
        server.sendmail(FROM, TO, msg.as_string())  
        server.quit()  
         print "邮件发送成功!"  
except Exceotion, e:  
        print "失败: "+str(e)  
zhangkeyuan@opsnotes:~/Test/smtplib »  
[Read More]

使用paramiko在windows下批量登陆linux服务器

使用paramiko在windows下批量登陆linux服务器

环境:

windows8.1 X86_64  

被测试的机器:

192.168.100.228,192.168.100.240

脚本如下:

	#!/bin/env python
	import paramiko
	import os
	import datetime
	from ConfigParser import ConfigParser

	ConfigFile = 'ipaddr.txt'
	config = ConfigParser()
	config.read(ConfigFile)
	hostname1=''.join(config.get('IP','ipaddr'))
	address=hostname1.split(';')
	print address
	username = 'root'
	password = '123456'
	port = 22
	if __name__=="__main__":
		for ip in address:
			paramiko.util.log_to_file('paramiko-ssh1.log')
			ssh = paramiko.SSHClient()
			ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
			ssh.connect(hostname=ip,username=username,password=password)
			stdin,stdout,stderr=ssh.exec_command('ifconfig eth0;free -m')
			print stdout.read()
			ssh.close()
[Read More]

在windows上安装paramiko模块

在windows上安装paramiko模块

环境:

windows8.1 X86_64  

需求:

Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于   pycrypto模块,因此要在Python中使用SSH。所以我们需要先安装pycrypto工具,然后再安装paramiko模块才能使用。  
安装Parmiko首先要保证Python 已经安装完成。  
PS:	linux的安装相对简单,只需要下载安装就OK  
[Read More]