一. 上周内容回顾
函数的总结
装饰器
标准装饰器
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']