python with语句能不能把后面的"as <file>"删掉?

家里有在这个IT圈子里面,也想让我接触这个圈子,然后给我建议学的Python,
然后自己通过百度和向有学过Python的同学了解了Python,Python这门语言,入门比较简单,
它简单易学,生态圈比较强大,涉及的地方比较多,特别是在人工智能,和数据分析这方面。在未来我觉得是往自动化,
人工智能这方面发展的,所以学习了Python

2:通过什么途径学习Python

刚开始接触Python的时候,到网上里面跟着视频学基础,再后来网上到看技术贴,然后看到有人推荐廖雪峰的Python教程,
练项目到GitHub上面找一些小项目学习。

3:谈谈对Python和其他语言的区别

Python属于解释型语言,当程序运行时,是一行一行的解释,并运行,所以调式代码很方便,开发效率高,
还有龟叔给Python定位是任其自由发展、优雅、明确、简单,所以在每个领域都有建树,所有它有着非常强大的第三方库,
特点:
语法简洁优美,功能强大,标准库与第三方库都非常强大,而且应用领域也非常广
可移植性,可扩展性,可嵌入性
缺点:
  运行速度慢,
- 解释型





 (1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)

(2)与php相比:python标准包直接提供了工具,并且相对于PHP代码更易于维护;

  对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.
  对于速度:Python的运行速度相较与C,绝逼是慢了

2、用少量的代码构建出很多功能;(高效的高级数据结构)

3、Python 拥有最成熟的程序包资源库之一;

4、Python完全支持面向对象;

5、Python 是跨平台且开源的。

4:简述解释型和编译型编程语言

解释型:就是边解释边执行(Python,php)
编译型:编译后再执行(c、java、c#)

5:Python的解释器种类以及相关特点?

是官方版本的解释器:CPython。是使用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。
CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

由Python写的解释器,它的执行速度是最快。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),
绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。

  Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

1字节 = 8 位
位(bit),数据存储是以“字节”(Byte)为单位,数据传输是以大多是以“位”(bit,又名“比特”)为单位,
一个位就代表一个0或1(即一个二进制),二进制是构成存储器的最小单位,每8个位(bit,简写为b)组成一个字节(Byte,简写为B),
字节是最小一级的信息单位
1、使用4个空格而不是tab键进行缩进。
2、每行长度不能超过79
3、使用空行来间隔函数和类,以及函数内部的大块代码
4、必要时候,在每一行下写注释
5、使用文档注释,写出函数注释
6、在操作符和逗号之后使用空格,但是不要在括号内部使用
7、命名类和函数的时候使用一致的方式,比如使用CamelCase来命名类,
8、在类中总是使用self来作为默认
 9、尽量不要使用魔法方法
10、默认使用UTF-8,甚至ASCII作为编码方式
11、换行可以使用反斜杠,最好使用圆括号。
12、不要在一句import中多个库,
空格的使用
  1. 各种右括号前不要加空格。
  2. 逗号、冒号、分号前不要加空格。
  3. 函数的左括号前不要加空格。如Func(1)
  4. 序列的左括号前不要加空格。如list[2]
  5. 操作符左右各加一个空格,不要为了对齐增加空格
  6. 函数默认参数使用的赋值符左右省略空格
  7. 不要将多句语句写在同一行,尽管使用‘;’允许
  8. if/for/while语句中,即使执行语句只有一句,也必须另起一行
 函数命名使用全部小写的方式,常量命名使用大写,类属性(方法和变量)使用小写
类的命名首字母大写

9:通过代码实现如下转换(进制之间转换)

# 八进制转换成十进制 # 十六进制转换成十进制:

10:请编写一个函数实现将IP地址转换成一个整数

请编写一个函数实现将IP地址转换成一个整数。
如 "
      new_)。 域名解析就是将域名,转换为ip地址的这样一种行为。

修改后用浏览器访问“”会被解析到'; 特别的:当or条件中有未建立索引的列才失效,以下会走索引

- 问题:版本都可以放在那里? - 权限是否可以放在中间件中?以及为什么? 匿名用户可以真正的防止?无法做到真正的访问频率控制,只能把小白拒之门外。 如果要封IP,使用防火墙来做。 登录用户可以通过用户名作为唯一标示进行控制,如果有人注册很多账号,则无法防止。

如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?

为了预防消息丢失,rabbitmq提供了ack
即工作进程在收到消息并处理后,发送ack给rabbitmq,告知rabbitmq这时候可以把该消息从队列中删除了。
如果工作进程挂掉 了,rabbitmq没有收到ack,那么会把该消息 重新分发给其他工作进程。
不需要设置timeout,即使该任务需要很长时间也可以处理。
ack默认是开启的,工作进程显示指定了no_ack=True

RabbitMQ如何对消息做持久化?

1、创建队列和发送消息时将设置durable=Ture,如果在接收到消息还没有存储时,消息也有可能丢失,就必须配置publisher confirm
 

公司线上服务器是什么系统?

解释 PV、UV 的含义?

PV访问量(Page View),即页面访问量,每打开一次页面PV计数+1,刷新页面也是。
UV访问数(Unique Visitor)指独立访客访问数,一台电脑终端为一个访客。
每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
wsgi是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
uwsgi协议是一个'uWSGI服务器'自有的协议,它用于定义传输信息的类型,
 
是一款基于Python的进程管理工具,可以很方便的管理服务器上部署的应用程序。 1 启动、重启、关闭包括但不限于python进程。 2 查看进程的运行状态。 3 批量维护多个进程。
正向代理代理客户端(客户端找哟个代理去访问服务器,服务器不知道你的真实IP)
反向代理代理服务器(服务器找一个代理给你响应,你不知道服务器的真实IP)

简述SSH的整个过程。

SSH 为 'Secure Shell' 的缩写,是建立在应用层基础上的安全协议。
SSH 是目前较可靠,为远程登录会话和其他网络服务提供的安全性协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

有问题都去那些找解决方案?

起初是百度,发现搜到的答案不精准,净广告
转战谷歌,但墙了;捣鼓怎么FQ
 

是否有关注什么技术类的公众号?

python之禅(主要专注Python相关知识,作者:刘志军)
码农翻身(主要是Java的,但不光是java,涵盖面很广,作者:刘欣)
 

最近在研究什么新技术?

pandas(金融量化分析、聚宽)

二进制与十进制之间的转换

1、十进制 与 二进制之间的转换

方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数。
这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:
例:将十进制的168转换为二进制
得出结果 将十进制的168转换为二进制,()2
二进制(从后往前读): 
方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,
剩下的小数部分又乘以2,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,
按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。
换句话说就是0舍1入。读数要从前面的整数读到后面的整数

二进制转换为十进制 (不分整数和小数部分)

方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。

例:将二进制数101.101转换为十进制数。 
在做二进制转换成十进制需要注意的是 
1)要知道二进制每位的权值 
2)要能求出每位的值 101.101 转换为十进制 
 






数据库高并发两个线程同时执行更新语句”> 数据库高并发两个线程同时执行更新语句

昨天我遇到了笔试题,并屈服于自己的食物。遇到过这种\ lt; em \ gt;数据库\ lt;/em> \ lt; em \ gt;并发lt;/em \ gt ;,我以前从未见过。。。仍然需要脚踏实地找到一份好工作。不费吹灰之力,遇到的问题与Internet上的问题类似。因此,我在网上使用了直接提问。


要实现的功能:在列表中选择一行数据,并将其发布到显示器上进行显示,并且每秒执行一次。现在有多行数据,执行\\; em \ gt;并发lt;/em>执行力,如何实现? button_click(){var value = SelectedV

多线程使用同一数据库连接的后果”>探索使用同一数据库连接的多线程的后果
在项目中,我看到了对\ lt有用的连接池; em \ gt;数据库\ lt;/em>,然后我考虑了为什么需要\\ lt00; em \ gt;数据库\ lt;/em>连接池,如果仅使用一个连接会发生什么影响? (仅使用一个连接)

1猜猜:jdbc的事务是基于连接的。如果\\ em>多线程\\/em \共享一个连接,则将导致\\ em之间的事务gt;多线程相互干扰(mit())

2因此,模仿以下字段…


多线程 并发运行数据库和数据库升级多线程 并发 em>操作数据库和数据库升级

如果误删除文件该怎么办
关于计算机应用程序。文档WORD格式。用于计算机初学者,了解和处理计算机的主要问题

Windows游戏编程高手技巧第二版源码下载
Windows游戏编程大师技能第二版源代码Windows游戏编程大师技能第二版源代码Windows游戏编程大师技能第二版源代码Windows游戏编程大师技能第二版源代码Windows游戏编程大师技能第二版源代码

Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。本Python 入门系列体验就是为这样的初学者精心准备的。

  • 变量、运算符与数据类型
    • 利用位运算实现快速计算
    • 利用位运算实现整数集合

二、变量、运算符与数据类型

  • 第一个字符必须是字母表中字母或下划线 _
  • 标识符的其他的部分由字母、数字和下划线组成。

在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。

保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

在Python中,#表示单行注释,实例如下:

多行注释可以使用多个#号或者使用'''和""",实例如下:

这是多行注释,用三个单引号 这是多行注释,用三个单引号 这是多行注释,用三个单引号 这是多行注释,用三个双引号 这是多行注释,用三个双引号 这是多行注释,用三个双引号
得到负数或是两个数相减
两个数相乘,或者是返回一个被重复若干次的字符串
比较两个对象是否不相等
所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。
如果x为False,x and y返回x的值,否则返回y的计算值。
如果x为True,x or y 返回x的值,否则返回y的计算值。
Python中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,则返回第一个假值。 or也是从左到右计算表达式,返回第一个为真的值。 其中数字0是假,其他都是真。 字符""是假,其他都是真。

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

下表中变量 a 为 60,b 为 13二进制格式如下:

参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。
只要对应的两个二进制位有一个为1时,结果位就为1。
当两对应的二进位相异时,结果为1。
对数据的每个二进制位取反,即把1变为0,把0变为1。
运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数

【例子】有关二进制的运算,参见“位运算”部分。

有了这个三元操作符的条件表达式,你可以使用一条语句来完成以上的条件判断和赋值操作。

海象运算符,可在表达式内部为变量赋值。Python3.8版本新增运算符。
#在这个示例中,赋值表达式可以避免调用 len() 两次:

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

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

身份运算符用于比较两个对象的存储单元。

is 是判断两个标识符是不是引用自一个对象
is not 是判断两个标识符是不是引用自不同对象

注:id()函数用于获取对象内存地址。

【例子】比较的两个变量均指向不可变类型。

【例子】比较的两个变量均指向可变类型。

  • is, is not 对比的是两个变量的内存地址
  • ==, != 对比的是两个变量的值
  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
  • 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。
  • 在交互式环境中,编译器会有一个小整数池的概念,会把(-5,256)间的数预先创建好,而当a和b超过这个范围的时候,两个变量就会指向不同的对象了,因此地址也会不一样,比如下例:

以下表格列出了从最高到最低优先级的所有运算符:

按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
乘,除,求余数和取整除
赋值运算符(从右往左结合)
  • 在使用变量之前,需要对其先赋值。
  • 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。

运行下面一段代码看看结果是什么?

Python3中有六个标准的数据类型:

  • 不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)
  • 可变数据(3个):List(列表)、Set(集合)、Dictionary(字典)

【例子】通过print()可以看出a的值,以及类(class)是int。

Python里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。

dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

对它们有个大概印象就可以了,具体怎么用,需要哪些参数 (argument),还需要查文档。看个bit_length()的例子。

【例子】找到一个整数的二进制表示,再返回其长度。

有时候我们想保留浮点型的小数点后n位。可以用decimal包里的Decimal对象和getcontext()方法来实现。

Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的dir(decimal) 来看其属性和方法。

除了直接给变量赋值True和False,还可以用bool(X)来创建变量,其中X可以是

  • 基本类型:整型、浮点型、布尔型
  • 容器类型:字符串、元组、列表、字典和集合

【例子】bool 作用在基本类型变量:X 只要不是整型 0、浮点型 0.0,bool(X) 就是 True,其余就是 False。

【例子】bool 作用在容器类型变量:X 只要不是空的变量,bool(X) 就是 True,其余就是 False。

  • 对于数值变量,0, 0.0 都可认为是空的。
  • 对于容器变量,里面没元素就是空的。

此外,还可以通过isinstance来判断:

  • type()不会认为子类是一种父类类型,不考虑继承关系。
  • isinstance()会认为子类是一种父类类型,考虑继承关系。
  • 转换为复数 complex(x):将x转换到一个复数,实数部分为 x,虚数部分为 0。
  • 转换为复数 complex(x, y):将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。
  • Python不支持复数转换为整数或浮点数。

当你指定一个值时,Number对象就会被创建:

你也可以使用del语句删除一些对象引用。

你可以通过使用del语句删除单个或多个对象,例如:

  • 2、一个变量可以通过赋值指向不同类型的对象。
  • 3、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
  • 4、在混合计算时,Python会把整型转换成为浮点数。
  • print() 方法用于打印输出,最常见的一个函数。

以下是print()函数的语法:

  • 关键字参数objects表示将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出。print()函数可以一次输出多个对象。输出多个对象时,需要用 , 分隔;
  • 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
  • 关键字参数end是输出结束时的字符,默认是换行符\n;
  • 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
  • 关键字参数flush是立即把内容输出到流文件,不作缓存。

【例子】没有参数时,每次输出后都会换行。

【例子】每次输出结束都用end设置的参数&结尾,并没有默认换行。

【例子】item值与'another string'两个值之间用sep设置的参数&分割。由于end参数没有设置,因此默认是输出解释后换行,即end参数的默认值为\n。

二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。

原码:就是其二进制表示(注意,有一位符号位)。

反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。

补码:正数的补码就是原码,负数的补码是反码+1。

符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。

~ 把num的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 ~ 运算中同样会取反。

只有两个对应位都为 1 时才为 1

只要两个对应位中有一个 1 时就为 1

只有两个对应位不同时才为 1

异或操作的性质:满足交换律和结合律

3. 利用位运算实现快速计算

通过 ^ 快速交换两个整数。 通过 ^ 快速交换两个整数。

通过 a & (-a) 快速获取a的最后为 1 位置的整数。

4. 利用位运算实现整数集合

一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。

比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。

注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。

【例子】C#语言输出负数。

是不是很颠覆认知,我们从结果可以看出:

  • Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,巨坑。
  • Python中的整型是补码形式存储的。
  • Python中整型是不限制长度的不会超范围溢出。

所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。

  • if 语句的 expr_true_suite 代码块只有当条件表达式 expression 结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句。
  • 单个 if 语句中的 expression 条件表达式可以通过布尔操作符 and,or和not 实现多重条件判断。
  • Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。

【例子】猜数字v1.0

print("你太了解小姐姐的心思了!") print("哼,猜对也没有奖励!") print("猜错了,小姐姐现在心里想的是666!") print("游戏结束,不玩儿啦!")

if语句支持嵌套,即在一个if语句中嵌入另一个if语句,从而构成不同层次的选择结构。

【例子】Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意else的悬挂问题。

【例子】升级版猜数字v1.1

print("你太了解小姐姐的心思了!") print("哼,猜对也没有奖励!") print("游戏结束,不玩儿啦!")
  • elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。
  • assert这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常。

【例子】在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。

while语句最基本的形式包括一个位于顶部的布尔表达式,一个或多个属于while代码块的缩进语句。

while循环的代码块会一直循环执行,直到布尔表达式的值为布尔假。如果不慎进入无限循环你可以使用 CTRL+C 来中断循环。特别需要注意冒号和缩进。

如果布尔表达式不带有<、>、==、!=、in、not in等运算符,仅仅给出数值之类的条件,也是可以的。当while后写入一个非零整数时,视为真值,执行循环体;写入0时,视为假值,不执行循环体。也可以写入str、list或任何序列,长度非零则视为真值,执行循环体;否则视为假值,不执行循环体。

【例子】猜数字升级版v2.0

print("你太了解小姐姐的心思了!") print("哼,猜对也没有奖励!") print("游戏结束,不玩儿啦!")

【例子】布尔表达式返回0,循环终止。

当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容。需要注意冒号和缩进。

for循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如str、list、tuple等,也可以遍历任何可迭代对象,如dict。

每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。

当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样。

  • 这个BIF(Built-in functions)有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。
  • step=1 表示第三个参数的默认值是1。
  • range 这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列,该序列包含start的值但不包含stop的值。
  • sequence:一个序列、迭代器或其他支持迭代对象。
  • start:下标起始位置。

用 enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 enumerate(A, j) 还可以确定索引起始值为 j。

break语句可以跳出当前所在层的循环。

print("你太了解小姐姐的心思了!") print("哼,猜对也没有奖励!") print("游戏结束,不玩儿啦!")

continue终止本轮循环并开始下一轮循环。

  • continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

pass 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的。

pass是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。

【例子】选择排序v1.0

b=list(set(a)) # 建立新的列表,嵌套的是集合(除去冗余元素并自动排序) c=[] # 建立空列表,用来存放选择排序的数据 我输入的列表元素集合有:1,2,4,5,12,21(已排好序并除去冗余) 其中我依次选择集合中的各个数据,与原来列表的元素相比 如果相等,我就把a集合的相对应的数据存到空列表里

【例子】选择排序v2.0

m=input('输入石头,剪刀,布,输入end结束游戏:')
#外边一层循环控制行数
 #里面一层循环控制每一行中的列数
 
print("你的余额不足,请充值") print("购买后余额不足,请重新输入") print("提示:中奖数据有六位数,每位数为0或者1") n2=input("请猜测中奖数据:(输入的数字为0或1)") input("请问还要继续么?结束请输入no,继续请任意输入字符:")

异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。

  • EOFError:没有内建输入,到达EOF标记
  • IOError:输入/输出操作失败
  • OSError:操作系统产生的异常(例如打开一个不存在的文件)
  • KeyError:字典中查找一个不存在的关键字
  • MemoryError:内存溢出(可通过删除对象释放内存)
  • NameError:尝试访问一个不存在的变量
  • ReferenceError:弱引用试图访问已经垃圾回收了的对象
  • TypeError:不同类型间的无效操作
  • FutureWarning:关于构造将来语义会有改变的警告
  • ImportWarning:用于在导入模块过程中触发的警告
  • BytesWarning:与字节或字节码相关的警告

try 语句按照如下方式工作:

  • 首先,执行try子句(在关键字try和关键字except之间的语句)
  • 如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try - except语句之后的代码。
  • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。

【例子】一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。

最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

不管try子句里面有没有发生异常,finally子句都会执行。

【例子】如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。

如果在try子句执行时没有发生异常,Python将执行else语句后的语句。

如果没有异常执行这块代码

使用except而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。

fh.write("这是一个测试文件,用于测试异常!!")
  • else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误。
  • 使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。

Python 使用raise语句抛出一个指定的异常。

我要回帖

更多关于 python中if else语句 的文章

 

随机推荐