Python的from和import用法

import使一个变量名引用整个模块对象,因此必须通过模块名称来得到该模块的属性,比如我们导入一个数学计算的模块 math:

  import mathprint math.pi #导出圆周率的值>>>3.14159265359

我们导入math模块,在python模块学习中我们会知道,这样做会得到名math的对象,这个模块对象包含了pi这样的常量,以及一些其它的方法。我们如果直接访问 pi,不加math这个前缀会发生什么情况呢?

print piTraceback (most recent call last):File "<pyshell#6>", line 1, in <module>print pi
NameError: name 'pi' is not defined

程序抛出了一个名为“NameError”的错误。这个时候我们可以用from这个方法来实现可以直接用pi这个方法。from会把变量名复制到另一个作用域,所以它就可以直接在脚本中使用复制后的变量名,而不用通过模块,例如:

  from math import piprint pi>>>3.141592653589793

这样我们就可以直接输出 pi的值了,而不会报错,不需要加那个模块名加句号。有的朋友可能感觉还是比较麻烦,有会有更快速、更省事的Python模块导入方法呢?还真有。

from math import *
pi
cos(pi)
>>>3.141592653589793
>>> -1.0

这样就不需要一个一样导入模块内部的方法了,一次性的将所有python 调用函数方法导入,好处是代码看起来非常简洁,但是如果同时导入多个模块,要考虑模块方法名冲突等这些问题,至于怎么样使用,要看你的使用环境 。
from :https://www.iplaypy.com/jinjie/from-import.html

from语句有破坏命名空间的潜质。如果使用from导入变量,变量碰巧和作用域中现有变量重名,变量就会被悄悄的覆盖掉。
使用import语句时就不存在这种问题,因为必须通过模块名才能获取其内容。不过,使用from时,只要你了解并预料到可能发生这种事,在实际情况下这就不是一个大问题了,尤其是当你明确列出导入变量名时(例如,from module import x, y, z)。
另一方面,from module import *形式的确可能破坏命名空间,让变量名难以理解,尤其是在导入一个以上的文件时。

比较务实的建议是:简单的模块一般倾向于使用import,而不是from。多数的from语句是用于明确列举想要的变量,而且限制在每个文件中只用一次from *形式。这样一来,任何无定义的变量名都可以认为是存在于from *所引用的模块内。当你必须使用两个不同模块内定义的相同变量名变量时,才真的必须使用import,这种情况下不能使用from。

二、Python中的模块和包

每个.py文件都是可以认为是一个Python模块,.py文件中可以包含类、方法、变量和常量(Python还没有严格意义上的常量,只是约定大写的变量作为常量),文件内也可以直接写所有的逻辑语句并在加载时从上之下直接执行,这与其他解释型语言是类似的。例如我们选择在文件夹ModuleAndPackage中创建一个文本文件person.py文件即创建了一个简单的Python模块,

Python需要去某些固定的路径下去查找Python模块,上面我们设置在ModuleAndPackage中查找。但是这些路径下也是有目录层次的,Python是如何查找子目录中的模块呢?特别是引用第三方包时,我们也需要知道一定的层次关系。实际上,Python通过目录和文件构建包结构,并且包是层层嵌套的,这样就构成了包内的访问路径。例如我们在ModuleAndPackage文件夹下,创建一个文件夹animal,里面创建一个文本文件pet.py。

那么如何引用pet.py这个模块呢?按照Python的约定,需要在animal文件夹中创建名为__init__.py的空文本文件,以标识animal文件夹是一个包。倘若animal文件夹内还有文件夹作为包,也必须包含__init__.py文件。这样就层层标识了访问的路径。

简答来说,只要Python模块在其执行环境配置的搜索路径中,并且其所在位置是包结构的一部分,那么我们就可以引用该模块。

from:https://www.cnblogs.com/qingspace/archive/2016/03/16/5284480.html
Python中在脚本中引用其他文件函数的方法

在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址。所以如果要在当前脚本引用其他文件,除了将文件放在和脚本同一目录下,还有以下几种方法。

  1. 将文件所在位置添加到sys.path中

通过sys模块的append方法在Python环境中增加搜索路径。

import sys
sys.path.insert(0, '/path/to/application/app/folder')
sys.path.append('/path/to/application/app/folder')#2个都行
import file

./ 当前目录。 …/ 父级目录。 / 根目录。

  1. 在文件目录下新建__init__.py文件然后调用文件

from application.app.folder.file import func_name

init.py文件的作用
该文件的主要作用使初始化Python包。如果目录下面包含了该文件,Python解释器就会将该目录当做一个包,下一步就可以使用import语句在别的.py脚本中引用该目录下的文件。一个标准Python模块的结构如下所示:

  package/__init__.pyfile.pyfile2.pysubpackage/__init__.pysubmodule1.pysubmodule2.py

__init__文件可以为空但可以用来建立对包的需求。一般来说会在该文件中写那些类,函数等需要被导入到包水平,从而可以被方便的引用。__init__文件提前准备包内需要被引用的各个模块中的变量,类似于向外部引用者暴露包内接口。

1、如果file.py文件中有一个File类,在__init__.py文件中啥都没写时引用File类需要这样操作:

from package.file import File

2、如果在__init__.py文件中将file导入包,那就在包水平可以直接引用File类:

# in your __init__.py
from file import File# in your script
from package import File

此外,还需要注意的一点是:如果解释器在__init__.py文件中观察到了__all__变量,那么在运行from package import *时就只会引入__all__变量中列出的那些模块。例如:如果想在上述结构的只引入submodule1模块,那么可以在subpackage/init.py文件中定义__all__ = [‘submodule1’],当引用subpackage时from subpackage import *就只引入了submodule1模块。

from:https://www.cnblogs.com/arkenstone/p/5609063.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有Spring Cloud Config和JHipster的Java微服务

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 如今&#xff0c;使用Java和Spring Boot开发微服务架构非常流行。 它绝对是Java生态系统中最…

pat 乙级 1026 程序运行时间(C++)

题目 要获得一个 C 语言程序的运行时间&#xff0c;常用的方法是调用头文件 time.h&#xff0c;其中提供了 clock() 函数&#xff0c;可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick&#xff0c;即“时钟打点”。同时还有一个常数 CLK_TC…

什么是命名空间 为什么C++需要使用命名空间

引言&#xff1a; 问题&#xff1a;学习过C&#xff0c;然后再学c的人可能会这么问&#xff0c;我#include<iostream>之后&#xff0c;不就是把头文件拉进来了吗&#xff0c;而cin cout等函数不就是iostream.h里面的函数吗&#xff0c;我使用cin cout时&#xff0c;编译器…

pat 乙级 1023 组个最小数(C++)

题目 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字&#xff0c;但必须全部使用。目标是使得最后得到的数尽可能小&#xff08;注意 0 不能做首位&#xff09;。例如&#xff1a;给定两个 0&#xff0c;两个 1&#xff0c;三个 5&#xff0c;一个 8&#xff0c;我们得…

C++谷歌命名规范

1.文件命名规则 文件名全部小写&#xff0c;可以含下划线或连字符&#xff0c;按项目约定命名,且尽量保证文件名明确。比如&#xff1a;cmd_save_player_info_class.cc &#xff0c;my_use_full_class.cc 定义类的文件名一般是成对出现&#xff0c;如&#xff1a;foo_bar.h f…

pat 乙级 1028 人口普查(C++)

题目 某城镇进行人口普查&#xff0c;得到了全体居民的生日。现请你写个程序&#xff0c;找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的&#xff0c;但不一定是合理的——假设已知镇上没有超过 200 岁的老人&#xff0c;而今天是 2014 年 9 月 6 日&#xf…

c++ 为什么要按它们声明的顺序初始化成员变量?

我今天正在写一些代码&#xff0c;并得到一个奇怪的编译错误&#xff0c;这似乎是由初始化成员变量的顺序不同于他们声明的。 class Test {int a;int b;public:Test() : b(1), a(2) {} };int main() {Test test;return 0; } 然后&#xff0c;如果我编译它与-Werror -Wall&…

如何在Java中使用Lombok删除样板安装程序获取器

你好朋友&#xff0c; 一次又一次反对Java的观点之一是&#xff0c;我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码&#xff0c;不必要地增加了 我们代码的长度。 为了解决这个问题&#xff0c;有一个名为Project Lombok的开源项目可以解决这个问题。 通过…

Python 列表list与数组array的区别

1. 列表list与数组array的定义&#xff1a; 列表是由一系列按特定顺序排列的元素组成&#xff0c;可以将任何东西加入列表中&#xff0c;其中的元素之间没有任何关系&#xff1b; Python中的列表(list)用于顺序存储结构。它可以方便、高效的的添加删除元素&#xff0c;并且列…

Dev-C++使用技巧1(亲测)(超详细)(安装过程、修改语言、新建项目、配置C++ 11、开启警告信息和调试信息)

前言 Dev-C是一款内存占用小&#xff0c;支持C/C&#xff0c;支持调试&#xff0c;可以一键编译、运行的IDE&#xff08;集成开发环境&#xff09;。 下载链接&#xff1a;Dev-C - Download 如果上面那个不行或者下载比较慢&#xff0c;可以点链接: Dev-Cpp 提取码: xaby 。 …

python列表各元素修改为int类型

import numpy as np action np.trunc(action).astype(int).tolist() 函数去掉小数&#xff0c;但元素本身并不是整数。&#xff08; 例1. 或者 2. 没有小数&#xff0c;但也不是整数&#xff09; 要保证元素本身是int类型&#xff0c;则使用astype() &#xff08;得到 [ 1 2…

pat 乙级 1029 旧键盘(C++)

题目 旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以及实际被输入的文…

1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

1.0jpa 2.0可以使用JPA 2.0保留枚举&#xff0c;但是没有很好的方法来实现。 使用Enumerated批注&#xff0c;可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式。 但是这两种选择都有一些缺点&#xff0c;我们将在本文的第一部分中进行讨论。 在第二部…

从网络虚拟化,看智能网卡发展史

5G的到来无疑将加速网络虚拟化的进程&#xff0c;在电信领域&#xff0c;网络虚拟化不仅在核心网&#xff0c;也在网络的边缘。但是&#xff0c;仅仅通过软件解决方案不能提供足够的网络可靠性和服务质量&#xff0c;而具有高级可编程功能智能网卡&#xff08;Smart NIC&#x…

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示&#xff0c;字体word有的基本都有&#xff0c;华文楷体、宋体&#xff0c;幼圆之类。西文字体默认字体Consloas就不错&#xff0c;中文的话幼圆、新宋体都挺不错。 幼圆效果&#xff1…

Java恶意序列化背后的历史和动机

与Java的序列化机制有关的问题已广为人知。 有效的Java 1st Edition &#xff08;第10章&#xff09;和有效的Java 2nd Edition &#xff08;第11章&#xff09;的整个最后一章都专门讨论Java的序列化主题。 Effective Java 3rd Edition &#xff08;第12章&#xff09;的最后一…

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问&#xff0c;就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机&#xff0c;无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信&#xff0c;…

pat 乙级 1030 完美数列(C++)

题目 给定一个正整数数列&#xff0c;和正整数 p&#xff0c;设这个数列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;则称这个数列是完美数列。 现在给定参数 p 和一些正整数&#xff0c;请你从中选择尽可能多的数构成一个完美数列。 输入格式&…

hypervisor介绍

hypervisor&#xff1a;一种运行在物理服务器和操作系统之间的中间层软件&#xff0c;可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统&#xff0c;可以协调访问服务器上的所有物理设备和虚拟机&#xff0c;所以又称为虚拟…

pat 乙级 1031 查验身份证(C++)

题目 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xff0…