if not的用法
if not (1 > 2): #如果()中的表达式为假 print("hahaha") #1 > 2结果是假,所以执行hahaha else: print("hihihi")
结果:
hahaha
Process finished with exit code 0
test 2
if not 1: #1为真,并不为假,因此不执行hahaha,执行hihihi print("hahaha") else: print("hihihi")
结果:
hihihi
Process finished with exit code 0
python 中非空即为真,空即为假,因此也常用来判断变量是否为空
while(1): data = input() #输入数据 if not data: #如果data为假(即data为空) print("hahaha") else: #如果data不为空 print("hihihi")
结果:
1 hihihi 2 hihihi hahaha
sys.stdin、sys.stdout和sys.stderr用法
sys.stdin是标准化输入的方法
import sys print('Plase input your name: ') name = sys.stdin.readline() print('Hello ', name)
结果:
Plase input your name:
Ming
Hello Ming
python3 中使用 sys.stdin.readline() 可以实现标准输入,其中默认输入的格式是字符串,如果是 int,float 类型则需要强制转换。
sys.stdin 用的较少,一般使用 stdout 和 stderr
sys.stdout 是将标准输出重新定向到指定文件
import sys temp = sys.stdout #将当前默认输出路径保存为temp sys.stdout = open('log', 'a') b = print('haha', file=sys.stdout)
运行代码后打印信息不会在屏幕上显示,而是会写到 log 文件中
sys.stderr 是将标准错误信息重定向输出到错误文件中
import sys temp = sys.stdout #将当前默认输出路径保存为temp sys.stdout = open('errlog', 'a') b = print('haha', file=sys.stdout)
运行代码后错误信息不会在屏幕上显示,会写入到 errlog 文件中
在 linux 中可以不用指定 sys 的 stdout 和 stderr 文件,可以在 linux 运行文件时
python test.py >log 2>errlog
这样打印信息会在 log 文件中,错误信息会展示到 errlog 文件中
其中
-
2: 表示将标准错误信息流,
-
>errlog:表示将结果打印到errlog文件中
StringIO实现内存缓冲区中读写数据
StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以像操作磁盘文件那样来操作StringIO。这篇文章主要介绍了Python StringIO模块,此模块主要用于在内存缓冲区中读写数据。模块中只有一个StringIO类,所以它的可用方法都在类中,此类中的大部分函数都与对文件的操作方法类似。
- s=StringIO.StringIO([buf])
此实例类似于open方法,不同的是它并不会在硬盘中生成文件,而只寄存在缓冲区;可选参数buf是一个str或unicode类型。它将会与其他后续写入的数据存放在一起(注意,若要在初始化数据之后继续写入数据,则在写入数据之前,应先将读写位置移动到结尾,然后再写入,否则,初始化数据会被覆盖掉,因为读写位置默认是0)。
StringIO类中的方法:
- s.read([n]):参数n限定读取长度,int类型;缺省状态为从当前读写位置读取对象s中存储的所有数据。读取结束后,读写位置被移动。
- s.readline([length]):参数length限定读取的结束位置,int类型,缺省状态为None:从当前读写位置读取至下一个以“ ”为结束符的当前行。读写位置被移动。
- s.readlines([sizehint]):参数sizehint为int类型,缺省状态为读取所有行并作为列表返回,除此之外从当前读写位置读取至下一个以“ ”为结束符的当前行。读写位置被移动。
- s.write(s):从读写位置将参数s写入给对象s。参数s为str或unicode类型。读写位置被移动。
- s.writelines(list):从读写位置将list写入给对象s。参数list为一个列表,列表的成员为str或unicode类型。读写位置被移动。
- s.getvalue():此函数没有参数,无论读写位置在哪里,都能够返回对象s中的所有数据。
- s.truncate([size])1》有size参数:无论读写位置在哪里,都从起始位置开始,裁剪size字节的数据;不带size参数,将当前读写位置之前的数据,裁剪下来。
- s.tell():返回当前读写位置。
- s.seek(pos[,mode]):移动当前读写位置至pos处,可选参数mode为0时将读写位置移动至pos处,
-
为1时将读写位置从当前位置起向前或向后移动|pos|个长度,
-
为2时将读写位置置于末尾处再向前或向后移动|pos|个长度;
mode的默认值为0。
- s.close():释放缓冲区,执行此函数后,数据将被释放,也不可再进行操作。
- s.isatty():此函数总是返回0。
- s.flush():刷新内部缓冲区。
实例1:
#coding=UTF-8 import StringIO s = StringIO.StringIO('python') s.seek(0, 2) # 将读写位置移动到结尾 s.write("aaaa") lines = ['xxxxx', 'bbbbbbb'] s.writelines(lines) s.write("ttttttttt") print s.getvalue() #如果使用read方法获取其中的数据,必须通过seek先设置"文件指针"的位置。 s.seek(0, 0) # 使用s.read()来读取所有数据前,应将读写位置移动到开头 print s.read() print s.len
结果:
pythonaaaaxxxxxbbbbbbbttttttttt
pythonaaaaxxxxxbbbbbbbttttttttt
31
使用 enumerate 函数 可以返回下标
例如
for inx, val in enumerate(['uyy', 'dfdf']): print(inx) print(val)
输出结果如下:
0 uyy 1 dfdf
try except异常处理
Python 中,用try except
语句块捕获并处理异常,其基本语法结构如下所示:
try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块2 except [Exception]: 处理其它异常
该格式中,[] 括起来的部分可以使用,也可以省略。其中各部分的含义如下:
-
(Error1, Error2,...) 、(Error3, Error4,...):其中,Error1、Error2、Error3 和 Error4 都是具体的异常类型。显然,一个 except 块可以同时处理多种异常。
-
[as e]:作为可选参数,表示给异常类型起一个别名 e,这样做的好处是方便在 except 块中调用异常类型(后续会用到)。
-
[Exception]:作为可选参数,可以代指程序可能发生的所有异常情况,其通常用在最后一个 except 块。
从try except
的基本语法格式可以看出,try 块有且仅有一个,但 except 代码块可以有多个,且每个 except 块都可以同时处理多种异常。
举个例子:
try: a = int(input("输入被除数:")) b = int(input("输入除数:")) c = a / b print("您输入的两个数相除的结果是:", c ) except (ValueError, ArithmeticError): print("程序发生了数字格式异常、算术异常之一") except : print("未知异常") print("程序继续运行")
程序运行结果为:
输入被除数:a
程序发生了数字格式异常、算术异常之一
程序继续运行
获取特定异常的有关信息
通过前面的学习,我们已经可以捕获程序中可能发生的异常,并对其进行处理。但是,由于一个 except 可以同时处理多个异常,那么我们如何知道当前处理的到底是哪种异常呢?
其实,每种异常类型都提供了如下几个属性和方法,通过调用它们,就可以获取当前处理异常类型的相关信息:
- args:返回异常的错误编号和描述字符串;
- str(e):返回异常信息,但不包括异常信息的类型;
- repr(e):返回较全的异常信息,包括异常信息的类型。
举个例子:
try: 1/0 except Exception as e: # 访问异常的错误编号和详细信息 print(e.args) print(str(e)) print(repr(e))
输出结果为:
('division by zero',) division by zero ZeroDivisionError('division by zero',)
从程序中可以看到,由于 except 可能接收多种异常,因此为了操作方便,可以直接给每一个进入到此 except 块的异常,起一个统一的别名 e。
在 Python 2.x 的早期版本中,除了使用 as e 这个格式,还可以将其中的 as 用逗号(,)代替。