python(基础--模块[递归])

模块(是一个命名空间,也是一个模块对象)
补充:容器 ->数据的封装
函数 ->语句的封装
类 ->方法和属性的封装
含义:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。(模块就是程序)
作用:1封装代码
2实现代码的重用

import 语句(隐性运算)
含义:导入整个模块,包括声称一个以模块名命名的命名空间
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
import module1[, module2[,… moduleN]
使用模块中的函数名时,使用格式为module1.函数
from … import 语句
from modname import name1[, name2[, … nameN]]
含义:只导入指定模块的部分属性到当前的命名空间
这个声明不会把整个模块(from后的模块)导入到当前的命名空间中,它只会将import后的函数引入进来。(可直接使用,不需要在用)
from … import * 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的,
from modname import *
但是那些由单一下划线(_)开头的名字不在此例。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。(不建议使用)
Import … as…
导入一个模块(命名空间),并且给这个命名空间起一个别名
注意:使用了as后,只能使用别名,不能使用原始名称
Import和from的区别
注意:1import将整个模块对象赋值给一个变量名
2from将一个或多个变量名赋值给导入此模块的模块中的同名对象(若当前命名空间已经有了一个相同数属性,from之后被覆盖)
Import语句导入指定的模块时,系统执行的步骤:
1.找到模块文件
在指定路径下搜索模块文件
2.编译成字节码
文件导入时就会编译,因此,顶层文件的pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件(pyc文件就是.py文件编译后的文件)
3.执行模块的代码来创建其所定义的对象
模块文件中的所有语句会依次执行,从头到尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件属性
注意:1.模块只有在第一次导入时才会执行如上步骤
2.后续导入操作只不过是提取内存中已加载的模块对象
3.reload()可用于重新加载模块
深入模块
模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。
name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,被引入的模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。(是在被引用的模块进行判断, name__是否等于__main)(在被引入的模块中加入__name
== “nain”的判断)
if name == “main”:
print(“主程序”)
else:
print(“不是主程序”)
注意:在引入某模块时候,是先将被引入的模块的代码执行一遍,在从主程序上进行顺序执行。
搜索路径:
含义:在程序导入模块的时候,系统会到默认路径中去搜索,找到了就导入,找不到就报错。
以下代码显示系统的搜索路径:
import sys
print(sys.path)
试行结果:
[‘E:\project’, ‘E:\project’, ‘E:\project\venv\Scripts\python36.zip’, ‘E:\Anaconda3\DLLs’, ‘E:\Anaconda3\lib’, ‘E:\Anaconda3’, ‘E:\project\venv’, ‘E:\project\venv\lib\site-packages’, ‘E:\project\venv\lib\site-packages\setuptools-39.1.0-py3.6.egg’, ‘E:\project\venv\lib\site-packages\pip-10.0.1-py3.6.egg’, ‘D:\PyCharm 018.1.4\helpers\pycharm_matplotlib_backend’]

将要导入的模块的路径添加到系统的搜索路径中(一般将模块导入到site-packages文件夹中 ):
sys.path.append(“路径”)
包(package)
含义:包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用程序执行环境
包的创建流程:
1创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字
2 在文件夹中创建_init_.py的模块文件,内容可以为空(必须创建,用来告诉python,把这个文件夹当作一个包)
3 将相关的模块放入文件夹中
在程序中导入包:
Import 包名.模块名
补充:init.py的模块文件通常为空,仅用于扮演包初始化的挂钩,替目录产生模块命名空间以及使用目录导入时实现from * 行为的角色
dir(模块名) 函数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回
模块名.all()
类似于一个删除方法,可将这么模块中能被外界调用的方法以一个列表的形式打印出来
注意:1并不是所有的模块都有all属性
2当一个模块有all属性时,当在程序中使用了, from 模块名 import * 形式导入到当前命名空间,则模块导入的只是all属性中所有的属性。
如果没有all属性时,from 模块名 import * 形式导入了所有带下划线_的属性全部导入到当前命名空间中
补充:1导入一个模块时, 使用”模块.file”可以查看该模块在系统中存在的路径
2 help(模块名) ,print(模块名.doc) 可查看该模块的说明
3使用print(locals())可查看当前作用域中定义的属性
标准模块
有些模块直接被构建在解析器里,这些虽然不是一些语言内置的功能,但是他却能很高效的使用,甚至是系统级调用也没问题。
这些组件会根据不同的操作系统进行不同形式的配置,
OS模块:
Operating System (操作系统)
我们并不关心什么操作系统使用什么模块,怎么选择由os模块去选择
OS.putenv
In [8]: os.putenv(“path”,r"E:\张同\张同_作业")

In [9]: os.system(“20180822.txt”)
Out[9]: 0
输入和输出
三种输出值的方式: 表达式语句和 print() 函数,文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
• str(): 函数返回一个用户易读的表达形式。
• repr(): 产生一个解释器易读的表达形式

递归(分治思想)
特征:1.有调用函数自身的行为
2.有正确的返回条件
import sys
sys.setrecursionlimit(100)
设置递归的最大次数

猜你喜欢

转载自blog.csdn.net/weixin_42970234/article/details/84203342