1,什么是闭包,闭包的经典应用
闭包:内部函数对外部函数作用域里变量的引用
应用:装饰器
2,写一个多线程
导入threading包
对象名= threading. Thread(target = 函数名) 创建线程对象
对象名. start( ) 创建线程
import threading
import time
def sing ( num) :
for i in range ( num) :
print ( "sing%d" % i)
time. sleep( 0.5 )
def dance ( num) :
for i in range ( num) :
print ( "dancing%d" % i)
time. sleep( 0.5 )
def main ( ) :
"""创建启动线程"""
t_sing = threading. Thread( target= sing, args= ( 5 , ) )
t_dance = threading. Thread( target= dance, args= ( 6 , ) )
t_sing. start( )
t_dance. start( )
if __name__ == '__main__' :
main( )
导入threading包
创建一个类继承Thread类,重写run方法
创建类对象,调用start( ) 方法创建线程
import threading
import time
class MyThread ( threading. Thread) :
def run ( self) :
for i in range ( 3 ) :
time. sleep( 1 )
msg = "I'm " + self. name+ ' @ ' + str ( i)
print ( msg)
def test ( ) :
for i in range ( 5 ) :
t = MyThread( )
t. start( )
if __name__ == '__main__' :
test( )
3,多线程多进程的异同点
1 ,相同点:都能实现多任务,
2 ,不同点:
4,对于表的创建、修改以及删除
1 ,创建: create table 表名( 字段名 数据类型 约束,字段名 数据类型 约束,字段名 数据类型 约束) ;
2 ,修改:
RENAME TABLE 旧表名
TO 新表名
ALTER TABLE 表名
ADD 字段名 字段类型;
ALTER TABLE 表名
DROP 被删除的字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新字段名的数据类型;
ALTER TABLE 表名 CHANGE 旧字段名 旧字段名 旧字段名的数据类型;
3 ,删除:drop table 表名
5,事物的创建
格式:
start transaction;
sql语句1
sql语句2
. . .
commit;
rollback:
6,装饰器的作用
给其他函数添加新的功能
7,写出所知的约束
1 , 主键约束:PRIMARY KEY
2 ,默认值约束:DEFAULT
3 ,唯一约束:UNIQUE
4 ,外键约束: FOREIGN KEY
5 ,非空约束:NOT NULL
8,删除外键
alter table 表名 drop constraint 外键约束名
- 添加外键
语法:alter table 外键表名 add constraint 约束名称 foreign key ( 外键字段) references 主键表名( 约束列名) 。
如果表A中的Ids是主键,要约束表B中得Aid列,那么语句应该是:alter table B add constraint A_B_Ids foreign key( Aid) references A( Ids) 。
alter table 表名 drop constraint 主键约束名
- 增加主键
语法:alter 表名 add constraint 主键约束名 primary key( 列名)
9,多张表的连接方式
内连接:inner join
外连接:left join, right join, full join
交叉连接:cross join, 也称笛卡尔积
10,完整的select语句,写出执行顺序
select *
from 表1 (连接方式)
join 表2
on 连接条件
where
group by 分组的字段
having
order by 排序的字段 asc| desc
limit start, pagesize
1 、from 子句组装来自不同数据源的数据;
2 、where子句基于指定的条件对记录行进行筛选;
3 、group by子句将数据划分为多个分组;
4 、使用聚集函数进行计算;
5 、使用having子句筛选分组;
6 、计算所有的表达式;
7 、select 的字段;
8 、使用order by对结果集进行排序。
11,交叉连接
cross join
也称笛卡尔积
12,事物的格式,ACID
格式:
start transaction;#开始
sql语句1
sql语句2
...
commit;#提交
rollback:#回滚
A:原子性:一个事物是不可再分的工作单元,要么全部成功要么全部失败。
C:一致性:事物必须是数据库的一个一致的状态到另一个一致的状态。
I:隔离性:一个事物的执行不能被其他的事物干扰。
D:持久性:一个事物一旦被提交,他对数据库的改变是永久性的
13,视图的格式以及应用场景,使用视图的注意点
create view 视图名
as
标准的sql查询语句
金融行业,保险行业,财务行业。
(1 )视图可以使用多个表
(2 )一个视图可以嵌套另一个视图
(3 )对视图的数据进行添加、修改和删除操作直接影响所引用的表中的数据
(4 )当视图数据来自多个表时,不允许添加和删除数据
14,写出协程实现的三种方式
利用yield 实现协程
import time
def work1 ( ) :
while True :
print ( "-----1-----" )
yield
time. sleep( 1 )
def work2 ( ) :
while True :
print ( "-----2-----" )
yield
time. sleep( 1 )
th1 = work1( )
th2 = work2( )
while True :
next ( th1)
next ( th2)
利用greenlet实现协程
import time
import greenlet
def work1 ( ) :
while True :
print ( "----1----" )
th2. switch( )
time. sleep( 1 )
def work2 ( ) :
while True :
print ( "----2----" )
th1. switch( )
time. sleep( 1 )
th1 = greenlet. greenlet( work1)
th2 = greenlet. greenlet( work2)
th1. switch( )
利用gevent实现协程
import gevent
import time
def work1 ( ) :
while True :
print ( "----1----" )
gevent. sleep( 1 )
def work2 ( ) :
while True :
print ( "----2----" )
gevent. sleep( 1 )
th1 = gevent. spawn( work1)
th2 = gevent. spawn( work2)
gevent. joinall( [ th1, th2] )
15,存储过程的实现、查看与删除
格式:
delimiter $
create procedure 存储过程名(参数列表)
begin
存储过程体(合法有效的sql语句)
end$
call 存储过程名( )
查看:show create procedure 存储过程名;
删除:drop procedure 存储过程名;
16,数据库底层
1 ,连接层:提供与客户端的连接服务
2 ,服务层:提供各种用户的窗口;提供sql优化器
3 ,引擎层:提供存储数据的方式
4 ,存储层:存储数据
17,怎么在类的外面强行访问私有属性