python 常见错误和异常 函数 正则表达式及多线程编程
生成随机密码
#!/usr/bin/env python
import string
from  random import choice
def gen_pass(num=9):
    all_chs = string.letters + string.digits
    pwd = ''
for i in range(9):
        pwd += choice(all_chs)
    return pwd
if __name__ == '__main__':
    print gen_pass (4)
    print gen_pass ()
——————————————————————————————————————————————————————————
python错误和异常
 错误
  从软件方面来说,错误是语法上或逻辑上的
  语法错误只是软件上的结构上有错误,导致不能被解释器解释或编译器无法编译
  这些错误必须在程序执行钱纠正
  逻辑错误可能是由于不完整或是不合发的输入所致,还可能是逻辑无法生成,计算
  或是输出结果需要过程无法执行
 异常
  当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下棋
  这时候就出现了异常,异常是因为程序出现了错误而在正常控制流以外采取的行为
  这个行为又分为两个阶段,首先是引起异常发生的错误然后是检测阶段
异常
  NameError:未声明/初始化对象
  IndexError:序列中没有此索引
  SyntaxError:语法错误
  KeyboardInterrupt:用户中断执行
  EOOFError:没有内建输入,到达EOF标记
  IOError:输入/输出操作失败
检测和处理异常
  try-excep语句
  定义了进行异常监控的一段代码,并且提供了处理异常的机制
  try:
    try_suite(监控这里的异常)
    except Exception[,reason]:
    excep_suite(异常处理代码)  
  #!/usr/bin/env python
  示例:
  try:
      num = int(raw_input('number:'))
      result = 100 /num
      print result
  except ValueError:
    print 'Invalid operation.'
 带有多个expect的try语句
  可以把多个except语句链接在一起,处理一个try块中可能发生的多种异常
  #!/usr/bin/env python
try:
      data = int(raw_input('input a number:'))
  except KeyboardInterrupt:
      print 'user cancelled.'
  except ValueError:
      print 'you must input a number!'
  else:
      print data
  finally:
      print 'done.'
触发语句
  raise语句:
  要想引发异常,最简单的形式就是输入关键字raise,后面要跟要引发的异常的名称
  执行raise语句时,python会创建制定的异常类的一个对象
  raise语句还可可以指定对异常对象进行初始化的参数
  断言:
    断言是一句必须等价于布尔值为真的判定,此外,发生异常也意味者表达式为假
    实例:
    !/usr/bin/env python
def set_age(name,age):
        if not 1 <+ age < 150:
            raise ValueError, 'age out of range.'(raise语句)
        print '%s is %s years old.' % (name,age)
    def set_age2(name,age):
        assert 1 <= age <150, 'age out of range.'(断言)
        print '%s is %s years old.' % (name,age)
    
    if __name__ == '__main__':
        set_age('hydra',20)
        set_age2('alice',200)
——————————————————————————————————————————————————————————————————
re模块
  match函数
    尝试用正则表达式模式从字符串的开头匹配,如果匹配成功则返回一个匹配对象
    否则返回none
    >>> import re(导入模块)
    >>> re.match('foo','food')(匹配成功)
    <_sre.SRE_Match object at 0x7fa02fd06b90>
    >>> print re.match('foo','seafood')(匹配失败)
    None
  search函数
    在字符串中查找正则表达式的第一次出现,如果匹配成功则返回一个匹配对象
    否则返回None
    >>> m = re.search('foo','seafood')
    >>> print m
    <_sre.SRE_Match object at 0x7fa02fd06bf8>
  group方法
    使用match或search匹配成功后,返回的匹配对象可通过group方法获得匹配内容
    >>> print m.group()
    foo
compile函数
    对正则表达式模式进行编译,返回一个正则表达式对象
    不是必须要用这种方式,但是可在大量匹配的情况下可以提升效率
    >>> patt = re.compile('foo')
    >>> m = patt.match('food')
    >>> print m.group()
    foo
  split方法
    根据正则表达式中的分割符把字符分割为一个列表,并返回成功匹配的列表
    字符串也有类似的方法,但是正则表达式更加灵活
    >>> import re
    >>> mylist = re.split('\.|-','hello-word.data')(使用.和- 作为字符串的分割符)
    >>> print mylist
    ['hello', 'word', 'data']
sub方法
    把字符串中所有匹配正则表达式的地方替换成新的字符串
    >>> print re.sub('x','mr.smith', 'hi, x.\nNice to meet you x')
    hi, mr.smith.
    Nice to meet you mr.smith
——————————————————————————————————————————————————————
正则表达式
匹配单个字符
    .:匹配任意字符(换行符除外)
    [...x-y...]:匹配字符组里的任意字符
    [^...x-y...]:匹配不在字符组里的任意字符
    \d:匹配任意数字
    \w:匹配任意数字 字母 字符
    \s:匹配空白字符与[\r\v\f\t\n]同义
匹配一组字符
    literal:匹配字符串的值
    re1|re2:匹配正则表达式re1或re2
    *:匹配前面出现的正则表达式零次或多次
    +:匹配前面出现的正则表达式一次或多次
    ?:匹配前面出现的正则表达式零次或一次
    {M,N}:匹配前面出现的正则表达式至少M次最多N次
其他元字符
    ^:匹配字符串的开始
    $:匹配字符串的结尾
    \b:匹配单词的边界
    ():对正则表达式分组
    \nn:匹配已保存的子组
贪婪匹配
    * , + 和?都是贪婪匹配操作符,在其后加上?可以取消其贪婪匹配行为
    正则表达式匹配对象通过groups函数获取子组
    >>> data = 'you phone number is: 1520029989'
    >>> m = re.search('.+(\d)', data)
    >>> m.group()
    'you phone number is: 1520029989'
实例:编写一个apache日志分析脚本
     #!/usr/bin/env python
import re
def count_patt(fname,patt):
         cpatt = re._compile(patt)
         result = {}
         with open(fname) as fobj:
             for line in fobj:
                 m = cpatt.search(line)
                 if m:
                     key = m.group()
                     result[key] = result.get(key,0) + 1
         return result
     if __name__ == '__main__':
         http_log = '/var/log/httpd/access_log'
         ip_addr = '(\d+\.){3}\d+'
         br_patt = 'Firefox|MSIE'
         print count_patt(http_log,ip_addr)
         print count_patt(http_log,br_patt) 
——————————————————————————————————————————————————————————————————
多线程
  在多线程(MT)编程出现之前,电脑程序的运行由一个执行序列组成执行序列在主机的中央处理器中运行
  无论是任务本身要求顺序执行还算整个程序是由多个子任务组成,程序都是按照这种方式执行的
  即使子任务相互独立,无相无关时也是这样
  如果运行这些相互独立的子任务可以大幅度地提升整个任务的效率
  他们本质就是异步的,需要有多个并发事物
  各个事物的运行顺序可以是不确定的,随机的
  这样的编程任务可以被分成多个执行流,每个流都有一个要完成的目标
  根据应用的不同,这些子任务可能要计算出一个中间结果,用于合并得到最后的结果
  线程一般是并发执行的,正是由于这种并行和数据共享机制使得多个任务的合作变为可能
  需要注意的是,在单个cpu的系统中,真正的并发是不可能的
  每个线程会被安排成每次之运行一小会,然后就把cpu让出来,让其他线程去运行
  
多线程编程
  thread和threading模块允许程序员创建和管理线程
  thread模块提供了基本的线程和锁的支持,而threading提供了更高级别,功能更强的线程管理功能
  推荐使用更高级别的threading模块
实例:编写多线程扫描192.168.4.0网段的存活主机
#!/usr/bin/env python
import subprocess
    import threading
def ping(host):
        result = subprocess.call(
            "ping -x2 %s &> /dev/null" % host, shell=True
      
        )
        if result == 0:
            print "%:up" % host
        else:
            print "%s:down" % host
    if __name__ == '__main__':
        ips = ['192.168.4.%s' %i for i in range(1,255)]
        for ip in ips:
            t = threading.Thread(target=ping,args=[ip])
            t.start()
————————————————————————————————————————————————————————————————
paramiko模块
安装paramiko模块(安装后重启pycharm)
      [root@room1pc01 ~]# yum -y install gcc gcc-c++ python-paramiko
实例:编写多线程链接多主机执行命令
#!/usr/bin/env python
import sys
import paramiko
import os
import getpass
import threading
def remote_comm(host,pwd,comm):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    ssh.connect(host,username='root',password=pwd)
    stdin, stdout, sterr = ssh.exec_command(comm)
    out = stdout.read()
    err = sterr.read()
    if out:
        print "[%s]out:\n%s" % (host, out)
    if err:
        print "[%s]error:\n%s" % (host, err)
    ssh.close()
if __name__ == '__main__':
    if len(sys.argv) !=3:
        print "usage: %s ipfile 'command'" % sys.argv[0]
        sys.exit(1)
    if  not os.path.isfile(sys.argv[1]):
        print "no such file:", sys.argv[1]
        sys.exit(2)
        
    ipfile = sys.argv[1]
    comm = sys.argv[2]
    passwd = getpass.getpass("passwoed: ")
    
    with open(sys.argv[1]) as fobj:
        for line in fobj:
            ip = line.strip()
            t = threading.Thread(
                target=remote_comm,args=(ip, passwd, comm)
            )
            t.start()
[root@room1pc01 ~]# python ssh.py ipaddr.txt ls/root/(执行脚本 ip地址池 执行的命令)
python 常见错误和异常 函数 正则表达式及多线程编程的更多相关文章
- python常见错误和异常
		1.BaseExeception 所有异常的基类 2.SystemEixt 解释器请求退出 3.KeyboardInterrupt 用户中断执行 4.Exception 常规错误的基类 5.StopI ... 
- python的错误和异常
		python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ... 
- Python 常见文件操作的函数示例(转)
		转自:http://www.cnblogs.com/txw1958/archive/2012/03/08/2385540.html # -*-coding:utf8 -*- ''''' Python常 ... 
- Python常见文件操作的函数示例
		# -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname() ... 
- python 常见的内置函数
		内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这 ... 
- python之错误和异常
		错误 分为语法错误和逻辑错误,如下: 语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器编译. 逻辑错误可能是由于不完整或是不合法的输入所致,或者是无法生成.计算.或是输出结果需要的过程无法 ... 
- python常见错误
		最近刚刚接触Python,为了养成好习惯,遇到了诸多的问题,林林总总,在这里简单记录下: 编写简单的python语句时: module level import not at top of file ... 
- 【python+selenium学习】Python常见错误之:IndentationError: unexpected indent
		初入python+selenium学习之路,总会遇到这样那样的问题.IndentationError: unexpected indent,这个坑我已经踏进数次了,索性记录下来.都知道Python对代 ... 
- python常见错误总结
		TypeError: 'module' object is not callable 模块未正确导入,层级关系没找对 缩进错误. IndentationError: unindent does not ... 
随机推荐
- MySql-5.7.17-20解压缩版安装配置
			MySql-5.7.XXX解压缩版安装配置 1.mysql-5.7.20是解压版免安装的,版本下载地址:http://dev.mysql.com/downloads/mysql/ 如下图 2.解压 ... 
- 如何更改图片的背景色(PS、证件照之星)
			如何更改图片的背景色(PS.证件照之星) 1.1 证照之星教你如何给证件照换背景 证照之星教你如何给证件照换背景?这个问题困扰很多人,如果你不了解证照之星,一款专业的证件照片制作软件,你肯定就无法自 ... 
- 策略模式(Strategy Method)
			策略模式可以看做“可插入式算法(Pluggable)”,将子类各自的行为和公共的逻辑分离开来,将子类的行为抽象为算法插入到公共的逻辑中,这样替换子类的行为也不会对公共逻辑产生影响,也不会影响到调用类的 ... 
- POJ 2125 Destroying The Graph [最小割 打印方案]
			Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 2 ... 
- Java获得系统的外网IP
			关于如何获得系统外网IP?在网上找了好久,大多数解决方案都没法直接用,所以今天和大家分享一段获得外网IP的代码! import java.net.Inet4Address; import java.n ... 
- C语言实现数据结构中的堆创建,堆排序
			#include "stdio.h"#include "stdlib.h"void swap(int *a,int *b)//交换两个数{int t;t=*a; ... 
- SqlServer循环  和   批量倒数据
			SqlServer循环语句 declare @i int set @i =1 while(@i<5) begin set @i = @i+1 insert into text(id,name ... 
- SDN第四次作业
			作业链接 1.阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控 ... 
- Xcode的SVN提示"The request timed out."的解决方案
			问题描述 在利用Xcode的SourceControl进行SVN代码检出时,确认输入地址.帐号密码都正确的情况下,总是提示"The request timed out.".该问题的 ... 
- 似懂非懂的Comparable与Comparator
			jdk1.8.0_41 一知半解写代码, 集合排序用个啥. 抄起键盘胡乱打, 似懂非懂最可怕. Comparable与Comparator都是用于集合的排序,对于大多数人来说Comparator可能略 ... 
