python中的import详解,python中import和from import的区别
摄影:产品经理
国王的第一套乐高玩具
对于很多Python初学者来说,Python导入其他模块的方式让他们很难理解。什么时候用进口xxx?什么时候用从xxx进口yyy?什么时候用从xxx.yyy导入zzz?何时使用从xxx导入*?
在这篇文章中,让我们彻底了解这个问题。
系统自带的模块以正则表达式模块为例。我们经常这样写代码:
import retarget= ABC 1234 XYZ re . search((\ d),target)但是有时候,你可能会看到有些人这样写代码:
From导入搜索target= abc1234xyz search ((\ d),target)那么这两种导入方式有什么区别呢?
我们使用type函数来分别查看它们的类型:
从导入搜索类型(搜索)类函数导入类型(重)类模块如下图所示:
如你所见,通过使用import re直接导入re是一个模块类,也就是一个模块。我们称之为正则表达式模块。而当我们从re导入搜索时,这个搜索是一个函数类,我们称之为搜索函数。
一个模块可以包含多个函数。
如果在您的代码中,您已经确定在正则表达式中只使用搜索函数而不使用其他函数,那么您可以使用这两种方法。没有区别。
但是如果要在正则表达式下使用多个函数,或者一些常量,使用第一种方案会更简洁明了。
例如:
import rere.search(c(。*?)x ,flags=re。s)re([a-za-z0-9], * * ,target,flags=re。I)在本例中,您分别使用了re.search、re.sub、re.s和re.i。后两个是常量,用于忽略换行符和大小写。
但是,如果您使用from re import search,sub,S,I来编写代码,那么代码将看起来像这样:
导入研究( c(。*?)x ,flags=s) sub ([A-ZA-Z0-9], * * ,target,flags=i)看起来很简洁,但是一旦代码行多了,就很容易忘记S和I这两个变量是什么了。而且我们自己定义的函数也很可能命名为sub或者search,这样就把正则表达式模块下面同名的两个函数都覆盖了。这将导致许多难以检测的潜在错误。
再举个例子。Python的datetime模块,我们可以直接导入datetime。此时,我们导入一个datetime模块,如下图所示:
但是,如果将它编写为from datetime import datetime,则导入的datetime是一个类型类:
因为以这种方式导入的datetime是Python中的一种类型,用于表示包含日期和时间的数据。
两种导入方法导入的Datetime名称相同,但含义完全不同。请遵守以下两种写法:
从datetime导入datetime now=datetime . datetime . now()one _ hour _ ago=now-datetime . time delta(hours=1)从datetime导入datetime,time delta ow=datetime . now()one _ hour _ ago=now-time delta(hours=1)第二种写法看似简单,其实改起来比较麻烦。例如,我需要添加一个变量today来记录今天的日期。
对于第一段代码,我们只需要添加一行代码:
Today=datetime.date.today()但是对于第二行,我们需要首先修改导入部分的代码:
从日期时间导入日期时间、时间增量、日期,然后才能更改代码:today=date.today()
这样你就要修改两个地方,增加负担。
第三方库在使用一些第三方库的代码中。我们会看到这样的情况:
Lxml.html从字符串选择器导入=从字符串(HTML)但是我们也可以把它写成:
fromlxml导入html selector=html . from string(html)但是,下面的写法会导致错误:
import lxml selector=lxml . html . from string(html)那么这里的lxml.html是什么呢?
这种情况常见于一些特别大的第三方库,可以处理各种类型的数据。比如lxml既可以处理xml数据,也可以处理html数据,所以这个库分为子模块,lxml.html模块负责html相关的数据。
自行实施各种进口方式。现在我们编写自己的代码来实现这些不同的导入方法。
让我们创建一个文件夹DocParser,并在其中分别创建两个文件main.py和util.py。它们的内容如下:
Util.py文件:
Write (): print(调用了Write函数!)main.py文件:
importutil.write()的运行效果如下图所示:
现在让我们修改main.py的导入方法:
from util import writewrite()仍然正常运行,如下图所示。
当两个文件在同一个文件夹下,并且没有__init__。py文件,这两种导入方法是等效的。
“现在,让我们创建一个文件夹microsoft,并向其中添加另一个文件parse.py:
Def (): print(我是微软文件夹下parse.py中的read函数)如下图所示:
此时,我们在main.py中调用它:
Microsoft import parse.read()的运行效果如下图所示:
我们还可以使用另一种方法:
微软的运行效果。ParseImport ReadRead()如下图所示:
但是不能直接导入微软,如下图所示:
你只能导入一个模块或者一个函数或者类,你不能导入一个文件夹。
“不管是用import xxx还是fromxxx.yyy.zzz.www ImportQQ,导入的要么是模块(对应文件名为。py文件)或. py文件中的函数名、类名或变量名。
无论是导入xxx还是从XXX导入yyy,都不能导入文件夹的名称。
可能会出现函数名与文件名相同的情况,例如:
microsoft文件夹里有一个microsoft.py文件,这个文件里有一个叫microsoft的函数,所以你的代码可以写成:
从Microsoft导入Microsoft` Microsoft。Microsoft()但是请注意区分,这里你是导入模块,但是microsoft.py的文件名和它所在的文件夹名一模一样。
总结不管是使用import还是从import,第一个要求就是代码能正常运行。其次,根据代码可维护性和团队编码风格,确定选择哪种方案。
如果我们在某个模块下只用一个函数(或者常量或者类),名字不会混淆,识别度高,那么from模块名导入函数名就没有问题。
如果我们将在一个模块下使用多个函数,或者我们将使用的函数名、常量名和类名可能会引起混淆(例如,re。s,re。I),那么在这种情况下,导入模块名,然后调用模块名。xxx会让代码更清晰,更好维护。
但无论如何,禁止使用来自xxx import *的写法,会给你带来无尽的噩梦。
在明天的文章中,我们将讨论另一种写作方式。导入xxx,以及__init__时导入方法如何变化。文件夹中存在py。
最近:推荐墙裂!哔哩哔哩上的Python学习资源
短短三步,带你在Python改头换面
好玩!我甚至可以用Python做一个文字娃娃。
短短三步,带你在Python改头换面
一个用Python代码写的游戏,我可以这样玩一天!
让你穿越GitHub的五大神器
学Python还是Java,7幅漫画带你全面分析。
微信官方账号【程序员GitHub】,由Python新手学习者原班人马打造,专注于分享GitHub上的有趣资源,包括Python、Java、Go语言前端学习等优质学习资源,程序员圈新趣事爆料,热门干货,职场感悟。感兴趣的朋友可以来加入我们!
程序员GitHub
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。