第一次考试
1.请说明python解释器与python语言的区别或联系
区别:python解释器是应用程序 python语言是一门编程语言,是程序员与计算机交流的介质
联系:编写好的python代码是通过python解释器来解释成计算机能识别的机器语言
2.简述解释型和编译型编程语言?
解释型(需要解释器):类似于同声传译,跨平台性好,开发效率高,执行效率低
编译型(需要编译器):类似于谷歌翻译,编译一次永久使用,执行效率高,开发效率低
3.b、B、KB、MB、GB 的关系?
8bit = 1 B
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
4.执行python脚本的两种方式是?
①交互式环境:无法永久保存代码
②脚本文件的方式(使用pycharm):永久保存代码
5.python如何实现单行注释和多行注释?
单行注释:#
多行注释:''' ''' 或者 """ """
6.定义一个变量有三个特性,分别为?
id :内存地址
type :变量类型
value :变量值
等号比较的是什么?值
is比较的是什么?内存地址
7.使用链式赋值的方式将10赋值给变量x、y、z
x=y=z=10
8.用一行代码实现数值交换: a = 1, b = 2
b,a = a,b
9.count=10,使用增量赋值,将count的值增加111
count=10
while count < 111:
count += 1
print(count)
10.使用一行代码将info=[‘egon’,18,’male’]将列表中用户的名字,年龄,性别分别赋值给变量name,age,gender(1分)
name,age,gender = info
11.简述数据类型int,str,list,tuple,dict,set的应用场景
int:年纪,等级,身份证号,qq号等整型数字相关
str:名字,性别,国籍,地址等描述信息
list:多个装备,多个爱好,多门课程,多个女朋友等
tuple:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读
dict:存多个值,key-value存取,取值速度快
set:去重,关系运算
12. 请写出一段Python代码实现删除一个list里面的重复元素?
l1 = ['b','c','d','b','c','a','a']
list(set(l1))
13.and or not 优先级
not > and > or
14.遍历每一个字符
msg = 'hello henry 666'
①
for i in msg:
print(i)
②
i = 0
while i < len(msg):
print(msg[i])
i+=1
14. 请说明break与continue的区别?
break: 跳出本层循环;
continue: 结束当前逻辑继续下一次循环:
15. 有一个多层嵌套列表a= ["a","b",["1","3",["4","haha"]]]请写一段代码遍历a中的每一个元素并打印出来。
for b in a:
for c in b:
for d in c:
print(d)
16. 常用数据类型有:字符串,列表,元组,字典,集合,请分类
按照存值个数分类?(1分) 一个:字符串 多个:列表,元组,字典,集合
按照可变\不可变类型分类?(1分)可变:列表,字典,可变集合(set) 不可变:字符串,元组,不可变集合(frozenset)
按照取值方式分类(直接取值,按索引,按key取)?(1分)直接取:数字 按索引:字符串,列表,元组 key:字典
按照有序\无序分类?(1分)有序:列表,元组 无序:字典,集合
17. 如何让元祖内部可变(叙述或简单定义)?(1分)
元组是个不可变类型,内部如果有列表类型是可以改变的,实际上只是对元祖内部的list进行改变,变的是list的地址,而元组的地址是不会变的;
18. 如何将L1 = [1,2,3,4],L2 = [6,7,8,9];使用列表内置函数变成L1=[1,2,3,4,5,6,7,8,9] (1分)
L1.extend(L2)
print(L1)
19. 如何将字典D={‘Adam’: 95, ‘Lisa’: 85, ‘Bart’: 59}中的值’Adam’删除?(1分)
D={'Adam': 95,'Lisa': 85,'Bart': 59}
del D['Adam']
print(D)
20.集合
& 交集:两个都有
| 并集:两个所有的元素
- 差集:左边有,右边没有
^ 对称差集:两边没有同时拥有
21. 什么是字符编码,如何避免乱码问题?(1分)
1)一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
2)字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码。
22.九九乘法表
for i in range(1,10):
for j in range(1,i+1):
print("%s * %s=%-2s" %(i,j,i*j),end=" ")
print()
23.金字塔
height = 5
for i in range(height):
for j in range(height - i):
print(' ',end = '')
for j in range(2*i + 1):
print('*',end = '')
print()
#注意:print()函数里面是默认换行的,具体换行参数是end="\n"。所以,当我们把参数end="\n"换成end=''相当于去掉了换行符\n,这样就不换行了
24.
拿到列表的索引和值
for index, value in enumerate(list)
拿到字典的key和值
for key,val in dict.items()
25.单例
元类控制实例化的过程
class Mymeta(type):
obj = None
def __call__(cls, *args, **kwargs):
if not Mymeta.obj:
obj = object.__new__(cls) #创建空对象
cls.__init__(obj,*args,**kwargs) #调用类的__init__方法来初始化这个空对象
Mymeta.obj = obj
return Mymeta.obj #返回该对象
else:
return Mymeta.obj
class Printer(object,metaclass=Mymeta):
def __init__(self,name,brand,type):
self.name = name
self.brand = brand
self.type = type
def printing(self,test):
print('正在打印%s'%test)
p1 = Printer('傻子','服气','无聊')
p2 = Printer('你说','我不说','可怜')
print(p1)
print(p2)
第二次考试
1. 列表,元组,字符串是python的有序序列
2. del 命令既可以删除列表中的一个元素,也可以删除整个列表
3. isinstance('hello world',str) 结果:True
4. [1,2,3] * 3 结果:[1,2,3,1,2,3,1,2,3]
5. print([3] in [1,2,3,4]) #False
print(3 in [1,2,3,4]) #True
6.
l1 = [1,2,3]
l2 = [1,2,4]
print(id(l1[0]) == id(l2[0])) #True
7. 在列表对象x的开始处增加一个元素3的代码为
x.insert(0,3)
8.print(sorted([111, 2, 33], key=lambda x: len(str(x))))
[2,33,111]
9.
x=(3,)
print(x) #(3,)
x=(3)
print(x) #3
10.获取字典"键-值对","键","值"的方法分别为dic.items(),dic.keys(),dic.values()
11.分析:x是字典
x = {1:2}
x[2] = 3
print(x) #{1:2,2:3}
12.贪婪匹配和费贪婪匹配?
贪婪匹配: .*
非贪婪匹配: .*?
13.
x = [3,5,7]
x[len(x):] = [1,2]
print(x) #[3,5,7,1,2]
14.sort()默认从升序,sort(reverse=True)变为降序
15. Python安装扩展库常用的是 pip 工具
16.hashlib中有哪些加密类型? uuid,md5,sha等
17.解释Python脚本程序的“__name__”变量及其作用?
当文件是执行文件是_name__名为:__main__,当文件被当作模块导入时,__name__为模块文件名
18.闭包函数:内部函数引用外部函数的作用域
19.random
random.random() #生成一个随机浮点数,范围0.0~0.1
random.randint() #随机生成一个整数int类型,要指定这个整数的范围
random.shuffle() #随机打乱一个序列
random.choice() #可以从任意序列中选取一个随机元素返回
20.字典和json的区别?
字典是python的数据类型,而json是处理数据的一种方式
21.
def extendlist(val, list=[]):
list.append(val)
return list
list1 = extendlist(10)
print(list1) #[10]
list2 = extendlist(123, [])
list3 = extendlist('a')
print(list1) #[10,'a']
print(list2) #[123]
print(list3) #[10.'a']
解释:新的默认列表仅仅只在函数被定义时创建一次。随后,当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。list2是操作的它创建的独立的列表(通过传递它自己的空列表作为list参数的值)。
22.
python中
and:从左到右演算,所有的值都为真,那么and返回最后一个值,如果某个值为假,那么and立即返回该假值(短路运算)
or:从左到右演算,所有的值都为假,返回最后一个假值,如果有一个值为真,立即返回该值,
优先级:not>and>or
v1 = 1 or 3
v2 = 1 and 3
v3 = 0 and 2 and 1
v4 = 0 and 2 or 1
v5 = 0 and 2 or 1 or 4
v6 = 0 or False and 1
print(v1,v2,v3,v4,v5,v6)
#1,3,0,1,1,False
23.
def squares():
return [lambda x:i**x for i in range(3)]
for square in squares():
print(square(2))
# 4 4 4
解释:闭包函数的延迟绑定机制,内部函数被调用时,参数的值在闭包内进行查找,因此,当任何由squares()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值2。
24.map会提供函数对指定序列做映射
eg:
l = [1,2,3,4,5]
def square(x):
return x**2
res = map(square,l)
res = [i for i in res]
print(res)
#[1, 4, 9, 16, 25]
#使用lambda匿名函数
res = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
res = [i for i in res]
print(res)
#[1, 4, 9, 16, 25]
第三次考试
1.模块可以分为四类分别是什么?
自定义模块(包括第三方)
内置模块
已编译的DLL的C或C++扩展
包
2.包的作用
从文件夹级别管理代码
3.__init__,py文件的作用?
用于初始化包
其实就是导入包的模块内容,一个包通常包含多个py文件为了使用方便,可以在__init__中导入需要使用的内容
4.使用相对导入时的注意事项
相对导入只能用于包中模块相互间导入
不能超过顶层包
5.模块搜素顺序?
内存中已经加载的 - >内置模块 ->sys.path(环境变量)
6. bin
start.py
core
src.py
在start.py中有以下代码
import core.src
问:在pycharm中正常执行 而在cmd中执行报错 为什么?
答:pycharm 自动将项目根目录添加到了 sys.path 中,而在cmd 运行时 sys.path 中不存在 core 名称所以报错
7.sys.argv()有什么用
用于接受命令行中传入的参数
8.json中load和loads,dump和dumps区别?
load : 从json文件中读取数据
loads: 用于将json格式字符串转换为dict类型数据
dump: 将dict类型数据转换为json格式字符串并写到json文件中
dumps:将dict类型数据转换为json格式字符串
9.在项目中使用 logging 的步骤
①编写配置文件
②加载配置文件,获取生成器
③输出日志
10.面向对象中什么是对象,什么是类?
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。
类的实例化的结果就是对象,而对象的抽象就是类,类描述了一组有相同特性(属性)的相同行为的对象。
11.什么是绑定到对象的方法,如何定义,如何调用,给谁用,有什么特征?
什么是绑定到对象的方法:
方法内使用到了对象中的数据,调用时必须传入对象的方法称为绑定方法.
定义:
一个类中没有任何装饰器修饰的是绑定方法
绑定方法的第一个参数是self
如何调用:
类可以调用,但是第一个参数需要手动指定一个对象
对象调用时会自动传入对象自己
给谁用:
绑定给谁,就给谁用
12,什么是新式类,什么是经典类,两者有什么区别?什么是深度优先,什么是广度优先?
python3中默认所有的类都是新式类
python2中默认的类是经典类
所有直接或间接继承object(根类)的类都是新式类
深度优先:优先找对象,对象没有找子类,子类没有沿着继承关系一直往上找
广度优先:有菱形时,先从左往右找,在从下往上找,先广度再深度
深度优先: 按照从左到右 从下到上 ⼀直找到object为⽌
⼴度优先: 如果存在菱形继承,则从做到右,从下到上,遇到公共⽗类则换下⼀条查找路径
13.面向对象特征,分别是什么含义?
封装:对外隐藏内部复杂逻辑,提供简单的调用接口
继承:继承一个类后可以拥有这个类的所有属性,从而简化代码.降低冗余
多态:一个类可以有不同的形态,这些不同形态的对象可以响应相同的功能,产生的结果不同,称为多态.不同对象,可以相对应同一方法,并做出不同的行为,产生不同的结果
14.什么是派生?
B类继承A类,并且B类拥有独特的属性或行为时B类称为A类的派生类
15.super()有什么用,什么时候用?
super()可以获得一个特殊的父类对象
当需要访问父类中的属性或方法时使用
16.classmethod 和 staticmethod的作用是什么,有什么区别
绑定给类的方法使用一个装饰器叫classmethod,使用时自动传入类
staticmethod是静态⽅法,就是⼀个普通的函数 不具备⾃动传值的特性
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
class A(object):
bar = 1
def foo(self):
print 'foo'
@staticmethod
def static_foo():
print 'static_foo'
print A.bar
@classmethod
def class_foo(cls):
print 'class_foo'
print cls.bar
cls().foo()
###执行
A.static_foo()
A.class_foo()
#类名.方法名()来调用
17.在 python3中 所有类都是 Object的子类,这有什么好处
object中提供了很多常用的方法和属性例如: __str__ __dict__ __doc__
这样子类可以直接使用这些内容
第四次考试
1.写代码是要避免循环导入,什么是循环导入?
A引用B,B引用A
2.以下代码什么时候使用
if __name__ == "__main__":
print("test")
运行文件的时候使用
3,有如下变量 请使用hashlib 为其加密 并 加盐
import hashlib
pwd=input('password>>:').strip()
m=hashlib.md5()
m.update('从前从前有个人爱你很久'.encode('utf-8'))
m.update(pwd.encode('utf-8'))
m.update('但偏偏风渐渐把距离吹得好远'.encode('utf-8'))
print(m.hexdigest())
4.
判断一个对象是否属于str类型
isinstance(a,str)
判断A类是否是B类的子类
issubclass(A, B)
5.property的作用是什么?
将方法伪装成属性
6.类中的`__getattr__`方法什么时候被执行?
对象点属性的时候触发
7.__str__的作用是什么?
当对象被print时自动触发
8.什么是反射,常用反射有哪些?
通过字符串的形式操作对象相关的属性。
python中的一切事物都是对象(都可以使用反射)
hasattr
getattr
setattr
9.什么是抽象类?
类中只有方法声明而没有实现的类叫抽象类
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
10.OSI七层网路协议分别是哪些 ?
①应用层②表示层③会话层④传输层⑤网络层⑥数据链路层⑦物理层
11.以太协议,IP协议,TCP/UDP协议,分别工作在哪些层?
以太协议:数据链路层
IP协议:网络层
TCP/UDP协议:传输层
12.端口号有什么用 使用时注意什么?
端口(Port)包括逻辑端口和物理端口两种类型.
“IP地址+端口号”可以唯一标识特定的服务.
端口即应用程序与网卡关联的编号
端口用于唯一识别计算机中的一个应用程序
传输层功能:建立端口与端口的通讯 端口范围:0-65535,0-1023为系统的占用端口
端口号在同一层计算机中不能重复
注意:不要使用常见的程序已经占用的端口 比如:apache 是8080,mysql是3306,FTP是21
13.
TCP三次握手解释:①客户端(client)先发一个数据syn=1 ②服务器(server)返回一个确认信息确信我收到了ack=2,然后给客户端发送一个数据syn=1 ③客户端返回一个确认信息 ack=2
TCP四次挥手 断开连接:①客户端先发一个结束请求fin=1 ②服务器返回一个确认的信息表示我收到了ack=2 ③服务器思考了一段时间确认结束,给客户端发送一个结束请求fin=1 ③客户端返回一个确认信息表示我收到了ack=2
四次分手也是保证数据传输是完整的
第五次考试
1.类中__getattr__方法什么时候被执行?
使用点语法调用属性且属性不存在的时候才会触发
2.数据库分为几类.说说他们的区别?
关系型:数据储存在表中,表与表之间存在某种关联的关系,数据通常保存在硬盘上,速度慢,但是容量大,可以维护数据的完整性
非关系型数据库:数据以key-value的方式储存,通常粗存在内存中,速度快,但是容量小,无法维护数据的完整性
3.mysql操作where和having的区别是什么?
两者都用于条件过滤
不同点:
where的执行顺序早于having
where中不能使用聚合函数
having仅用于group分组后
4.主键和唯一约束有什么区别?
主键可以是非空并且唯一的,也用于组织数据结构
唯一约束仅仅是约束,不会影响数据的储存结构
一个表只能有一个主键,但可以有多个唯一约束
所以主键可以作为其他表的外键
5.外键约束会带来哪些约束?
1)建表顺序,必须先建立主表,再建立从表
2)插入数据顺序,先插入主表,再插入从表
3)删除数据时,先删除从表再删除主表
4)删除表时,先删除从表,再删除主表
6.socket是什么?
socket是工作在网络层之上的一套接口
其目的是封装底层复杂的TCP/UDP协议,简化网络开发难度
7.简述TCP和UDP的区别与使用场景
TCP 在传输数据前 必须进行三次握手,确认双方的数据通道是畅通的,发送数据时必须等到对方返回确认信息,以保证数据完整发送了,网络开销较大
UDP 不会关心对方是否在线,是否接受,发送完就完事,所以不能保证数据传输的完整性
视频聊天 语音聊天都是UDP
文字传输,支付信息等用TCP
8.简述数据库相关概念, 本质上数据库就是在操作文件,请列出数据库中库,表,记录,字段,与文件系统的对应关系
字段对应 文件中的某个数据 比如100
记录对应 文件中的某一行数据
表对应 某一个文件
库对应 某一个文件夹
9.
create table user(id int(3) ,name char(3))
int(3) 和 char(3) 有什么区别?
int(3) 表示最小显示宽度 仅在设置填充时有效
char(3) 表示该字段最多容纳三个字符
10.什么是进程,什么是线程,有什么区别?
进程表示一个正在运行的程序,是一个资源单位,包含了运行该程序所需的所有资源
线程是CPU的最小执行单位,线程包含一段可执行的代码,在获得CPU执行权后,会按照顺序,去执行这些代码,可以将它看做一条流水线,上面放着一行行代码,CPU负责执行它们
一个程序就是一个进程 一个进程必然包含一个线程,也可以包含多个线程
在一个进程中多个线程直接的数据是共享的
进程之间的数据时独立的,不能直接共享
11.简述,阻塞,非阻塞,同步,异步的区别与联系
阻塞,指的是程序执行过程中遇到了IO操作,无法继续执行,必须等待IO操作结束后
非阻塞,没有IO操作指程序正在被CPU执行
阻塞与非阻塞之描述的是程序的砖状态
同步,是指发起一个任务时必须等待该任务执行完毕,才能继续执行剩下的代码,默认情况下函数得调用都是同步的
异步与同步相反,发起任务后不需要等待任务的执行结果,可以立即处理其他事情.但是还是要接受结果
同步异步指的是任务执行的方式
同步任务会被阻塞 异步任务同样可能会被阻塞
12.并发和并行的区别?
并发指的是一件事情,同时发生了,但不是同时在执行,在程序中CPU会在不同任务间切换执行,但是切换的速度非常快,给人的感觉像是两个任务同时在执行,实际上是在轮流进行
并行指的是.两个任务真正的同时执行,必须在多处理器或多核心处理器的环境下才可能真正的并行
13.什么是GIL,GIL解决了什么为题?带来了什么问题?
GIL是全局解释器锁,用于避免多线程进程解释器资源带来的问题
CPython的内存管理机制是非线程安全的,GIL解决了安全问题.
在一个线程使用解释器时,解释器被锁定,其他线程即使获得CPU执行权,由于没有锁,导致无法使用解释器,最终的结果是无法利用多核CPU,实现多任务并行.
14.有人说python的多线程是鸡肋,你怎么看,为什么?
①在单核情况下,无论是IO密集型还是计算密集型,GIL都不会产生影响,而多线程开销小,并且节约资源,所以使用多线程.
②在多核情况下,IO密集型会受到GIL的影响,但是很明显IO速度远比计算速度慢,所以两者执行的时间差不多,基本可以忽略不计,而在这个情况下我们考虑到多线程开销小,并且节约资源,所以多核情况下,IO密集型我们使用多线程.
③对于计算密集型,在多核情况下,CPython中多线程是无法并行的,为了解决这一弊端,Python推出了多进程技术,可以良好的利用多核处理器来完成计算的任务.
15.什么是互斥锁,什么时候用?
互斥锁,指的是线程间相互排斥,当多个线程读写同一个数据时,会造成数据的错乱,互斥锁则可以保证,同一时间只有一个线程在读写这个数据.
16.多表查询有哪些方式,分别有什么特点
1)内连接
inner join on
两张表都有的记录
2)左外连接
left join on
左表无论条件是否匹配都完全显示 右边仅显示匹配的记录
3)右外连接
right join on
右表无论条件是否匹配都完全显示 左边仅显示匹配的记录
4)全连接
左右两边 无论是否匹配都完全显示,mysql中不支持 ,可以通过union合并左外联和右外联
17..写出python中开启多线程的两种方式
1)实例化Thread类 初始化时 指定target参数
2)继承Thread类 覆盖run函数
18.在多线程中join的作用是什么?
t1= Thread(target=task)
t1.join
主线程等待t1线程执行完毕后继续执行
19.请写出mysql查询语句中关键字的书写顺序
select * from table_name
where 约束条件
group by 分组依据
having 过滤条件
order by 排序的字段
limit 限制显示的条数
20.什么是线程池,有什么用
用于存储线程对象的容器,可以帮助程序员管理线程的创建,销毁以及任务分配
21.事务的特性?
1)原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
2)一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
3)隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4)持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
22.mysql数据库约束条件
primary key:主键,唯一标识,表都会拥有,不设置为默认找第一个 不为空,唯一 字段,未标识则创建隐藏字段
forein key:外键
unique key:唯一性数据, 该条字段的值需要保证唯一,不能重复
auto_increment:自增,只能加给key字段辅助修饰 一定要与上面三个key中的一个相结合
not null:不为空
default:默认值
unsigned:无符号
zerofill:0填充
23.你用的 Mysql 是哪个引擎,各引擎之间有什么区别?
引擎是提供给表使用的,不是数据库
Mysql主要有MyISAM和InnoDB两个引擎.
Mysql 5.5.8之前默认引擎是MyISAM,5.5.8版本之后是InnoDB.
区别:
1)InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM 就不可以了; MyISAM适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;
2)InnoDB 支持外键,MyISAM 不支持;
3)InnoDB 支持行级锁,MyISAM 不支持;
4)MyISAM查询效率高于InnoDB
24.Sql 注入是如何产生的,如何防止?
程序开发过程中不注意规范书写 sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量 POST 和 GET 提交一些 sql 语句正常执行。产生 Sql 注入。
下面是防止办法: a. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。 b. 在 PHP 配置文件中将 Register_globals=off;设置为关闭状态 c. SQL 语句书写的时候尽量不要省略小引号(tab 键上面那个)和单引号 d. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的 e. 对于常用的方法加以封装,避免直接暴漏 SQL 语句 f. 开启 PHP 安全模式:Safe_mode=on; g. 打开 magic_quotes_gpc 来防止 SQL 注入 h. 控制错误信息:关闭错误提示信息,将错误信息写到系统日志。 i. 使用 mysqli 或 pdo 预处理。
25.存储过程和函数的区别?
相同点:存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合。 1)存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中已经编译好的 sql 语句, 不需要重复使用。减少网络交互,减少网络访问流量。 不同点:标识符不同,函数的标识符是 function,存储过程是 proceduce。 1)函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out) 来实现多个参数或者返回值。 2)存储函数使用 select 调用,存储过程需要使用 call 调用。 3)select 语句可以在存储过程中调用,但是除了 select..into 之外的 select 语句都不能在函数中使 用。 4)通过 in out 参数,过程相关函数更加灵活,可以返回多个结果.
26.数据库怎么优化查询效率?
1)储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。 如果不需要事务处理,使用默认存储引擎 MyISAM 是比较明智的
2)分表分库,主从。
3)对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
4)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
5)应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫 描
6)应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
7)Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
8)对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差
第六次考试
1.布尔值为False的有?
0,None,空字符串,空列表,空字典等
2.什么是名称空间?名称空间的加载顺序?查找顺序?
名称空间是用来储存名称和内存地址对应关系的内存空间本质是一个字典
加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间
查找顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间
3.for循环的工作原理?
1)执⾏in后对象的dic.__iter__()⽅法,得到⼀个迭代器对象iter_dic
2)执⾏next(iter_dic),将得到的值赋值给k,然后执⾏循环体代码
3)重复过程2,直到捕捉到异常StopIteration,结束循环
4.简述yield和return的相同点与不同点
相同点:都有返回值
不同点:yield可以返回多次值 return只返回⼀次
5,有参装饰器
from functools import wraps
def auth(func):
@wraps(func)
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
6.定义一个自己的open类,控制文件的读或写,在对象被删除时自动回收系统资源
class MyOpen:
def __init__(self,filename):
self.file = open(filename)
def write(self,d):
self.file.write(d)
def read(self):
return self.file.read()
def __del__(self):
print("清理资源")
self.file.close()
7.where和having的区别?
两者都用于条件过滤
where:判断条件
having:约束条件
不同的是:
where 的执行顺序早于having,
where中不能使用聚合函数
having仅用于group分组后
8.form表单标签有哪些你认为比较重要的属性
1)action指定数据提交的地址
2)method指定提交数据的方式,默认是get请求
3)form表单提交数据必须有属性为submit的input按钮
4)提交文件数据时需要指定enctype="multipart/form-data"
9..bootstrap这款前端框架比较好的技术点是?简述该技术点的应用特点?
技术点:栅格系统
特点:
响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动调整页面布局
通过一系列的行(row)与列(column)的组合来创建页面布局,一行被均分成12份,每一份又能够继续被再均分成12小份,如此往复
10.socket通讯
客户端:
import socket
client = socket.socket()
client.connect(('192.168.12.207',4396))
while True:
msg = input('请输入>>:').strip()
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print('收到服务器的数据:%s'%data.decode('utf-8'))
服务端:
import socket
server = socket.socket()
server.bind(('192.168.12.207',4396))
server.listen()
while True:
conn,addr = server.accept()
while True:
conn.recv(1024)
conn.send(b'hello world')
conn.close()