QQ登录

只需一步,快速开始

开启左侧

Python学习第七十七天—模块和包(上)

[复制链接]
15271953841 发表于 2024-5-1 10:04:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 15271953841 于 2024-5-5 07:43 编辑

模块和包(上)

模块是一种打包的手段,代码的打包手段,当一些代码在程序中重复出现的时候,就会导致冗杂的局面出现的情况,我们这个时候就会毫不犹豫地将打包成函数的形式,这样只需通过调用函数,就可以实现代码的重复使用,这是我们学到的第一种打包的手段——就是函数。
后来我们又学习了类的对象,发现从另一个思路来解决代码打包的问题,类和对象来源于对现实世界的模拟,运用类和对象的打包思路,任何事物都可以被看作属性和方法有机的结合,属性决定了对象的静态特征,方法实现了对象的动态能力,不得不说,这就是一个天才般的设计,所以,面向对象编程也是当前编程思想中的中流砥柱,包括Python的自身构件也不例外,它也是面向对象的,Ok,但是类还不是最高级别的打包方案,我们说,打包是为了重用,类你再厉害,也是在一个程序里面被重复实例化为多个对象而已;比类还厉害的打包方案是模块,模块这个老流可厉害了,它使得一个或多个源代码文件可以被其它程序所重复使用,这就上升了一个等级,其实,模块是Python中最高级别的组织结构,也是最高层次的代码重用手段,正是由于模块的加持才早就今天的Python武林霸主的辉煌。
大家知道:为什么Python会成为顶流的编程语言吗?仅仅是因为它的简洁的语法,和近乎强迫症的编程风格,是,这并不是它最吸引人的地方,Python最迷人的特性是可以支持你高效率的开发,使用Python开发程序的思维习惯就是,程序要做什么事,实现什么功能,我们第一步要考虑的是实现这些功能都要用到哪些模块的组合,因为,实现各种功能的第三方模块PyPI上面都有,不要重复造轮子,讲得是这些基础功能,前人早已实现了,不要我们再来重复,我们应该将更多的精力放到执行逻辑上面去,所以用Python的开发思维就简单多了,编程爬虫要用到哪个模块?(老板要求抓取今天的股票数据,并保存到excel中,就此编写一个程序)我们要抓取数据要用到爬虫,读写excel要用到哪个模块,我们只需要考虑到这两个,再找到对应模块的开发文档,顺藤摸瓜几分钟的活完事,这就是Python的魅力。
模块从一开始我们都在使用,之前我们在生成随机数的时候,导入的那个random,就是一个模块,然后我们也一直在创造模块,当我们使用编辑模式,然后去创建一个Python源代码文件的时候,我们就同时创建了一个程序模块了。
我们先来创建一个Hello模块。
首先先新建一个文本文件,把名字改成hello.py,这样我们就创建了一个hello的源文件,那么其实它就是一个模块,用IDLE(右键选择)把它打开,给它编写一下,随便编写两个函数:
def say_hello():
    print("Hello Little sister.")

def say_hi():
print("Hi Little sister.")
保存
再用同样的方法创建另一个源文件,叫做call_hello.py,我们在这个源文件中去调用刚刚hello.py这个模块创建的两个函数,首先我们做的第一件事就是将上一个源文件导入:
import hello

hello.say_hi()
hello.say_hello()
点击保存,再点击运行,程序跑起来,互动模式下查看:
=================== RESTART: D:/谷兴武/创客/python学习/call_hello.py ==================
Hi Little sister.
Hello Little sister.

在Python中,通常导入模块有三种方案:
第一种:import   模块名称
第二种:from 模块名称 import 对象名称
第三种:import 模块名称 as 关联名称

刚刚使用的第一种方案,import + 模块名称,使用这种方案导入,我们在调用模块中的对象的时候,要使用【模块名称.对象名称()】的形式进行访问。
第二种方案是:直接从模块导入所需的对象,它的语法是“from 模块名称 import 对象名称”,下面演示一下,同样是用IDLE打开这个call_hello.py,修改为:
from hello import say_hi,say_hello

say_hi()
say_hello()        (第二种方案是整个对象导入,所以可以直接去调用整个对象的名称,前面不需要加模块名称和点“.”)
保存后,点击运行,在互动模式下查看:得到一样的执行结果:
=================== RESTART: D:/谷兴武/创客/python学习/call_hello.py ==================
Hi Little sister.
Hello Little sister.
这种方法,如果导入的函数比较多,一种不推荐的作法是:直接使用“*”号,代替说我要导入这个模块的里面所有的这个对象 from hello import *
保存后,点击运行,在互动模式下查看:得到上面一样的执行结果:略。
那采用第二种方案这种“from+模块名称+import+对象名称”的优势,就是调用的时候不需要再写模块名称了,但大家一定要注意:命名冲突的问题。比如说:
我们要导入的模块里面有一个叫做int()函数,我们改一下这个叫hello.py的模块:
def say_hello():
    print("Hello Little sister.")

def say_hi():
    print("Hi Little sister.")

def int(x):
    print(f"哈哈{x}")
保存,然后在到call_hello.py,去调用它
from hello import *

say_hi()
say_hello()
int("250")        (调用它,将250这个字符串给传递进去,正常人都知道,我们是想让“250”这个字符串变成250这个整数。)
保存后,运行,它的执行结果是:
互动模式下查看:
=================== RESTART: D:/谷兴武/创客/python学习/call_hello.py ==================
Hi Little sister.
Hello Little sister.
哈哈250            (就是名字覆盖了,内置函数int被我们自定义的int给覆盖了)
起名的时候,不要跟Python的内置函数或者关键字同名,这是编写代码的一个基本底线,还有一种情况:两个模块之间拥有相同的名字的对象,然后很巧两个模块都使用“from 模块名称 import 对象名称”,这种方案形式导入,那么问题就来了,比如再创建一个文件:hello_from_the_other_side.py,内容是:
  def say_hello():
    print("你好呀~")

def say_hi():
print("嗨呀~")
保存一下,
然后再到call_hello.py,编写:
from hello import *
from hello_from_the_other_side import *

say_hi()
say_hello()
int("250")
保存,点击run,运行,查看互动模式的运行结果:变成了:
=================== RESTART: D:/谷兴武/创客/python学习/call_hello.py ==================
嗨呀~
你好呀~
哈哈250
不难发现,较迟导入的模块中的方法将覆盖较早导入的模块中的方法,所以使用“from + 模块名称 + import +对象名称”这种方案,一定要注意名字冲突的问题。

第三种方案是当模块名字比较长的时候,就可以使用as关键字,给模块名字关联一个新的名称,例如上面hello_from_the_other_side.py模块被调用时,可以改写成(在call_hello.py里面改):
from hello import *
import hello_from_the_other_side as h

h.say_hi()
h.say_hello()
int("250")
保存,运行,结果跟上面是一样的。
那怕把两个模块的导入顺序改变,也不影响结果:
import hello_from_the_other_side as h
from hello import *

h.say_hi()
h.say_hello()            (不影响结果是因为对象名称前面加了简化的模块名称h和点“.”)
int("250")

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:襄阳市樊城区长虹路现代城5号楼188

创客帮MAKER.BAND青少年创客创意社区是一个融教育、科技、体育资讯为一体的综合服务平台,专注于教育创新、专注于科技体育、专注于教育资讯。

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表