百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

彻底搞懂Python 中的 import 与 from import

off999 2024-11-26 07:19 38 浏览 0 评论

对不少 Python 初学者来说,Python 导入其他模块的方式让他们很难理解。什么时候用import xxx?什么时候用from xxx import yyy?什么时候用from xxx.yyy import zzz?什么时候用from xxx import *

这篇文章,我们来彻底搞懂这个问题。



系统自带的模块

以正则表达式模块为例,我们经常这样写代码:

import re

target = 'abc1234xyz'
re.search('(\d+)', target)

但有时候,你可能会看到某些人这样写代码:

from re import search
target = 'abc1234xyz'
search('(\d+)', target)

那么这两种导入方式有什么区别呢?

我们分别使用type函数来看看他们的类型:

>>> import re
>>> type(re)
<class 'module'>
>>> from re import search
>>> type(search)
<class 'function'>

如下图所示:

可以看到,直接使用import re导入的re它是一个module类,也就是模块。我们把它成为正则表达式模块。而当我们from re import search时,这个search是一个function类,我们称呼它为search 函数

一个模块里面可以包含多个函数。

如果在你的代码里面,你已经确定只使用search函数,不会再使用正则表达式里面的其他函数了,那么你使用两种方法都可以,没什么区别。

但是,如果你要使用正则表达式下面的多个函数,或者是一些常量,那么用第一种方案会更加简洁清晰。

例如:

import re

re.search('c(.*?)x', flags=re.S)
re.sub('[a-zA-Z0-9]', '***', target, flags=re.I)

在这个例子中,你分别使用了re.searchre.subre.Sre.I。后两者是常量,用于忽略换行符和大小写。

但是,如果你使用from re import search, sub, S, I来写代码,那么代码就会变成这样:

import re

search('c(.*?)x', flags=S)
sub('[a-zA-Z0-9]', '***', target, flags=I)

看起来虽然简洁了,但是,一旦你的代码行数多了以后,你很容易忘记SI这两个变量是什么东西。

而且我们自己定义的函数,也很有可能取名为sub或者search,从而覆盖正则表达式模块下面的这两个同名函数。这就会导致很多难以觉察的潜在 bug。

再举一个例子。Python 的 datetime模块,我们可以直接import datetime,此时我们导入的是一个datetime模块,如下图所示:

但是如果你写为from datetime import datetime,那么你导入的datetime是一个type类:

因为这种方式导入的datetime,它就是Python 中的一种类型,用于表示包含日期和时间的数据。

这两种导入方式导入的datetime,虽然名字一样,但是他们的意义完全不一样,请大家观察下面两种写法:

import datetime

now = datetime.datetime.now()
one_hour_ago = now - datetime.timedelta(hours=1)
from datetime import datetime, timedelta
now = datetime.now()
one_hour_ago = now - timedelta(hours=1)

第二种写法看似简单,但实则改动起来却更为麻烦。例如我还需要增加一个变量today用于记录今日的日期。

对于第一段代码,我们只需要增加一行即可:

today = datetime.date.today()

但对于第二行来说,我们需要首先修改导入部分的代码:

from datetime import datetime, timedelta, date

然后才能改代码:today = date.today()

这样一来你就要修改两个地方,反倒增加了负担。



第三方库

在使用某些第三方库的代码里面,我们会看到类似这样的写法:

 from lxml.html import fromstring
 
 selector = fromstring(HTML)

但是我们还可以写为:

from lxml import html

selector = html.fromstring(HTML)

但是,下面这种写法会导致报错:

import lxml
selector = lxml.html.fromstring(HTML)

那么这里的lxml.html又是什么东西呢?

这种情况常见于一些特别大型的第三方库中,这种库能处理多种类型的数据。

例如lxml它既能处理xml的数据,又能处理html的数据,于是这种库会划分子模块,lxml.html模块专门负责html相关的数据。



自己来实现多种导入方法

我们现在自己来写代码,实现这多种导入方法。

我们创建一个文件夹DocParser,在里面分别创建两个文件main.pyutil.py,他们的内容如下:

util.py文件:

def write():
    print('write 函数被调用!')

main.py文件:

import util

util.write()

运行效果如下图所示:

现在我们把main.py的导入方式修改一下:

from util import write

write()

依然正常运行,如下图所示

当两个文件在同一个文件夹下面,并且该文件夹里面没有__init__.py 文件时,两种导入方式等价。

现在,我们来创建一个文件夹microsoft,里面再添加一个文件parse.py

def read():
    print('我是 microsoft 文件夹下面的 parse.py 中的 read函数')

如下图所示:

此时我们在 main.py中对它进行调用:

from microsoft import parse

parse.read()

运行效果如下图所示:

我们也可以用另一种方法:

from microsoft.parse import read

read()

运行效果如下图所示:

但是,你不能直接导入microsoft,如下图所示:

你只能导入一个模块或者导入一个函数或者类,你不能导入一个文件夹

无论你使用的是import xxx还是from xxx.yyy.zzz.www import qqq,你导入进来的东西,要不就是一个模块(对应到.py 文件的文件名),或者是某个.py 文件中的函数名、类名、变量名。

无论是import xxx还是from xxx import yyy,你导入进来的都不能是一个文件夹的名字。

可能有这样一种情况,就是某个函数名与文件的名字相同,例如:

microsoft文件夹里面有一个microsoft.py文件,这个文件里面有一个函数叫做microsoft,那么你的代码可以写为:

from microsoft import microsoft`
microsoft.microsoft()

但请注意分辨,这里你导入的还是模块,只不过microsoft.py文件名与它所在的文件夹名恰好相同而已。



总结

无论是使用import还是from import,第一个要求是代码能够正常运行,其次,根据代码维护性,团队编码风格来确定选择哪一种方案。

如果我们只会使用到某个模块下面的一个函数(或者常量、类)并且名字不会产生混淆,可识别性高,那么from 模块名 import 函数名这没有什么问题。

如果我们会用到一个模块下面的多个函数,或者是我们将要使用的函数名、常量名、类名可能会让人产生混淆(例如 re.S、re.I),那么这种情况下,import 模块名然后再 模块名.xxx来调用会让代码更加清晰,更好维护。

但无论什么情况下,都禁止使用from xxx import *这种写法,它会给你带来无穷无尽的噩梦。

原文链接:

https://mp.weixin.qq.com/s/tEN1gLPi5PZVAnt0zbrj2Q

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: