所有基础文章修改完毕

This commit is contained in:
TwoWater
2019-10-14 17:57:06 +08:00
parent 95ad977818
commit d7a75dac9e
48 changed files with 387 additions and 145 deletions

View File

@@ -2,20 +2,49 @@
在开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在 Python 中,一个 .py 文件就称之为一个模块Module
后面我们学习了函数,知道函数是实现一项或多项功能的一段程序,这样就更方便我们重复使用代码
之前我们学习过函数,知道函数是实现一项或多项功能的一段程序 。其实模块就是函数功能的扩展。为什么这么说呢?那是因为模块其实就是实现一项或多项功能的程序块
紧接着,我们有学了类,类可以封装方法和变量(属性)。这样就更方便我们维护代码了
我们之前学过,类的结构是这样的:
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-08-034102.png)
而我们要学的模块是这样的:
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-10-175017.png)
在模块中,我们不但可以直接存放变量,还能存放函数,还能存放类。
不知道你们还有没有印象,我们封装函数用的是 `def` , 封装类用的是 `class`
而我们封装模块,是不需要任何语句的。
**在 Python 中,一个 .py 文件就称之为一个模块Module。**
可以看下我之前写的例子,在 pychrome 上 ,这样一个 test.py 文件就是一个模块。
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-070013.png)
其实模块就是函数功能的扩展。为什么这么说呢?
那是因为模块其实就是实现一项或多项功能的程序块。
通过上面的定义,不难发现,函数和模块都是用来实现功能的,只是模块的范围比函数广,在模块中,可以有多个函数。
既然了解了什么是模块了,那么为什么需要模块呢?既然有了函数,那为啥那需要模块?
然有了函数,那为啥那需要模块?
最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Python 内置的模块和来自第三方的模块。
最大的好处是大大提高了代码的可维护性。
其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Python 内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
Python 本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。我们可以尝试找下这些模块,比如我的 Python 安装目录是默认的安装目录,在 C:\Users\Administrator\AppData\Local\Programs\Python\Python36 ,然后找到 Lib 目录,就可以发现里面全部都是模块,没错,这些 `.py` 文件就是模块了。
![python36bin目录](http://upload-images.jianshu.io/upload_images/2136918-5ecc6493206da1ec?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-python36bin%E7%9B%AE%E5%BD%95.png)
其实模块可以分为标准库模块和自定义模块,而刚刚我们看到的 Lib 目录下的都是标准库模块。

View File

@@ -73,16 +73,24 @@ from modname import name1[, name2[, ... nameN]]
`import` 导入 sys 模块,然后使用 version 属性
![from···import和 import的区别1](http://upload-images.jianshu.io/upload_images/2136918-499dd531d4ce3d72?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-from%C2%B7%C2%B7%C2%B7import%E5%92%8C%20import%E7%9A%84%E5%8C%BA%E5%88%AB1.png)
`from···import` 直接导入 version 属性
![from···import和 import的区别2](http://upload-images.jianshu.io/upload_images/2136918-eea99fc170ed5a07?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![from···import和 import的区别2](media/from%C2%B7%C2%B7%C2%B7import%E5%92%8C%20import%E7%9A%84%E5%8C%BA%E5%88%AB2-2.png)
## 3、from ··· import * ##
通过上面的学习,我们知道了 `from sys import version` 可以直接导入 version 属性。但是如果我们想使用其他的属性呢?比如使用 sys 模块中的 `executable` ,难道又要写多一句 `from sys import executable` ,两个还好,如果三个,四个呢?难道要一直这样写下去?
通过上面的学习,我们知道了 `from sys import version` 可以直接导入 version 属性。
但是如果我们想使用其他的属性呢?
比如使用 sys 模块中的 `executable` ,难道又要写多一句 `from sys import executable` ,两个还好,如果三个,四个呢?
难道要一直这样写下去?
这时候就需要 `from ··· import *` 语句了,这个语句可以把某个模块中的所有方法属性都导入。比如:
@@ -105,3 +113,5 @@ C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe
```
注意:这提供了一个简单的方法来导入一个模块中的所有方法属性。然而这种声明不该被过多地使用。

View File

@@ -14,10 +14,12 @@
首先创建了模块 lname ,然后判断一下是否是主模块,如果是主模块就输出 `main` 不是,就输出 `not main` ,首先直接运行该模块,由于该模块是直接使用,而没有被人调用,所以是主模块,因此输出了 `main` ,具体看下图:
![name属性区分模块1](http://upload-images.jianshu.io/upload_images/2136918-d892d81a71cda9d6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-name%E5%B1%9E%E6%80%A7%E5%8C%BA%E5%88%86%E6%A8%A1%E5%9D%971.png)
然后又创建一个 user_lname 模块,里面只是简单的导入了 lname 模块,然后执行,输出的结果是 `not main` ,因为 lname 模块被该模块调用了,所以不是主模块,输出结果如图:
![name属性区分模块2](http://upload-images.jianshu.io/upload_images/2136918-9137cb874588dded?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-name%E5%B1%9E%E6%80%A7%E5%8C%BA%E5%88%86%E6%A8%A1%E5%9D%972.png)

View File

@@ -1,11 +1,21 @@
# 四、包 #
包,其实在上面的一些例子中,都创建了不同的包名了,具体可以仔细观察。在一开始模块的简介中提到使用模块可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中因此我们自己在编写模块时不必考虑名字会与其他模块冲突。但是也要注意尽量不要与内置函数名字冲突。但是这里也有个问题如果不同的人编写的模块名相同怎么办为了避免模块名冲突Python 又引入了按目录来组织模块的方法称为包Package
包,其实在上面的一些例子中,都创建了不同的包名了,具体可以仔细观察。
在一开始模块的简介中提到,使用模块可以避免函数名和变量名冲突。
相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
但是这里也有个问题,如果不同的人编写的模块名相同怎么办?
为了避免模块名冲突Python 又引入了按目录来组织模块的方法称为包Package
比如最开始的例子,就引入了包,这样子做就算有相同的模块名,也不会造成重复,因为包名不同,其实也就是路径不同。如下图,引入了包名后, lname.py 其实变成了 com.Learn.module.nameattributes.lname
![Python 包](http://upload-images.jianshu.io/upload_images/2136918-7f92a0da0bc609d5?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-Python%20%E5%8C%85.png)
仔细观察的人,基本会发现,每一个包目录下面都会有一个 `__init__.py` 的文件,为什么呢?
因为这个文件是必须的否则Python 就把这个目录当成普通目录,而不是一个包 。 `__init__.py` 可以是空文件也可以有Python代码因为 `__init__.py` 本身就是一个模块,而它对应的模块名就是它的包名。

View File

@@ -1,10 +1,14 @@
# 五、作用域 #
学习过 Java 的同学都知道Java 的类里面可以给方法和属性定义公共的( public )或者是私有的 private ,这样做主要是为了我们希望有些函数和属性能给别人使用或者只能内部使用。 通过学习 Python 中的模块,其实和 Java 中的类相似,那么我们怎么实现在一个模块中,有的函数和变量给别人使用,有的函数和变量仅仅在模块内部使用呢?
学习过 Java 的同学都知道Java 的类里面可以给方法和属性定义公共的( public )或者是私有的 private ,这样做主要是为了我们希望有些函数和属性能给别人使用或者只能内部使用。
Python 中,是通过 `_` 前缀来实现的。正常的函数和变量名是公开的public可以被直接引用比如abcni12PI等类似`__xxx__`这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的 `__name__` 就是特殊变量,还有 `__author__` 也是特殊变量,用来标明作者。注意,我们自己的变量一般不要用这种变量名;类似 `_xxx``__xxx` 这样的函数变量就是非公开的private不应该被直接引用比如 `_abc` `__abc` 等;
通过学习 Python 中的模块,其实和 Java 中的类相似,那么我们怎么实现在一个模块中,有的函数和变量给别人使用,有的函数变量仅仅在模块内部使用呢?
注意,这里是说不应该,而不是不能。因为 Python 种并没有一种方法可以完全限制访问 private 函数或变量,但是,从编程习惯上不应该引用 private 函数或变量
在 Python 中,是通过 `_` 前缀来实现的。正常的函数和变量名是公开的public可以被直接引用比如abcni12PI等类似`__xxx__`这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的 `__name__` 就是特殊变量,还有 `__author__` 也是特殊变量,用来标明作者
注意,我们自己的变量一般不要用这种变量名;类似 `_xxx``__xxx` 这样的函数或变量就是非公开的private不应该被直接引用比如 `_abc` `__abc` 等;
**这里是说不应该,而不是不能。因为 Python 种并没有一种方法可以完全限制访问 private 函数或变量,但是,从编程习惯上不应该引用 private 函数或变量。**
比如:
@@ -48,4 +52,6 @@ DiamondVIP2
------------------------
最后扯淡,欢迎加我微信:`androidwed`,进入微信Python讨论群一起学习讨论。现在微信群只有50几个人.
最后扯淡,欢迎加我微信:`thinktoday2019`, 进入微信 Python 讨论群

View File

@@ -1,7 +1,9 @@
# 前言 #
之前的文章都是使用[Sublime Text](http://www.sublimetext.com/)来编写 Python 的,主要是为了更好的熟悉和了解 Python ,可是开发效率不高,也不方便,从这章开始,改为使用 Pycharm 了,在之前的篇节[集成开发环境IDE: PyCharm](https://www.readwithu.com/python1/IDE.html)中介绍了 PyCharm ,如果如要激活软件可以通过授权服务器来激活,具体看这个网址。[JetBrains激活http://www.imsxm.com/jetbrains-license-server.html](http://www.imsxm.com/jetbrains-license-server.html)当然你也可以尝试破解, [Pycharm2017.1.1破解方式](http://blog.csdn.net/zyfortirude/article/details/70800681),不过对于软件的升级不方便
学习到这里,可以说 Python 基础学习基本接近尾声了
# 目录 #
![草根学Python 模块与包](http://upload-images.jianshu.io/upload_images/2136918-4434f73dc82c0101?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-%E6%A8%A1%E5%9D%97%E4%B8%8E%E5%8C%85.png)