二十九: MVC / MVT / MVP / MVVM
1. MVC -- Model Views Controller -- 模型层、模板层、视图函数
2. MVT -- Model Views Templates -- 模型层、视图函数、模板层
3. MVP -- Model Views Presenter -- 模型层、模板层、视图函数(contrller/Presenter)
4. MVVM -- Model Views ViewsModel -- 模型层、模板层、视图函数
将views和状态和抽象化,视图UI和业务逻辑分开,viewsmodel可以取出 Model 的数据同时帮忙处
理 View 中由于需要展示内容而涉及的业务逻辑。
二十六:数据库删除操作(谨慎使用):
-- 删除数据库: drop database if exists 数据库名;
-- 删除表:drop table 表名字 (完全删除去掉整张表);
-- 删除表:delete from 表名 (删除表里面的数据,一行一行的删除,表明后面可以跟where 字段名= 值,
删除指定的某条或者多条记录,该命令可以回滚)
-- 删除表:truncate table 表名称 (删除表中的数据,并且新增加记录的计数标识会重置,
比如主键id原来是50,用该命令删除后,新增加的数据主键id会从1开始,而不是51开始)
一般来说:执行速度-->drop>truncate>delete
使用foreign key约束的表,不能用truncate,应使用不带where的delete
二十 : 操作系统的五大管理功能 :
1.设备管路:主要是负责内核与外围设备的数据交互,实质是对硬件设备的管理,包括对输出输入设备的分配,初始化,维护与回收等,比如管理音频的输入输出;
2.作业管理:这部分功能主要是负责人机交互,图形界面或者系统任务的管理;
3.文件管理:这部分功能设计文件的逻辑组织和物理知识,目录结构和管理等;
4.进程管理:说明一个进程存在的唯一标志是pcd(进程控制块),负责维护进程的信息和状态;
5.存储管理:数据的存储方式和组织结构。
十八 : SQL注入攻击
--> 用户在客户端输入特定的字符串提交服务器,在服务器执行sql语句时,将用户输入的特定字符串误以为是sql语句并且执行语句
如何防御sql注入攻击:
1.项目上线时,将网页错误提示返回信息关闭,或者重写(python中配置:debug=False),这种方法只是简单的掩盖代码缺陷,并不能防御;
2.检查变量数据类型和格式;
3.过过滤字符串;
4.绑定变量,使用预编译语句;
5.数据库信息加密;
6.使用数据库存储过程;
十四: python容器类型(即数据类型)
1. 列表(list) -- 可变,有序 -- 中括号[]
a.获取元素 - 通过下标获取元素
b.增删改
增 : append ,insert , extend
删除:remove , del ,pop ,clear
改 : 列表[下标] = 新值
c. 相关运算 :+ ,* ,in /not in ,len() ,list() ,max() ,min()
列表1.append(a) 和列表1.extend(a)的区别:
append: 添加对象到列表1(将添加的对象作为列表1的一个元素)
extend: 添加元素到列表1(将添加的对象中的元素添加到列表1)
a = [1,2,3,4]
b = [5,6,7,8]
a.append(b) # a: [1,2,3,4,[5,6,7,8]]
a = [1,2,3,4]
a.extend(b) # a: [1,2,3,4,5,6,7,8]
将[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
a= [[1, 2], [3, 4], [5, 6]]
b= [j for i in a for j in i]
2. 元祖(tuple) -- 不可变,有序 -- 小括号()
注意: 当元祖只有一个元素时,要加逗号
a = (1) --- a变量类型是int类型
b = (1,) --- b变量类型是tuple类型
获取元素 - 通过下标获取元素
变量1,变量2 = (元素1,元素2)
变量1,*变量2 = (元素1,元素2,元素3......)
相关运算 :+ ,* ,in /not in ,len() ,tuple() ,max() ,min()
3. 字典 (dict) -- 可变,有序 -- 大括号{}
a.获取元素 -- 通过键获取元素
b.增删改
增 : 字典[key] = 值 , 字典1.update(字典2), 字典1.setdefault(key,值)
删 : del 字典[key],字典.pop(key) ,clear
改 :字典[key] = 值
c. 相关运算 :in /not in ,len() ,dict() ,
max() : 取的是字典的key的最小值 ,key类型需要一样
min() :取的是字典的key的最小值 ,key类型需要一样
4. 集合 (set) -- 可变、无序 --大括号{}
a. 查--获取集合元素 : 不能单独获取某个元素,只能遍历
b. 增 (添加元素): 集合.add(元素) -- 将制定元素添加到集合中
集合.update(序列) -- 将序列中的元素添加到集合中(序列中的元素必须是不可变的)
c. 删 (删除元素): 集合.remove(元素) -- 删除集合中指定的元素
d. in / not in ,max ,min, len ,set
e.数学运算:包含(>=,<=),并集(|),交集(&),补集(^),差集(-)
5. 字符串(str)-- 不可变、 有序--两个单引号''或者双引号
a.获取元素 -- 通过下标获取元素
b. 字符串切片:字符串1[:]
c. 相关运算 :+ ,* ,in /not in ,len() ,str() ,max() ,min()
d.转义字符:\n,\t,\',\
e.阻止转义:r/R
八: 闭包问题 (变量作用域)
1. python属性查找规则:LEGB
1. (Local)局部作用域,每当调用一个函数的时候就创建了一个局部作用域,它最先被搜索。
2. (Enclosing)嵌套的父级函数的局部作用域
3. (global)全局作用域
4. (built-in)内建作用域,这个是内建函数和类的作用域。
2. 实列:
1) def func(x):
a = []
for i in range(5):
a.append(i*x)
return a
b = func(2)
print(b)
输出结果为:[0, 2, 4, 6, 8]
2)
def func():
return [lambda x : i * x for i in range(4)]
print([m(2) for m in func()])
输出结果为: [6, 6, 6, 6]
如果想得到[0,2,4,6]可以用生成器或者创建闭包或者偏函数
生成器
def multipliers():
for i in range(4): yield lambda x : i * x
print([m(2) for m in multipliers()])
将闭包作用域变为局部作用域
def multipliers():
return [lambda x,i=i : i * x for i in range(4)]
print([m(2) for m in multipliers()])
偏函数
from functools import partial
from operator import mul
def multipliers():
return [partial(mul, i) for i in range(4)]
print([m(2) for m in multipliers()])
七: 映射(map()) -- 归纳(reduce()) -- 过滤(filter()) --
解析式生成可迭代对象:列表解析式,元祖解析式,字典解析式等(任何可迭代对象)
1) map(函数,可迭代序列对象) -- 对可迭代对象的每个元素执行函数,返回一个序列对象(需要指定保存类型则:list(map())) <--> (数据处理)
2) reduce(函数,可迭代对象) -- 通常map和reduce都是在列表里结合使用,map对数据进行一一映射处理,reduce对数据进行整合计算 <-->(数据整合)
3) filter(函数,可迭代对象) -- 将可迭代对象的元素中满足函数的保留下来,不满足的剔除掉 <-->(数据筛选)
4) 解析式是python生成列表的一种高效方式(也可以生成其他类型,通常生成list) : 列表解析式 -- [ function for item in iterable]
比如 : [ x * x for x in range(1,5)]
[ num * num for num in range(-8,5) if num < 0]
字典解析式:
# Taken from page 70 chapter 3 of Fluent Python by Luciano Ramalho
DIAL_CODES = [
(86, 'China'),
(91, 'India'),
(1, 'United States'),
(62, 'Indonesia'),
(55, 'Brazil'),
(92, 'Pakistan'),
(880, 'Bangladesh'),
(234, 'Nigeria'),
(7, 'Russia'),
(81, 'Japan'),
]
>>> country_code = {country: code for code, country in DIAL_CODES}
>>> country_code
{'Brazil': 55, 'Indonesia': 62, 'Pakistan': 92, 'Russia': 7, 'China': 86, 'United States': 1, 'Japan': 81, 'India': 91, 'Nigeria': 234, 'Bangladesh': 880}
>>> {code: country.upper() for country, code in country_code.items() if code < 66}
{1: 'UNITED STATES', 7: 'RUSSIA', 62: 'INDONESIA', 55: 'BRAZIL'}
集合解析式:
# taken from page 87, chapter 3 of Fluent Python by Luciano Ramalho
>>> from unicodedata import name
>>> {chr(i) for i in range(32, 256) if 'SIGN' in name(chr(i), '')}
{'×', '¥', '°', '£', '', '#', '¬', '%', 'µ', '>', '¤', '±', '¶', '§', '<', '=', '', '$', '÷', '¢', '+'}
五: 字符串格式化-- format函数 (菜鸟教程)
功能: a.代替占位符: f'{a}任意字符{b}' -- 等同于--> '%s任意字符%s' %(a,b)
b.格式化字符串:'{a}{b}'.format(a='内容',b='内容')
实列:
1.传入参数:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
2.传入对象
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class AssignValue(object):
def __init__(self, value):
self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
3.格式化数字:
>>> print("{:.2f}".format(3.1415926));
3.14
三: 装饰器:一个闭包,把一个函数当做参数返回 一个替代版的函数,本质上就是一个返回函数的函数 (被装饰的函数名会变成装饰器的名字,不在是原来的名字)
装饰器的三个要素():
1. 外层函数嵌套内层函数
2. 外层函数返回内层函数
3. 内层函数调用外层函数参数
# 对要装饰的函数添加新的代码
def outer(func):
def inner(*args, **kwargs):
# 需要装饰的代码(在func基础上添加的新代码)
return func(*args, **kwargs)
return inner
二: 偏函数:把一个函数的某些参数固定住(设默认值),返回一个新的函数
列子:
int('234') -- 将'234'字符串变成int类型 --int('234', base=10)将字符串引号去掉后,当成10进制的数,然后转换成10进制数返回
int('1010',base=2) -- 将字符串去掉引号后当成一个2进制数来算,转成10进制数返回
自定义偏函数:
导入偏函数模块:from functools import partial
int2 = partial(int, base=2)
int2就是一个偏函数
-- int2('101011')--将101011当2进制,转换成10进制数