show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次 我们
- 编写了 一个 加法运算程序
-
输入单个变量没有问题
- 但是 输入两个变量之后
- 一相加 就非常离谱
-
这次我们完善了代码
- 对用户可能出现的录入错误
- 做了异常处理
- 整个程序运行正常
- 对用户可能出现的录入错误
-
可以把这程序
拆分
成- 输入 和 输出
两个
部分吗?
- 这是/home/shiyanlou/fruit.py
try:
a = input("How many apples do you have?\n")
a = int(a)
print("You got " + str(a) + " apples!")
b = input("How many bananas do you have?\n")
b = int(b)
print("You got " + str(b) + " bananas!")
total = a + b
print("You got " + str(total) + " fruits!")
except ValueError:
print("\33[41merror\33[0m",end="")
print("your input is invalid!")
quit()
- 可以把这程序拆分成两个部分吗?
- 然后用import的方式导入模块?🤔
-
想要把原来的fruit.py
- 拆成 两个py文件
-
input.py
- 负责输入 两个数字
- 分别是
- 苹果的数量
- 香蕉的数量
-
output.py
- 负责计算水果总量
- 并输出最终水果总数
-
input.py 和 output.py
- 这两个名字 可以吗??
- 要先避免重名的问题
- 先跳到游乐场去观察一下
-
看起来没有默认的input和output模块
- 不怕模块被重名了
-
但是 input 在哪里见过呢?
- input好像是输入函数的名字
a = input("How many apples do you have?\n")
- input应该不能被用作模块的名字
- 一旦被重新赋值
- 就没法作为函数使用了
- 为了避免问题
- 输入模块名修改为 1.py
- 可以吗?
- 1.py
- 作为文件名
- 编辑运行 都没有问题
- 但是 做为 模块名
- 无法导入
- 为什么呢?
- 回忆 标识符 命名规则
- 第一个字符 应该是 大小写字母或下划线
- The first letter of an identifier should be either a letter or an underscore
- 合法的标识符 可以包括 大小写字母、数字、下划线
- A valid identifier can have letters(both uppercase and lowercase letters),digits and underscores.
-
最终的两个程序名为
- 输入模块 get_fruits.py
- 输出模块 output.py
-
而且要放进同一个文件中
- pwd
- print working directory
- 输出当前工作路径
- mkdir fruits
- 新建文件夹test
- cd fruits
- 进入fruits文件夹
- 准备编辑
- 注意此时fruit.py 在 上一层目录中
- 同时编辑两个文件
- get_fruits.py
- output.py
vi get_fruits.py output.py
- 进入vim
- :ls
- ls 列出了 vim当前的两个缓存文件
- get_fruits.py
- output.py
- 读取 原始 程序
:r ../fruit.py
- ../fruit.py 就是
- 上一层目录下的fruit.py
- 进行删改后得到get_fruits.py
try:
a = input("How many apples do you have?\n")
a = int(a)
print("You got " + str(a) + " apples!")
b = input("How many bananas do you have?\n")
b = int(b)
print("You got " + str(b) + " bananas!")
except ValueError:
print("\33[41merror\33[0m",end="")
print("your input is invalid!")
quit()
- 此文件 可以单独运行没有问题
- 查看所有缓存
- :ls
- 切换到第二个缓存文件
- :b2
- 切换到output.py
- 将代码修改为
- 如上图所示
- 尝试 运行 当前缓存文件 output.py
- :w|!python3 %
- 最后的运行结果
- 成功!!!
- 真的 自制了 一个输入模块!
- 并且 导入也成功了!!
- 这里面的get_fruits应该如何理解呢?
import get_fruits
print(get_fruits)
- 最后的结果
- get_fruits算是个module
- 这 module 里面都有些什么呢?
import get_fruits
print(get_fruits)
print(dir(get_fruits))
- dir 的意思是 directory
- 本来指的是 目录
- 现在用来列出 模块中的 变量和函数
- 除了 get_fruits 还有什么呢?
import get_fruits
print(get_fruits)
print(dir(get_fruits))
print(locals())
- locals
- 查看本地所有的
- 模块
- 函数
- 变量
- 查看本地所有的
-
可以把 get_fruits模块中的a、b
- 导入到 output.py 吗?
-
把后面注释掉
- 尝试 输入 错误数字
- 修改output.py
from get_fruits import a,b
total = str(a + b)
print("You have " + total + " fruits")
- 运行结果
- 为什么 要把 一个完整的 程序
- 拆成 两个模块 呢?
- get_fruits.py作为 被导入的模块
- 后期可以 计算水果总量
- 后期也可以 比较 哪种水果多
- 后期还可以 计算 水果总量 差值
- 代码 可以
- 在 不同的模块之间 复用
- 以前 还用过什么
- 可复用的 代码 吗?
- 很多函数 我们一直在复用
- input
- ord
- chr
- 很多模块 我们也一直在复用
- time
- math
- random
__hello__
- 可以感觉到 python 的可扩展性
- 从 各种自定义的 python 模块
- 到 python底层的 各种函数
- 因为 python 代码复用这么容易
- 所以 才有 打 人民战争的基础
- 如今 我们 也写了自己的 python模块
- 这两个py文件
- get_fruits.py
- output.py
- 这两个py文件
- 他们之间是什么关系呢?
- 总共两个python文件
- output.py 是主模块
- 用来导入输入模块
- get_fruits.py
- 是被引用的模块
- output.py 是主模块
- 运行output.py主模块的时候
- 导入了 被引用的get_fruits.py
- 先录入
- 然后输出
- 导入了 被引用的get_fruits.py
- 如何理解 导入 呢?
- 英文
- import 导入
- export 导出
- 词根port 本意为港口
- 这次把 fruit.py 拆分成了
- 输入模块 get_fruits.py
- 主模块 output.py
- 引用模块中变量的时候
- from 模块(module)的名字空间(namespace)
- import 了 a和b
- from 模块(module)的名字空间(namespace)
- 最终
- 拆分代码 成功!
- 拆成
- 输入模块
- 输出模块
- 可以将程序
再拆分
吗?- 拆成 主控、输入、输出三部分
- 可以吗?🤔
- 下次再说👋🏻