day19
# review # code01 """ 第一门课:python基础 数据基本运算 1. pycharm快捷键(标志着对开发工具的熟练程度,提高开发效率) -- 百度搜索 2. 对象池:每次创建对象时,都会在池中查找是否具有相同对象, 如果有则直接返回其地址,如果没有再创建. 提高内存的利用率(减少重复出现的对象) 小整数对象池:-5 ~ 256 之间的数字永远存在内存中. 3. python内存管理机制(自动化): 引用计数: a = 对象() b = a del b,a # 对象被销毁 list01 = [] list02 = [] list01.append(list02) list02.append(list01) 缺点:不能解决循环引用问题,容易造成内存浪费. 标记清除:扫描内存,查看是否存在无法访问的内存空间。 缺点:扫描内存耗时长. 分代回收:将内存划分为多个区域("年轻代"、"中年代"、"老年代") 当上一代满了,进行标记清除,将有用的数据移动到下一代(升代)。 内存优化: 尽量少产生垃圾、对象池、手动回收(慎重)、 (字符串拼接) 4.容器 每种容器特点:存储? 可变? 不可变? 内存图 各种容器互相转换 注意:往往是根据数据,灵活的选择各种容器嵌套. 5.函数 设计:小而精,不要大而全. 参数: 实参 位置:函数名(1,2,3) 序列实参:函数名(*列表) 关键字:函数名(a = 1,c = 3, b=2) 字典实参:函数名(**字典) 形参 默认形参:def 函数名(a =0,b=0.0,c="") --可以不传递 位置:def 函数名(a,b,c) -- 必须传递 星号元组形参:def 函数名(*args)-- 位置实参数量无限 命名关键字形参: def 函数名(*args,a) -- a 必须使用关键字实参 def 函数名(a,*,b) -- b 必须使用关键字实参 双星号字典形参:def 函数名(**kwargs)-- 关键字实参数量无限 """ a = 500 b = 500 print(a is b) # true a = "悟空" b = "悟空" print(a is b) # true a = (1, 2) b = (1, 2) print(a is b) # false def fun01(*args,a): pass fun01(12,3,123,4,4,53,456,a = 1) # code02 """ 第二门课:面向对象 (略).... 理解架构设计思想:三大特征、六大原则 """ # code03 """ 11:30 第三门课:python核心 程序结构: 为什么要有模块和包? --- 代码结构清晰 各种导入方式 main.py的价值 --- 主模块不会生成pyc文件 异常处理: 异常现象:不再向下执行,而是不断返回给调用者,直到程序最外层或者try. 处理目的:异常现象 --> 正常现象. 处理手段: try: 可能出错的代码 except 错误类型1 as 变量名: 处理逻辑,通过变量名可以访问错误对象 except 错误类型2 as 变量名: 处理逻辑,通过变量名可以访问错误对象 else: 不出错的逻辑 try: 可能出错的代码 finally: 一定执行的逻辑 注意:没有处理异常 迭代 iter 可迭代对象 iterable:__iter__() -- 可以被for 迭代器 iterator:__next__() -- 可以返回数据 架构图 生成器 本质:迭代器 + 可迭代对象() 生成器函数: def 函数名(): ... yield 数据 ... 通常使用for获取数据 也可以通过__next__获取数据,通过send发送数据 通过tuple(生成器),将惰性操作变为立即操作 价值:循环一次,计算一次,返回一次, 节省内存 函数式编程 函数作为参数 参数:数值、列表、自定义对象 --> 传递数据 参数:函数--> 传递逻辑/算法/行为 IterableHelper类 --> "万能" 函数作为返回值 闭包 --> 装饰器(拦截) """ # 快捷键:iter + 回车 + Tab for char in "abcd": print(char) def fun01(): for i in range(10): value = yield i print(value) # "偶数" None generate = fun01() for item in generate: # generate.__next__() print(item) if item % 2 == 0: # 在迭代过程中给生成器发送信息 generate.send("偶数") exercise.txt # 3. 每个灯泡都有"亮","灭"两种模式, # 请打印出30个灯泡所有可能的模式 import itertools # for item in itertools.product(["亮", "灭"], repeat=30): # print(item) # 4. 年会节目有: # "舞蹈1","舞蹈2","舞蹈3","相声1","相声2","歌曲1","歌曲2","歌曲3","歌曲4" # 请打印出节目所有排列的方案 # 要求:相同节目不能挨着. list01 = ["舞蹈1", "舞蹈2", "舞蹈3", "相声1", "相声2", "歌曲1", "歌曲2", "歌曲3", "歌曲4"] for item in itertools.permutations(list01, len(list01)): # ('歌曲4', '歌曲3', '歌曲2', '歌曲1', '舞蹈3', '舞蹈1', '相声2', '相声1', '舞蹈2') for i in range(len(item) - 1): if item[i][:2] == item[i + 1][:2]: break else: print(item)