python软件基金会在哪个国家_Python 基金会 —— 模块和包简介

一、模块(Module)

1、模块的作用

在交互模式下输出的变量和函数定义,一旦终端重新启动后,这些定义就都不存在了,为了持久保存这些变量、函数等的定义,Python中引入了模块(Module)的概念。

一个Python模块事实上就是一个脚本文件,具有后缀“.py”,比如 hello.py 就是一个模块文件名称。和普通文件一样能够被永久保存在本地存储磁盘中。

2、模块的内容

Python模块中存放的是一些程序代码,比如,变量定义、函数定义或是代码语句。

以下是hello.py模块的内容。当中有一个变量 a,一个函数 fun()。和一个打印语句。

# -*- coding:UTF-8 -*-

#! /usr/bin/python3

a = [1, 2, 3]

def fun():

return 'fun()'

print('hello', fun(), a)

这里介绍一个模块属性 __name__ ,该属性存储了当前模块的名称。比方,上面的 hello.py 其__name__就是 'hello.py'

3、模块的使用

(1)第一种方式时将模块当做脚本运行。模块中的代码语句会得到运行

wuhui@wuhui-H55M-S2H:~/Desktop$ python3 hello.py

hello fun() [1, 2, 3]

(2)另外一种方式时将模块导入。然后使用导入模块中定义的变量、函数等

>>> import hello

>>> hello.a

[1, 2, 3]

>>> hello.fun()

'fun()' 使用"import module"导入模块方式时,被导入模块不能带后缀;使用导入模块中定义的变量、函数时。必须使用模块名作为前缀,如"hello.a"而不是直接使用"a"。假设感觉这样麻烦的。能够使用以下的方式。将模块中所有的定义信息所有导入。

>>> from hello import *

>>> a

[1, 2, 3]

>>> fun()

'fun()'

4、模块的相关信息

每一个模块都有自己的定义信息。包含变量、函数等以及一些“与生俱来”的内建变量,这些能够通过Python内建函数 dir() 来查看。

直接在终端下输出dir(),输出当前环境下的变量名

>>> dir()

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

导入上面的 hello.py 模块后,使用dir()查看。不仅输出了默认的的变量名。还输出了hello.py中我定义的变量a和函数fun的名称

>>> import hello

>>> dir(hello)

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'fun']

输出模块名

>>> print(hello.__name__)

hello

5、模块的搜索路径

当导入模块时,Python依照一定的搜索顺序在指定的文件夹下搜索模块,假设找到则导入模块,否则会引发异常。比如,运行 “import hello”导入hello.py模块时,Python解释器首先依据模块名搜索内建模块。假设没有找到,则会去 sys.path 变量所列出的文件夹下搜索,sys.path的默认文件夹例如以下:

(1)输入脚本所在文件夹(或当前文件夹,假设没有指定导入脚本,如 import ×)

(2)环境变量 PYTHONPATH 所指定的文件夹(这个与系统环境变量中的PATH语法同样)

(3)安装的文件夹(默认)

假设导入的脚本是一个符号连接(Windows上的快捷方式),搜索文件夹是符号链接所连接的原始文件所在文件夹,而非符号连接所在文件夹。在Python解释器初始化之后,能够在程序中改动 sys.path

二、包(Package)

1、包的作用

简言之,包就是一个容器,用来存放其它的模块和包。

假设你之前接触过其它语言。相信包的概念应该不会陌生,其作用和 C++/C#中的namespace相似。与java中的包相似。Python中提出包的概念是为了方便不同模块的组织。当一个项目较大时,编写的模块数量众多并且是由不同成员编写的,这时候就难免会出现模块名、变量名、函数名、类名等重名的情况。尽管能够在名称前加前缀来区分,但这样的做法始终不是非常好。没有将模块的组织结构体现出来。使用包组织模块,就能够通过

"A.B"的方式来引用模块。其结构类似与树状,非常清楚。以下是一个包的结构:

PkgA/ # 顶层包

__init__.py # 初始化 PkgA

PkgB/ # PkgA 的子包 PkgB

__init__.py # 初始化 PkgB

module1.py

module2.py

PkgC/ # PkgA 的子包 PkgC

__init__.py # 初始化 PkgC

module1.py

module2.py

在包PkgA以下出现了同名的模块 module1.py和 module2.py 。通过加入子包 PkgB和 PkgC将其区分。

2、包的使用 —— 导入模块、变量、函数、类

PkgB 以下的 module1.py 文件内容例如以下:

def say():

print(’hello')

如今假设须要使用 PkgB下module1.py中定义的函数 say(),能够採用下列方式(导入变量、类方法一样):

# 方式一:导入函数所在模块

>>> import PkgA.PkgB.module1

>>> PkgA.PkgB.module1.say()

hello

# 方式二:从包 PkgA.PkgB 中导入函数所在模块

>>> from PkgA.PkgB import module1

>>> module1.say()

hello

# 方式三:从模块中导入函数

>>> from PkgA.PkgB.module1 import say

>>> say()

hello

注意:使用 “import item” 导入时。“item”必须是一个包或模块。而且假设要引用item中定义的变量、函数或类,须要加上“item”这一前缀。

方式一,比較繁琐;方式三。easy产生同名;推荐使用方式二。假设导入的模块中没有同名的函数 say() 。那么使用方式三会简洁很多。可是假设导入的模块或当前文件里已经定义了say。而你又须要使用模块module1中的函数say()那么就仅仅能使用方式二了,通过前缀区分,比如以下代码:

>>> from PkgA.PkgB import module1

>>> module1.say()

hello

>>> def say():

... print('world')

...

>>> say()

world

>>> module1.say()

hello

3、包的相关信息

包以下有一个名为 "__init__.py" 的文件,存在该文件时,Python会将文件夹当做一个包来看待(只是好像没有也行,这里尚不清楚。知道的请留言补充). __init__.py 为一个空文件时没什么问题的,只是__init__.py 里面也能够存放初始化代码和变量

__all__。当导入当前包以下的模块或其它包时,首先当前包中的__init__.py 中的可运行代码会被运行,紧接着导入的模块中的可运行代码也会被运行。因为包或模块仅仅会被导入一次(即使再次使用import导入也无效果),因此这些可运行代码仅仅会被运行一次。

另一个值得注意的就是__all__变量,该变量能够为空。当__init__中没有定义__all__变量时,"import package import *"仅仅导入package。而不导入不论什么模块。假设__init__定义了__all__变量,定运行"import package

import *"时,仅仅导入变量__all__中的定义的模块,而其它模块则不会被导入。这样能够防止"import *"的将全部模块导入导致载入缓慢和命名空间的污染。拿前面的代码举个样例:

# __init__.py中没有定义__all__时

from PkgA.PkgB import * # 只导入包 PkgB

# __init__.py 中定义 __all__ = ['module1']

from PkgA.PkgB import * # 只导入PkgB包中的模块 module1,而模块 module2则不会被导入

4、包的相对路径

导入包时出了使用绝对路径。如 "from PkgA.PkgB

import module1" 外,还能够使用相对路径,"."表示当前包。“..”表示上一级包。

拿前面的代码举个样例。假设想在 PkgA.PkgC.module1中使用 PkgA.PkgB.module2中的函数 say(),能够这么写:

from ..PkgB from module2

# 这里的"..PkgB"就相当于"PkgA.PkgB"

4. 包的搜索路径

当导入包时,Python会在sys.path 指定的文件夹下搜索,前面提到的sys.path默认文件夹例如以下,你也能够在程序中改动sys.path的值。

(1)输入脚本所在文件夹(或当前文件夹,假设没有指定导入脚本,如 import ×)

(2)环境变量 PYTHONPATH 所指定的文件夹(这个与系统环境变量中的PATH语法同样)

(3)安装的文件夹(默认)

參考:

[1] The Python Tutorial https://docs.python.org/3/tutorial/modules.htm

版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 基金会是一个非营利组织,致力于支持和发展 Python 编程语言及其相关的项目和社区。它的主要任务是管理和维护 Python 语言的技术发展、推广和社区治理。 作为一个管理机构,Python 基金会有以下职责和活动: 1. 技术发展:Python 基金会负责制定和管理 Python 语言的发展规划、版本迭代、漏洞修复和功能增强。他们通过持续的技术研究和社区建设,确保 Python 保持现代、高效和安全。 2. 社区支持:Python 基金会致力于促进全球范围内的 Python 开发者社区发展和交流。他们提供资源、奖学金和活动支持,鼓励人们学习和使用 Python,并通过组织会议和研讨会等活动,增进社区成员之间的联系和协作。 3. 项目管理:Python 基金会也负责管理和支持与 Python 相关的开源项目。他们帮助项目团队建立项目治理结构、规范开发流程、保证代码质量,并从财务、法律和组织角度提供支持,以确保项目的稳定和可持续发展。 4. 资金筹集:作为非营利组织,Python 基金会依赖于捐赠和赞助来支持自身的运作和项目的发展。他们通过各种渠道积极筹集资金,括个人捐赠、企业赞助和基金会合作,用以支持 Python 的技术、社区和教育活动。 总之,Python 基金会的管理工作涵盖了技术、社区和项目方面,他们致力于推动 Python 的发展和应用,保证项目的可持续性,并为广大开发者提供支持和资源,以促进 Python 生态系统的繁荣。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值