【Python】Java程序员学习Python(六)— 流程控制、异常处理
和Java语言一样,Python也有基本的流程控制,简单了解下即可。
一、流程控制的元素
条件
条件就是布尔值或者布尔值的表达式,要么是True要么是False。
代码块
在Python中,代码块不是用大括号引起来的,而是靠统一的缩进来表示,相同的缩进代表相同的代码块。
二、分支语句
判断流程的关键字是if/else/elif,if的简单的示例如下,注意冒号的使用以及缩进的使用:
def hello(name):
if(name=='yiwangzhibujian'):
print('hello',name) hello('yiwangzhibujian')
=======控制台输出=======
hello yiwangzhibujian
if/else的示例:
def hello(name):
if(name=='laizhezhikezhui'):
print('i miss you')
else:
print('hello',name)
hello('yiwangzhibujian')
hello('laizhezhikezhui')
========控制台输出========
hello yiwangzhibujian
i miss you
if/else/elif的示例:
def grade(result):
if(result>80):
print('A')
elif(result>60):
print('B')
else:
print('C')
grade(61)
========控制台输出========
B
分支语句还是比较简单的,看看就会了。
二、循环
循环语句稍微复杂一点,但是看看也会了。
2.1 for循环
for循环是最基本的循环方式,Python中一般两种用法,第一种是循环指定的次数,这时候就需要range()区间了,示例如下:
for i in range(0,3):
print(i)
========控制台输出========
0
1
2
其实这种模式可以应用于所有可以能遍历的元素上,例如list、tuple、range、str、dict、set等等
for i in (1,2,3):
print(i)
基本用法必须掌握。
2.2 while 循环
while循环用法和Java一样,掌握书写规范即可:
num=3
while num>0:
print(num)
num-=1
========控制台输出========
3
2
1
看一眼基本就会了。
2.3 break和continue
只要是支持循环的语言,这两个关键字都会支持的,用法和其他语言一样。
三、猜字游戏
练习分支语法的一个最经典程序就是猜字游戏,随机生成一个0-99的数字,给用户5次机会猜,猜对了恭喜,5次机会用完了没猜对就说运气不好。随机数需要引入random模块,就像Java的Random类一个性质,示例如下:
import random
num=random.randint(0, 99)
编写代码完成要求,下面给出一个简单的例子:
import random
result=random.randint(0, 99)
time=5
print('现在玩一个猜字游戏!')
while time>0:
num=int(input('请输入你猜的数字?'))
if(num==result):
print('恭喜你答对了')
break
else:
if num>result:
print('猜大了,请再猜一次')
else:
print('猜小了,请再猜一次')
time-=1
if time==0:
print('运气太不好了,没猜对,答案是',result)
这个程序写完了,流程语法就没有问题了。
四、异常处理
4.1 异常基本语法
异常基本语法如下:
try:
<statements>
except Exception1 as e:
<statements>
except (Exception2,Exception3) as e:
<statements>
except Exception4:
<statements>
except:
<statements>
else:
<statements>
finally:
<statements>
简单介绍:
- try:后面的代码块为假定可能出现异常的代码
- except:为要捕获的异常
- else:为当try的语句块没有异常发生时,执行的代码,但try最后的语句为return就不执行
- finally:不管是否发生异常都会执行的的代码,即便前面有return语句,依然会执行
- 可以捕获一个异常,也可捕获多个异常,多个异常放在一个tuple中
- 可以有选择的将异常赋值给一个变量,用于后续处理
- except语句不指定异常时,捕获所有,和except BaseException:等价,Exception为所以异常的父类
注意它们的使用顺序,try->except->else->finally
4.2 异常堆栈的打印
捕获异常后如果直接使用print()只会打印简略信息,可以引用logging模块来打印。
import logging
try:
1/0
except Exception as e:
logging.exception(e)
还有其他写法,后续补上。
4.3 抛出异常
抛出异常分为两种,一种时主动抛出,另一种是捕获后再次抛出,主动抛出使用关键字raise关键字:
try:
raise Exception
except Exception as e:
logging.exception(e)
另外一种捕获后抛出,直接在捕获语句中使用raise即可:
try:
raise Exception
except Exception as e:
raise
强烈建议:请深思当前异常是否能够处理,若不能处理请抛出
4.4 自动关闭资源
很多时候我们都是在finally里面来关闭资源,避免出现异常导致资源没有被关闭,除了这种做法还可以使用with as来
with open('path') as file:
<statements>
这样在语句执行完后会自动关闭资源,强烈建议使用此种方式。
4.5 异常层次
可以了解基本的异常,这样报错后能大概知道出了什么错:
BaseException:异常基类
+-- SystemExit:由 sys.exit() 函数引发此异常
+-- KeyboardInterrupt:当用户按下中断键(通常是 Delete 或 Control-C)时引发。执行期间,会定期检查中断
+-- GeneratorExit:在generator或coroutine关闭时触发
+-- Exception:所有内建的、非系统退出的异常,都是从该类派生的。此外,应该从该类派生所有用户定义的异常
+-- StopIteration:由内建函数next()和iterator的__next__()方法引发
+-- StopAsyncIteration:必须通过asynchronous iterator对象的__anext__()方法提高以停止迭代
+-- ArithmeticError:各种算术错误引发的内建异常的基类
| +-- FloatingPointError:当浮点数操作失败时引发。
| +-- OverflowError:当要表示算术运算的结果太大时引发。
| +-- ZeroDivisionError:当除法或取模运算的第 2 个参数为 0 时引发
+-- AssertionError:当 assert 语句失败时引发。
+-- AttributeError:当属性引用(参见 Attribute references)或赋值失败时引发。
+-- BufferError:当 buffer 相关的操作无法执行时引发。
+-- EOFError:在input()函数未读取任何数据时遇到文件结束条件(EOF)时触发。
+-- ImportError:在import语句未能找到模块定义或从 ... import 无法找到要导入的名称。
+-- ModuleNotFoundError:模块找不到时发生的异常
+-- LookupError:当用于映射或序列的键或索引无效时引发的异常的基类
| +-- IndexError:当序列下标超出取值范围时引发。
| +-- KeyError:当在现有键的集合中找不到映射的(字典)键时引发。
+-- MemoryError:当一个操作将内存耗尽,但情况仍可挽救时(通过删除某些对象)时引发
+-- NameError:当找不到本地或全局名称时引发。这仅适用于不合格的名称。关联值是一条错误消息,其中包括找不到的名称。
| +-- UnboundLocalError:当引用函数或方法局部变量,但变量没有绑定值时引发。
+-- OSError:当系统函数返回与系统相关的错误(包括I / O故障,例如“未找到文件”或“磁盘已满”(不适用于非法参数类型或其他偶发错误))时会引发此异常
| +-- BlockingIOError:在操作会阻止对象时触发。套接字设置为非阻塞操作。对应于errno EAGAIN,EALREADY,EWOULDBLOCK和EINPROGRESS。
| +-- ChildProcessError:在子进程上的操作失败时引发。对应于errno ECHILD。
| +-- ConnectionError:连接相关问题的基类。
| | +-- BrokenPipeError:在尝试在管道上写入时引发,而另一端已关闭,或试图在已关闭写入的套接字上写入。对应于errno EPIPE和ESHUTDOWN。
| | +-- ConnectionAbortedError:连接尝试被对等体中止时引发的ConnectionError的子类。对应于errno ECONNABORTED。
| | +-- ConnectionRefusedError:连接尝试被对等体拒绝时引发的ConnectionError的子类。对应于errno ECONNREFUSED。
| | +-- ConnectionResetError:当连接被对等体重置时引发的ConnectionError的子类。对应于errno ECONNRESET。
| +-- FileExistsError:在尝试创建已存在的文件或目录时引发。对应于errno EEXIST。
| +-- FileNotFoundError:在请求文件或目录但不存在时引发。对应于errno ENOENT。
| +-- InterruptedError:在系统调用由传入信号中断时引发。对应于errno EINTR。
| +-- IsADirectoryError:在目录上请求文件操作(例如os.remove())时引发。对应于errno EISDIR。
| +-- NotADirectoryError:在对不是目录的某个目录请求目录操作(例如os.listdir())时引发。对应于errno ENOTDIR。
| +-- PermissionError:在尝试运行没有足够访问权限的操作(例如文件系统权限)时引发。对应于errno EACCES和EPERM。
| +-- ProcessLookupError:在给定进程不存在时引发。对应于errno ESRCH。
| +-- TimeoutError:在系统级别的系统函数超时时触发。对应于errno ETIMEDOUT
+-- ReferenceError:当用一个由 weakref.proxy() 函数创建的弱引用代理,去访问引用者的属性,而该引用者已经被垃圾回收时,会引发此异常
+-- RuntimeError:当检出错误不属于任何其它类别时引发。
| +-- NotImplementedError:此异常是从 RuntimeError 派生的。当用户定义基类需要派生类重写方法时,抽象方法会引发该异常。
| +-- RecursionError:此异常是从 RuntimeError 派生的。当解释器检测到超出最大递归深度
+-- SyntaxError:当解析器遇到语法错误时引发。这可能发生在import语句中,在调用内建函数exec()或eval()脚本或标准输入(也是交互式)
| +-- IndentationError:与不正确的缩进相关的语法错误的基类
| +-- TabError:当缩进中包含对制表符和空格的混用时引发
+-- SystemError:当解释器发现内部错误,但情况并没有看起来那么严重,不至于到要放弃所有希望的地步
+-- TypeError:当操作或函数应用于不合适类型的对象时引发。关联值是字符串,它提供有关类型不匹配的详细信息。
+-- ValueError:当内建操作或函数,接收到类型正确,但值不正确的参数,而且这种情况不能用诸如 IndexError 这样的更精确的异常进行描述时引发。
| +-- UnicodeError:当有关 Unicode 编码或解码错误出现时引发。
| +-- UnicodeDecodeError:当解码过程中出现的一个 Unicode 相关的错误时引发。
| +-- UnicodeEncodeError:当编码过程中出现的一个 Unicode 相关的错误时引发。
| +-- UnicodeTranslateError:当翻译过程中出现的一个 Unicode 相关的错误时引发。
+-- Warning:警告类别基类
+-- DeprecationWarning:弃用特性警告基类
+-- PendingDeprecationWarning:将来会被弃用特性的警告基类
+-- RuntimeWarning:可疑 Runtime 行为警告基类
+-- SyntaxWarning:有关可疑语法的警告的基类
+-- UserWarning:用户代码生成警告基类
+-- FutureWarning:将来会改变语义结构的警告基类
+-- ImportWarning:可能弄错模块导入警告基类
+-- UnicodeWarning:Unicode 相关的警告基类
+-- BytesWarning:与bytes和bytearray相关的警告的基类
+-- ResourceWarning:与资源使用相关的警告的基类
【Python】Java程序员学习Python(六)— 流程控制、异常处理的更多相关文章
- 【Python】Java程序员学习Python(五)— 函数的定义和使用
不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...
- 【Python】Java程序员学习Python(二)— 开发环境搭建
巧妇难为无米之炊,我最爱的还是鸡蛋羹,因为我和鸡蛋羹有段不能说的秘密. 不管学啥,都要有环境,对于程序员来说搭建个开发环境应该不是什么难题.按顺序一步步来就可以,我也只是记录我的安装过程,你也可以滴. ...
- 【Python】Java程序员学习Python(三)— 基础入门
一闪一闪亮晶晶,满天都是小星星,挂在天上放光明,好像许多小眼睛.不要问我为什么喜欢这首歌,我不会告诉你是因为有人用口琴吹给我听. 一.Python学习文档与资料 一般来说文档的资料总是最权威,最全面的 ...
- 【Python】Java程序员学习Python(十)— 类、包和模块
我觉得学习到现在应该得掌握Python的OOP编程了,但是现在还没有应用到,先留一个坑. 一.类和对象 说到类和对象其实就是在说面向对象编程,学完Java以后我觉得面向对象编程还是很不错的,首先封装了 ...
- 【Python】Java程序员学习Python(七)— 文本类详解(字符串、str)
如果一个女孩子喜欢看龙猫,那么请珍惜她,呵护她 任何一门语言,字符串总是最基本也是最需要掌握的一个变量,想想入门的Hello World,输出的就是字符串. 官方文档:https://docs.pyt ...
- 【Python】Java程序员学习Python(一)— 为什么学习Python
现在是6月份,毕业快3年了,虽然不能说对Java掌握的程度达到了如火纯青的地步,但是依然感觉到了瓶颈期,Java用的多了,也到了随心所欲的地步了,所以学第二门语言的想法一直在我脑海里闪现,有想法了就要 ...
- 【Python】Java程序员学习Python(四)— 内置方法和内置变量
<假如爱有天意> 当天边那颗星出现,你可知我又开始想念,有多少爱恋只能遥遥相望,就像月光洒向海面,年少的我们曾以为,相爱的人就能到永远,当我们相信情到深处在一起,听不见风中的叹息,谁知道爱 ...
- 【Python】Java程序员学习Python(十一)— IO
一.前言 io的内容其实还是有很多的,现在我也只是了解初步用法,当然详细内容还是应该参照官方api的: 官方api:https://docs.python.org/3/library/os.html. ...
- 【Python】Java程序员学习Python(九)— 集合(list、tuple、range)和映射(dict)
集合是一门语言最重要的一个特性,对集合支持的程度越好,使用起来越方便 一.表现形式 1.1 list list的基本用法: 使用中括号包裹,[1,2,3] 元素类型可以是任意类型,同样可以是list ...
随机推荐
- javac后期需要重点阅读的类
(1)Annotate (300行) Enter annotations on symbols. Annotations accumulate in a queue,which is processe ...
- visual studio 2008 快捷键
Ctrl+m+Crtr+o折叠所有大纲Ctrl+M+Crtr+P: 停止大纲显示Ctrl+K+Crtr+C: 注释选定内容Ctrl+K+Crtr+U: 取消选定注释内容Ctrl+J : 列出成员 智能 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- Qt5试用
1.头文件<QtGui>变成了<QtWidgets> 相应<QtGui/***>变成了<QtWidgets/***> 2.QTextCodec::set ...
- tomcat在eclipse创建过程分析
在本地eclipse上创建一个tomcat server 即tomcat服务器时, 会复制一份tomca安装目录中的conf文件下的配置文件到这个tomcat server目录下 这个tomcat s ...
- 将已有Git库代码推送到新建库中
cd /path/to/your/git/repo/ git remote -v git remote rm origin git remote add origin ssh://abc@gmail. ...
- sublime text 2+sublimeClang
sublimeClang 是github上面的开源项目,可用于C/C++的自动补全 github:https://github.com/quarnster/SublimeClang 配置sublime ...
- Linux多线程 - 基本操作
0. 线程 vs 进程 何为线程?线程即轻量级进程,如何理解轻量级这个概念? 我们知道,Linux的资源分为用户空间资源和内核空间资源: 用户空间资源:用来存放用户自定义的一些数据,用户可直接控制: ...
- hadoop学习笔记(七):Java HDFS API
一.使用HDFS FileSystem详解 HDFS依赖的第三方包: hadoop 1.x版本: commons-configuration-1.6.jar commons-lang-2.4.jar ...
- 如何获取div距离浏览器顶部的高度,宽度,内容
JS就可以获取了, document.getElementById("DIV的ID或者其它选择").offsetTop;这是离顶部 JQ可以这样: $("#aaa&quo ...
- C#关于操作符重载与转换
随便写写 首先,假设我们有一个Person类型 其类型定义如下 class Person { public string Name { get; set; } = "Person" ...