我在写第一行Python之前,以为自己是一个C/C++、JAVA程序员,每天写着大段大段 “高端” 代码乐在其中。

这会顺便去以前的博客掐了一段10年前写过的一段C++的代码,如果没有备注的话今天我都不这么看得懂当初在写什么了。

// 文件下载 int fwrite(void *buffer, size_t size, size_t nmemb, void *stream){ struct FtpFile *out = (struct FtpFile *)stream; if (out && !out->stream) { out->stream = fopen(out->filename, “wb”); if (!out->stream) { return -1; } } return fwrite(buffer, size, nmemb, out->stream); }

在我写了2年C++代码之后,虽然做了一些桌面应用产品,但是我自己一直都不好意思说自己会C和C++,总觉得智商受到了挑战,没学好。

直到因为一个Web项目开始写Python之后,我发觉世界简单了很多,好像Python是专门为我这种天生智力不足的程序员准备的,用起来顺手多了。

原因只有一个,我其实是一个 “二手程序员“,更喜欢拿来主义,直接用别人做好的、现成的东西组装一下就能用。

就跟现在网上流行的说法:后端程序员是CRUD BOY,搞算法的是调参侠,前端程序员是切图员等等诸如此类,主要是为了调侃平时绝大部分程序员做的应用都偏业务层面,没有太多高精尖的技术可言,没有底层组件的研究、没有什么芯片开发、新的图像技术突破等等,当然这绝大部分也包括我在内。

不过我们不用为此感到羞愧,因为即使是拿来主义,也要明白通过什么方式拿来并使用。

今天来讲讲Python的模块管理,看看我们是怎么直接用别人现成代码的。

知识点:

  • python的 “main函数”

  • import 的使用方式

  • 模块、包、库的概念

  • init.py的用处

Python的 “main函数”

在很多语言里,都有一个叫做main函数的东西,通常用于定义一个程序的入口,意思就是当程序启动时要干的事情。

在C语言里差不多长成这样。

int main( void ) { return 0; }

在JAVA里就挺琐碎了。

public class AClass {   public static void main(String[] args) {   System.out.println(“hello world”);   } }

这些语言都用了一个明确的内置函数名(main) 去确定程序的入口,那么Python有main函数吗?

事实上是没有的,Python没有一个内置函数来定义程序的入口,而是用到了一下这种方式。

以上7行代码我们来分别解读一下。

首先运行程序后会执行第4行的print(‘start’),然后第5行用了一个逻辑判断,来定义了一个伪main函数,并且打印hello world,以及执行fun1函数。

我们看到逻辑判断里用了一个__name__ 的内部变量,它的值是什么呢?

默认情况下一个python源文件在被执行时,它的__name__变量的值就是 字符串格式的 main,大家可以自行打印试验一下。

那么为什么需要有这么一个东西呢?我们不用它一样可以按照顺序执行代码啊?

在这里我们再来看一个例子。

我对刚才那个one.py文件做了下改进,增加了一行代码,用于打印了当前模块的__name__ 值。

然后我新增了一个叫 two.py的文件,我们来看看two.py的内容和执行结果

我们用到了一个import的语句,它的用处就是导入其他的py文件,作为当前程序的一个模块。

但是我们发觉当我导入one这个模块时,它只打印了它的__name__ 值和start字符串,并没有执行别的东西。

然后第二行代码我们同样输出了当前two.py 文件里 name 的值。

看到这里不知道各位有没有发觉一个规律,**那就是如果一个Python程序文件被其他的程序文件通过import语句导入之后,不会执行被导入文件中的“main”函数,因为它的__name__值已经不是__main__了,**我们可以简单粗暴的认为,谁的程序文件当前在被Python执行,谁才有main函数,其他的文件只能作为当前程序文件的一个模块存在。

反过来也是一样,我们也可以在one.py里去import two。

通过以上的例子我们至少学到两个东西。

  • 第一是Python程序文件可以被其他程序文件在自己内部直接import(引用),引用的对象我们就称之为模块

  • 第二是我们可以利用Python “main” 函数这个特性去做不少事情,例如我写一个模块文件,包括很多类,很多函数,然后在main里面去对当前模块进行测试和调用。当前模块被其他程序引用时,不会执行"main"函数里的测试代码,保证了测试和被调用两不误。

import用法

现在我们来仔细说说import的用法,先看个漫画。

这个漫画其实很大程度在说Python程序员如何用拿来主义做好一个“二手程序员”的,因为有大量现成的模块可以使用时,就没必要再自己写了,重复造轮子不符合程序员懒惰的性格。

关于import导入模块,有两种语法,我们都分别介绍一下。

第一种:当one.py和two.py在同一目录下时,我们想在 two中import one。

one.py myname = ‘myname is one’

two.py import one print(one.myname)

第二种:当需要import的模块存在于别的目录时,例如下面这种目录结构。

我打算在 two.py 中 import 跟他同一层目录下的test/pkg_1.py

于是语法变成了这样,在import前面加了一个from,它的中文意思其实就是 “从test 引入 pkg_1“。

如果我们想在test目录里再加一层目录,那么该如何import呢?

简单的说我们只需要用 “.” 号替代目录结构中的下划线即可,有多少个层级就用多少个"."号

例如 我想引入 test/test2/china/sichuan/city.py这个文件。

那么就应该写成 from test.test2.china.sichuan import city,注意 city不用加文件名。

其实关于这两种方式我们要讲的还很多,不过鉴于这是一个初学者的教程系列,我们暂时讲到这即可。

import总的来说就是用来引入其他Python文件的钥匙,通过它我们可以解放大脑和双手,尽量去import现成的模块来用。

同时也可以将我们写好的代码通过模块管理的方式组织得更加科学,便于其他人直接import使用。

模块、包、库

在以上的例子中我们其实已经可以了解到一些关于模块和包的概念里。

简单的说,一个py文件其实就是一个**模块(module)**当我们通过import 语句对一个Python程序文件进行引用时,我们将其称之为模块。import之后可以直接使用模块中的变量,函数和类等等一切现成的代码。

的意思很简单,我们只要发现某个目录下包含有__init__.py 文件,就可以称当前目录是一个包,所谓包,意思就是将一堆模块放在一起,然后申请一个命名空间,等着随时被 from import使用。

至于,其实是一个概念,为了和其他的语言做叫法上的兼容,在Python里,它就是以模块或者包的形式出现的。

init.py 文件

在编辑器里大家看目录结构可能不直观,我换个方式给大家看看刚才我们这几个Python文件的目录结构。

one.py和two.py在根目录,test目录下有一个pkg_1.py和__init__.py的文件。

那么__init__.py是干嘛的呢?

简单的说它的用处就是声明一个文件夹为一个包,通常__init__.py文件里面没有任何内容,只需要这么一个空文件存放在文件夹里即可。

那么有人会问,为什么test下的test2目录里为什么不用加上__init__.py呢?诸位请看以下代码。

我们可以看到 test.test2 被声明成一个包之后,在第3行打印它的名称,在第4行打印它的类型。

我们会发现 test.test2本质是就是一个模块类产生的对象 (class ‘module’ ),只是它有一个叫namespace的东西,我们现在可以理解为,当一个模块对象拥有这个namespace的时候,它就是一个包,可以通过它去import包里面的其他模块。

同时我们也打印了被引入的 pkg_2模块,它同样是一个模块类产生的对象,只是我们看到它有一个from xxxx.py的内容,表明这个模块是来自于本地某个Python文件里。

总结:

Python的improt机制是我们构建大型程序的基石,不管是用大量网上的现成模块还是去组织自己的代码模块。在本文,我们对于模块的机制讲得还不够深入,未来在进阶教程里我们会深入到Pyhton模块机制内部,看看它究竟是怎么工作了,目前来说我们只要学到如何通过import引入文件并使用即可。

推荐我们的Python学习扣qun:784758214 ,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF,实战源码】,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每天都有大牛定时讲解Python技术,分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

Python模块管理的入门详解,初学者福利相关推荐

  1. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  2. python初级教程:入门详解

    本文是针对Python的初学者,从无到有的介绍Python语言如何入门,主要包括了:Python的简介,如何下载Python,如何安装Python,如何使用终端.Shell,IDE等各种开发环境进行P ...

  3. python模块搜索原则_详解python模块路径查找规则及定义

    在python中创建一个模块非常简单,只需要在当前目录下创建一个 .py文件即可,系统自动将其解析成模块,文件名就是模块名.很多我们源码时代的同学都认为在查找模块时优先使用当前目录下的自定义模块.其实 ...

  4. python模块和包用法详解(__all__)

    1. 模块         Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句.         模块能定义函数,类和变 ...

  5. python上下文管理关键字_详解 Python 中的 with 与 上下文管理器

    with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管理的例子.你一定已经相当熟悉了,我就不再废话了 ...

  6. python哪里下载import包-【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  7. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

  8. [论文阅读] (01) 拿什么来拯救我的拖延症?初学者如何提升编程兴趣及LATEX入门详解

    又是在凌晨三点赶作业,又是在Deadline前去熬夜,一次次无眠,一次次抱怨.为什么三年前.两年前.一年前,甚至是昨天,我都下定决心"从现在开始读顶会论文",却又悄悄选择逃避:为什 ...

  9. Python str / bytes / unicode 区别详解 - Python零基础入门教程

    目录 一.前言 二.Python str / bytes / unicode 区别 1.Python2.x 版本中 str / bytes / unicode 区别 2.Python3.x 版本中 s ...

最新文章

  1. 灰度直方图均衡化及其实现
  2. Spring事务 Transaction rolled back because it has been marked as rollback-only
  3. java 生成sql脚本_java导出insert语句并生成sql脚本
  4. 微信小程序wx.request中post请求时data中参数不能传到后台
  5. 在Ubuntu Linux中获取上次访问的文件时间
  6. 极客青年说,北京沙龙
  7. python在windows配置_Python在windows平台的多版本配置
  8. 040、JVM实战总结:案例实战:每日百亿数据量的实时分析引擎,为啥频繁发生Full GC ?
  9. 微信小程序data format error解决办法
  10. 层级结构——组合模式
  11. AI学习 Day06 内置函数
  12. win7系统下 安装anaconda时报错“failed to create menus”的解决方案
  13. AcWing蓝桥杯AB组辅导课08、数论
  14. 我所经历的汶川大地震之二
  15. Integration of image quality and motion cues for face anti-spoofing A neural network approach
  16. L1正则化与L2正则化详解
  17. 【Linux】软件安装、仓库搭建、服务器配置
  18. 目前已知摄像头的三维坐标和三维朝向,已知摄像头画面宽高,某一物体在该画面中的位置坐标,以及该物体中心距离摄像头的距离,求该物体在现实世界中的坐标,用c++实现,使用小孔成像原理,直接上代码...
  19. Java for Web学习笔记(三五):自定义tag(3)TLDS和Tag Handler
  20. python运行微软图标代码_获取windows程序图标并将其另存为.png Python

热门文章

  1. Windows CMD 黑客常用命令
  2. 【软件工程】开源许可证
  3. 如何在网上查阅和免费下载标准-网站推荐
  4. [智能座舱]小鹏G9语音新功能介绍与分析
  5. linux编程获取本机IP地址的三种方法
  6. BaziPickView 八字时间选择器、
  7. 最强易用性?趣链科技智能合约引擎是怎样炼成的
  8. [Web前端技术教学][基于Web标准的网页设计与制作]教材的精选100单选试题及答案
  9. 电力机车电子脚踏开关中霍尔开关的选择DRV5013/CHA442
  10. pandas 中对axis=0,axis=1的理解,对应pandas中drop的用法