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