模块

. 上周内容回顾
函数的总结
装饰器
标准装饰器
def wrapper(f):
def inner(*args, **kwargs):
# 执行被装饰函数之前的操作
ret = f(*args, **kwargs)
# 执行被装饰函数之后的操作
print(ret)
return inner

@wrapper
def func(a, b):
print(a, b)

func(1, 2) # inner(1, 2)

装饰器在不改变原函数的调用(结构)下,为原函数增加额外的功能

遵循开放封闭的原则
对代码拓展开放
对代码修改封闭

装饰器本质是闭包

内置函数:
l1 = [("a", 1), ("b", 4), ("c", 2)]
min(l1, key=lambda x:x[1])
max(l1, key=lambda x:x[1])

zip(拉链方法)
eval()
exec()
map:生成器表示式的循环模式
filter:生成器表达式筛选模式
reduce: 可以key
divmod(10, 3)
type()
abs()
sorted() 排序
sum()
reversed()
callable()
all()
any()

. 模块
what:一个py文件就是一个模块,一个模块是一些相似功能的集合体
why:
1. 减少重复代码,提高开发效率
2. 代码的组织结构更清晰,更有条理性

模块的划分:
1.内置模块。 time os sys
2.扩展模块,也叫第三方模块,需要使用pip下载安装
beautiful soup request gevent等
itchat 与微信相关的模块
注意要是问起使用过哪些内置模块或者扩展模块,一定要分清楚,不要搞混了
3.自定义模块

# 自定义模块

# a.py
print('from the tbjx.py')
name = '太白金星'  # 全局变量
def read1():
    print('tbjx模块:', name)

def read2():
    print('tbjx模块')
    read1()

def change():
    global name
    name = 'barry'

# tbjx.py
# import 的使用
# 注意这与上面的三个函数不在同一个文件
# import tbjx  # 引用模块相当于执行这个模块

# 重复导入会直接引用内存中已经加载的结果

# 模块被执行时发生了三件事:
# 1. 创建一个以被导入模块的名字命名的名称空间
# 2. 自动执行模块中的代码,即将模块中的所有内容加载到内存中
# 3. 要想执行模块中的代码,必须通过模块名.的方式执行获取
import tbjx

print(tbjx.name)  # 太白金星

tbjx.read1()  # tbjx模块:太白金星

name = "asda"
print(tbjx.name)  # 太白金星
# 因为通过模块名.的方式就会执行模块中的代码

def read1():
    print(666)
tajx.change()  # 这个也是一样

name = "abc"
tbjx.change()
print(name)  # abc
# 为什么不是 barry? 原因是模块 tbjx 总的 change() 的 global 的使用只适用于该 tbjx 文件中对全局变量的改变
# 而现在的 name = "abc" 是另一个文件中的变量,跟 change() 的没关系
# 即 global 全局仅限于当前文件!

# 这里要想到用 change() 里面内容,就必须在 change() 设置返回值 return
# 然后再 print(tbjx.change())

# 模块是导入进来使用的,不能修改,因为改了别人要是再用就会出问题

 

# 模块改名
# 1. 有的模块名字太长,可以改名,便于操作
import abcdpythonuser as ab
print(ab.age)
ab.func()

# 内置模块也可以改
# import time
# print(time.time())

import time as t
print(t.time())

# 2. 便于代码的拓展和优化
#mysql.py
def sqlparse():
    print('from mysql sqlparse')

#oracle.py
def sqlparse():
    print('from oracle sqlparse')

#test.py
db_type=input('>>: ')
if db_type == 'mysql':
    import mysql as db
elif db_type == 'oracle':
    import oracle as db

db.sqlparse()
# 统一结构化设计

 

# 引用多个模块
# 官方推荐下面的写法
import mysql
import time
import sys

# from...import...
# from tbjx import name,read1
# 这里直接写明了,因此下面可以直接print这个变量及调用函数
# print(name)
# read1()

# from...import... 与import...相比的优缺点
# 优点:使用简单
# 缺点:容易与本文件的变量、函数名发生冲突
# 如果被导入的文件与导入的文件的变量重名,结果会受影响
# 因此最好使用 import 模块

name = "abc"
from tbjx import name, read1
print(name)  # 太白金星
print(globals())  # barry
# 这里导入的文件的变量 name 覆盖掉了前面 name = "abc" 的值

# 如果下面这样,结果又不一样了
from tbjx import name, read1
name = "abc"
print(name)  # abc
# 由此看出,谁在下面打印的就是它对应的值

# 不管是 import... 还是 from...import...
# 都会把要导入的文件的所有内容加载进来

# from tbjx import name,read1
# 这行代码执行以下两点:
# 1. 执行一遍tbjx的所有代码,加载到内存
# 2. 将 name, read1() 实际引用过来的变量函数在本文件中复制一份
#    可以通过 globals() 查看
# 所有在文本中有两个内存地址

from tbjx import name,read1, change
name = "alex"
change()
print(name)  # alex
# 注意还是和之前说的一样,global只适用于当前文件

from tbjx import name,read1, change
print(name)  # 太白金星
name = "alex"
print(name)  # alex

from tbjx import name,read1, change
change()
print(name)  # 太白金星
name = "alex"
print(name)  # alex

# 上面一开始导入的时候就将 name,read1,change复制到了现在这个文件的全局名称空间中
# 因此上面这段相当于:
from tbjx import name,read1, change
name = "太白金星"
change()
# 这里只是把 tbjx 文件里的 name 变量改变了指向的值,跟本文件没有关系
print(name)  # 太白金星
name = "alex"
# 这里是将本文件中的全局变量 name 指向的值由 太白金星 改为 alex
print(name)  # alex

 

# from...import...也可以改名
from tbjx import read1 as r

from...import name # 这里只是把 name 导入到本文件中
from...import *  # 导入所有到本文件中
# 一般不要使用这个,会与本文件的变量名一致时起冲突

# import tbjx
# 文件有两个作用:
# 1. 作为脚本,直接运行
# 2. 作为模块供别人使用
# 3. __name__ == "__main__" 可以作为一个项目的启动文件作用

print('from the tbjx.py')
name = '太白金星'
def read1():
    print('tbjx模块:', name)

def read2():
    print('tbjx模块')
    read1()

def change():
    global name
    name = 'barry'

print(__name__)  # __main__  表示在本文件中运行
# # 在别的文件中打印就是 这个文件名
#
if __name__ == "__main__":
    read2()
# 这个的作用是不想让 tbjx 这个模块在别的文件被调用的时候不想让 read2() 被执行

# 模块的搜索路径:
import tbjx
print(tbjx.name)  # 可执行

import tbjx1
print(tbjx1.name)  # 报错

import time
print(time)
time.func()

 

# 内存———>built-in 内置模块———>sys.path
# 模块搜索路径的验证方法:

import sys
print(sys.path)  # 返回一个列表,该列表的第一个参数就是当前目录
# ['G:\\day12 视频以及笔记', 'G:\\day12 视频以及笔记', 'D:\\Python36\\python36.zip', 'D:\\Python36\\DLLs', 'D:\\Python36\\lib', 'D:\\Python36', 'D:\\Python36\\lib\\site-packages', 'E:\\PyCharm 2018.3.1\\helpers\\pycharm_matplotlib_backend']

 

posted @ 2019-01-07 15:19  星满夜空  阅读(178)  评论(0编辑  收藏  举报