PythonBasic_14_bj

<< python简介、环境搭建、基础语法 >>
python

day13回顾
模块
os.py

sys模块
sys.path

自定义模块
查找路径
1. 当前路径
2. sys.path
3. 内建模块

# imp.reload(已加载模块名)
.pyc 是 .py的编译文件

模块的内建属性
doc #
name # 主要用来判断当前模块是否是主模块
file

模块的文档字符串

模块的 __all__列表
from xxx import *

模块的隐藏属性
以 _ 开头的属性为隐藏属性
隐藏属性在from xxx import *时不会被导入


init.py

包的导入用import 语句

import 包名
import 包名.模块名
...

day14笔记
包的 init.py 内的 all 列表
作用:
用来记录此包中有哪些子包或模块在用from 包 import *
语句导入时是否被调导入

说明:
__all__列表只对 from import *语句起作用

tree mypack
.
└── mypack
├── games
│   ├── contra.py
│   ├── init.py
│   ├── supermario.py
│   └── tanks.py
├── init.py
├── menu.py
└── office
├── excel.py
├── init.py
└── word.py
01_test_mypack_all_list.py
02_relative_import.py

示例见:
code/mypack/games/init.py
# mypack/games/init.py

__all__ = ['contra', 'tanks']

print("mypack.games子包被加载")

# 01_test_mypack_all_list.py

from mypack.games import *

包的相对导入
包的相对导入是指包内模块的相互导入

语法:
from 相对路径包或模块 import 属性或模块名

from 相对路径包或模块 import *

相对路径:
. 代表当前目录
… 代表上一级目录
… 代表上二级目录
… 以此类推
注: 相对导入时不能超出包的外部
示例见:
mypack/games/contra.py
# mypack/games/contra.py

def play():
    print("正在玩contra")

print('contra 模块被加载')

def gameover():
    # 用绝对路径导入
    # from mypack.menu import show_menu
    # 用相对导入
    from ..menu import show_menu
    show_menu()

    # 绝对导入
    # from mypack.games.tanks import play
    # 相对导入
    # from .tanks import play
    from ..games.tanks import play

    # from ...mypack.games.tanks import play 出错...超出了包的外部
    play()

# code/02_relative_import.py

# 此示例测试contra模块相对导入menu模块
# 此主模块在 code下
import mypack.games.contra as contra

contra.gameover()

.
├── games
│   ├── contra.py
│   ├── init.py
│   ├── pycache
│   │   ├── contra.cpython-35.pyc
│   │   ├── init.cpython-35.pyc
│   │   └── tanks.cpython-35.pyc
│   ├── supermario.py
│   └── tanks.py
├── init.py
├── menu.py
├── office
│   ├── excel.py
│   ├── init.py
│   └── word.py
└── pycache
├── init.cpython-35.pyc
└── menu.cpython-35.pyc

包的加载路径:
同模块的加载路径相同
1. 当前文件夹
2. sys.path给出的路径

day14笔记
异常 exception

什么是错误
错误是指由于逻辑或语法等导致一个程序无法正常执行的问题

特点:
有些错误是无法预知的

什么是异常
异常是程序出错时标识的一种状态
当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态

异常的作用:
1. 通知上层调用者有错误产生需要处理
2. 用作信号

try语句的两种语法
try-except语句
try-finally语句

try-except语句
语法:
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
异常处理语句1
except 错误类型2 [as 变量2]:
异常处理语句2
except (错误类型3, 错误类型4, …) [as 变量3]:
异常处理语句3

except:
异常处理语句other
else:
末发生异常时执行的语句
finally:
最终执行语句
作用:
偿试捕获异常(接收异常通知),将程序转为正常状态并继续执行

语法说明:
as 子句是用于绑定错误对象的变量,可以省略不写
except子句可以有一个或多个,但至少要有一个
else子句最多只能有一个,也可以省略不写
finally子句最多只能有一个,也可以省略不写

示例见:

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

以下是调用者

print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)

03_try_except.py

03_try_except.py

此示例示意try-except语句的用法

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

以下是调用者

我try-except语句来捕获并处理 ValueError类型的错误

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except ValueError:
print(‘div_apple内出现了ValueError错误,已处理’)
print(‘用户输入不合法,苹果退回来不分了’)
except ZeroDivisionError:
print(‘出现被零除的错误!,苹果不分了’)

print(“程序正常退出”)

04_try_except2.py

04_try_except2.py

此示例示意try-except语句的用法

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

以下是调用者

我try-except语句来捕获并处理 ValueError类型的错误

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except (ValueError, ZeroDivisionError):
print(‘苹果退回来不分了’)

print(“程序正常退出”)

05_try_except_as.py

05_try_except_as.py

此示例示意try-except语句中 as 的用法

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

以下是调用者

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except ValueError as err:
print(‘苹果退回来不分了’)
print(‘错误信息是:’, err)

print(“程序正常退出”)

06_try_except.py

06_try_except.py

此示例示意try-except语句的用法

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

以下是调用者

我try-except语句来捕获并处理 ValueError类型的错误

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except ValueError:
print(‘div_apple内出现了ValueError错误,已处理’)
print(‘用户输入不合法,苹果退回来不分了’)
except:
print(“除ValueError类型的错误外,其它错误都可以被捕获”)

print(“程序正常退出”)

07_try_except_else.py

07_try_except_else.py

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except:
print(“错误已被捕获!”)
else:
print(“程序正常,没有进入过异常状态!”)

print(“程序正常退出”)

08_try_except_finally.py

08_try_except_finally.py

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except ValueError:
print(“值错误,已处理”)
finally:
print(“我是finally子句,我一定会执行的!”)

print(“程序正常退出”)

09_try_except.py

09_try_except.py

def div_apple(n):
print(’%d个苹果您想分给几个人?’ % n)
s = input('请输入人数: ')
try:
cnt = int(s) # <<= 可能触发ValueError错误异常
# 以下一行可能触发ZeroDivisionError错误异常
result = n / cnt
print(“每人个分了”, result, ‘个苹果’)
except ZeroDivisionError:
print(“被零除错误!”)

try:
print(“开始分苹果”)
div_apple(10)
print(“分苹果完成”)
except ValueError:
print(“值错误,已处理”)
else:
print(“此try语句没有进入异常状态”)
finally:
print(“我是finally子句,我一定会执行的!”)

print(“程序正常退出”)

Python全部的异常类型
错误类型 说明
ZeroDivisionError 除(或取模)零 (所有数据类型)
ValueError 传入无效的参数
AssertionError 断言语句失败
StopIteration 迭代器没有更多的值
IndexError 序列中没有此索引(index)
IndentationError 缩进错误
OSError 输入/输出操作失败
ImportError 导入模块/对象失败
NameError 未声明/初始化对象 (没有属性)
AttributeError 对象没有这个属性
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
GeneratorExit 生成器(generator)发生异常来通知退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
OSError 操作系统错误
WindowsError 系统调用失败
LookupError 无效数据查询的基类
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误

以下为警告类型	
Warning	              警告的基类
DeprecationWarning	  关于被弃用的特征的警告
FutureWarning	      关于构造将来语义会有改变的警告
OverflowWarning	      旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning	关于特性将会被废弃的警告
RuntimeWarning	      可疑的运行时行为(runtime behavior)的警告
SyntaxWarning	      可疑的语法的警告
UserWarning	          用户代码生成的警告

练习:
与一个函数 get_score() 来获取学生的成绩(0~100), 如果输入出现异常,则此函数返回0,否则返回用户输入的成绩
def get_score():

score = get_score()
print(“学生的成绩是:”, score)

# 01_get_score.py
def get_score():
    s = int(input("请输入成绩: "))
    if 0 <= s <= 100:
        return s  # 把用户的正确输入返回回去
    return 0


try:
    score = get_score()
except:
    score = 0
print("学生的成绩是:", score)

# 01_get_score2.py
def get_score():
    try:
        s = int(input("请输入成绩: "))
    except ValueError:
        return 0

    if 0 <= s <= 100:
        return s  # 把用户的正确输入返回回去
    return 0


score = get_score()
print("学生的成绩是:", score)

try-finally语句
语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
finally 子句不可以省略
一定不存在except子句
作用:
通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行
注:
try-finally语句不会改变程序的(正常/异常)状态

示例:
10_try_finally.py
# 10_try_finally.py

# 以煎蛋为例, 
  # 1. 打开天燃
  # 2. 煎蛋
  # 3. 关闭天燃气

def fry_egg():
    print("打开天燃气点燃...")
    try:
        count = int(input("请输入鸡蛋个数:"))
        print("煎蛋完成,共煎了%d个鸡蛋" % count)
    finally:
        print("关闭天燃气")

try:
    fry_egg()
except:
    print("程序已转为正常状态!")

问题:
try-except 语句干什么用?
请问错误通知是谁发出的?怎么发出?

raise 语句
作用:
触发一个错误,让程序进入异常状态
语法:
raise 异常类型

raise 异常对象
示例见:
11_raise.py
# 11_raise.py

# 此示例示意用raise语句来发出异常通知
# 供try-except语句来捕获

def make_except():
    print("开始...")
    # raise ZeroDivisionError  # 手动发生一个错误通知
    e = ZeroDivisionError("被零除啦!!!!!")
    raise e  # 触发e绑定的错误,进入异常状态
    print("结束")

try:
    make_except()
    print("make_except调用完毕!")
except ZeroDivisionError as err:
    print('出现了被零除的错误,已处理并转为正常状态!')
    print('err 绑定的对象是:', err)

12_raise_get_age.py
# 12_raise_get_age.py

# 此示例示意用raise发出错误通知给调用者
# 甲写了函数 get_age
def get_age():
    a = int(input("请输入年龄(0~140): "))
    if 0 <= a <= 140:
        return a
    if a > 140:
        raise OverflowError("人的年龄不可能大于140")

# 乙用户调用get_age()
try:
    age = get_age()
except ValueError as err:
    print("用户输入的不是数字.已做出相应的处理")
    age = 0
except OverflowError as err:
    print("用户输入的年龄过大")
    age = 0

print("得到的年龄是:", age)

assert 语句(断言语句)
语法:
assert 真值表达式, 错误数据(通常是字符串)
作用:
当真值表达式为False时,用错误数据创建一个 AssertionError 类型的错误,并进入异常状态
类似于:
if 真值表达式 == False:
raise AssertionError(错误数据)
示例见:
13_assert.py
# 13_assert.py

# 此示例示意assert语句 的用法
def get_age():
    a = int(input("请输入年龄: "))
    # 以下语句会在a不在 [0,140]时触发AssertionError错误
    assert 0 <= a <= 140, '年龄不在合法的范围内'
    return a

try:
    age = get_age()
except AssertionError as e:
    print("错误原因是:", e)
    age = 0
print("年龄是:", age)

小结:
接收错误消息:
try-except
做必须要处理的事情的语句:
try-finally
发错误消息的语句:
raise 语句
assert 语句

为什么要用异常处理机制
在程序调用层数较深时,向主调函数传递错误信息需要用return语句层层传递比较麻烦,所以用异常处理机制

说明示例:
# 以建房子为例
见:
14_built_house.py
# 14_built_house.py

# 此示例以建房子为例说明在什么情况下使用异常处理机制
def f1():
    print("开始建给房子打地基")
    # return ValueError("地下出现文物")
    print('地基建完')
    return 0

def f2():
    print('开始建地面以上部分')
    return ValueError("地上要修高压线")
    print('高楼建完')
    return 0


def f3():
    r = f1()
    if r != 0:
        return r
    r = f2()
    if r != 0:
        return r

def built_house():
    r = f3()
    if r != 0:
        return r

r = built_house()  # 开始建房子
if r == 0:
    print("房子建完了")
else:
    print("房子没建完", r)

15_built_house.py
# 15_built_house.py

# 此示例以建房子为例说明在什么情况下使用异常处理机制
def f1():
    print("开始建给房子打地基")
    # raise ValueError("地下出现文物")
    print('地基建完')

def f2():
    print('开始建地面以上部分')
    raise ValueError("地上要修高压线")
    print('高楼建完')


def f3():
    f1()
    f2()

def built_house():
    f3()

try:
    built_house()  # 开始建房子
except ValueError as err:
    print("房子没建完", err)
else:
    print("房子建完了")

# r = built_house()  # 开始建房子
# if r == 0:
#     print("房子建完了")
# else:
#     print("房子没建完", r)

练习:
1. 一个球100米高空落下,每次落下后反弹高度是原高度的一半,再落下,
写程序
1) 算出皮球在第10次落地后反弹高度是多少,
2) 打印出球共经过了多少米的路程

# 01_ball.py
def ball(height, times):
    """根据给定的原始高度,和次数,返回最终反弹的高度"""
    for _ in range(times):
        height = height / 2  # height /= 2
    return height

def ball_distance(height, times):
    s = 0  # 用来累加所有路程
    for _ in range(times):
        s += height  # 把下落过程累加到s
        height /= 2
        s += height  # 把返弹高度累到加s
    return s

print("球从100高度返弹10次后的高度是:", ball(100, 10))
print("球从100米高度反弹10次后的经历的路程是",
       ball_distance(100, 10))


2. 分解质因数,输入一个正整数,分解质因数:
 如:
   输入: 90
   打印:
       90=2*3*3*5
(质因数是指最小能被原数整数的素数(不包括1))

02_zhiyinshu.py

def is_prime(x):
‘’‘判断 x是否为素数’’’
if x <= 1:
return False
for i in range(2, x):
if x % i == 0:
return False
return True

def get_prime_list(n):
‘’‘此函数根据给定一个整数,返回此整数所有因数的列表’’’
# 如何用n求出所有的因数
L = [] # 用来存放所有因数(素数)
# 如果n不是素数,我们就拆出因数出来
while not is_prime(n):
# 把n拆出来一个素数因数,然后继续循环
# 找n的一个因数:
for x in range(2, n):
if is_prime(x) and n % x == 0:
# x一定是n的因数
L.append(x)
n /= x # 下次再求n的因数
n = int(n) # 转为整数
break
else:
L.append(n)
return L

if name == ‘main’:
n = int(input("请输入整数: "))
print(get_prime_list(n))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值