Python 基础学习笔记二(不断完善)

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:从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
  • s.readlines([sizehint]):参数sizehint为int类型,缺省状态为读取所有行并作为列表返回,除此之外从当前读写位置读取至下一个以“\n”为结束符的当前行。读写位置被移动。
  • 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. 为1时将读写位置从当前位置起向前或向后移动|pos|个长度,

  2. 为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 用逗号(,)代替。

 

 

posted @ 2021-03-09 20:38  huansky  阅读(167)  评论(0编辑  收藏  举报