【有书共读11】零压力学Python读书笔记14 & 15
# coding=utf-8 # 生命游戏的python实现 # 定义矩阵类 class Matrix2D: """ 矩阵类 """ def __init__(self, rows, cols): """" init """ self.rows = rows self.cols = cols self.grid = [[0] * cols for _ in range(rows)] def get_cell(self, r, c): """ 获取r行c列的值 :param r: :param c: :return: """ return self.grid[r][c] def set_cells(self, n, *args): """ 将任意个单元格的值设置为n :param n: 设置为的值 :param args: :return: """ for r, c in args: self.grid[r][c] = n def inc_cells(self, *args): """ 将任意个单元格加1 :param args: :return: """ for r, c in args: self.grid[r][c] += 1 def set_all_cells(self, n=0): """ 将所有的单元格都设置为0 :param n: :return: """ for i in range(self.rows): for j in range(self.cols): self.grid[i][j] = n rows = 20 cols = 40 life_mat = Matrix2D(rows, cols) nc_mat = Matrix2D(rows, cols) life_mat.set_cells(1, (0, 0), (2, 2), (3, 0), (3, 1), (3, 2)) border_str = '_' * cols # 创建边界字符串 def get_chr(a_mat, r, c): """ :param a_mat: :param r: :param c: :return: """ return 'X' if a_mat.get_cell(r, c) > 0 else ' ' def get_mat_str(a_mat): """ :param a_mat: :return: """ disp_str = '' for i in range(rows): lst = [get_chr(a_mat, i, j) for j in range(cols)] disp_str += ''.join(lst)+'\n' return disp_str def do_generation(): """ :return: """ # 打印当前的生命矩阵的状态 print(border_str + '\n' + get_mat_str(life_mat)) nc_mat.set_all_cells(0) """ 补充nc矩阵,将nc矩阵中相邻位置都加1 在边上和角上实现环绕 """ for i in range(rows): for j in range(cols): if life_mat.get_cell(i, j): im = (i - 1) % rows ip = (i + 1) % rows jm = (j - 1) % cols jp = (j + 1) % cols nc_mat.inc_cells((im, jm), (im, j), (im, jp), (i, jp), (i, jm), (ip, jm), (ip, j), (ip, jp)) # 根据邻居矩阵规则生成下一代 for i in range(rows): for j in range(cols): n = nc_mat.get_cell(i, j) if n < 2 or n > 3: # 死亡 life_mat.set_cells(0, (i, j)) elif n == 3: # 繁殖 life_mat.set_cells(1, (i, j)) n = int(input()) for i in range(n): do_generation()
第18章
# coding=utf-8 # yield 编写生成器函数 # next()获取下一个 from time import time def gen_rand(): p1 = 1200556037 p2 = 2444555677 max_rand = 2 ** 32 r = int(time() * 1000) while True: n = r n *= p2 n %= p1 n += r n *= p2 n %= p1 n %= max_rand r = n yield n my_rand = gen_rand() # 生成一个可迭代的对象 for x in range(10): print(next(my_rand)) """ 本章知识点总结: 本章要点总结如下。 1:在 Python中,要创建自定义的可迭代对象,可编写生成器函数。生成器不返回 值,而使用 yield语句。""" yield x """ 2:生成器的状态被保存,供生成器被再次调用时使用。所有局部变量的值都被保留。 3:实例化生成器函数后,无须再次实例化它,除非你要重启生成器。相反,只需保 存生成器一次,然后反复使用它。 """ my_rand = gen_rand() print(next(my_rand)) print(next(my_rand)) """ 4:虽然特性看起来像实例变量,行为也像实例变量,但其实现与实例变量不同。要 实现特性,可为何个特性添加两个特殊方法:获取方法和设置方法 5:用户试图获取特性的值时,将训用其获取方法。获取方法的定义语法如下 """ @property def property_name(self): statements return value """ 6:用户试图设置特性的值时,将调用其设置方法。设置方法的定义语法如下 """ @roperty_name.setter def(self, new_value): statements """ 7:装饰器将一个函数作为参数,根据这个函数定义一个新函数,并返回这个新函数 8:下面的语句导致原始函数(被包装的函数)被其新版本取代 """ function.decorator(function)#Python##笔记##读书笔记#