Python 笔试题(持续总结)

1.什么是关系型数据库?
关系型数据库是指采用了关系模型来组织数据的数据库,而关系模型是由二维表及其联系组成的数据组织。

2.关系型数据库的优点?
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

3.简述你所了解的各种数据库及其适用场景?
目前主流的关系型数据库有:
MYSQL: 目前使用最广泛的开源、多平台的关系型数据库,支持事务、符合ACID、支持多数SQL规范
SQL Server: 支持事务、符合ACID、支持多数SQL规范,属于商业软件,需要注意版权和licence授权费用
Oracle: 支持事务,符合关系型数据库原理,符合ACID,支持多数SQL规范,功能最强大、最复杂、市场占比最高的商业数据库
Postgresql: 开源、多平台、关系型数据库,功能最强大的开源数据库,需要python环境,基于postgresql的TimeScaleDB,是目前比较火的时序数据库之一.

4.什么是非关系型数据库?
非关系型数据库也称为NOSQL(Not Only SQL),作为关系型数据库的一个补充,能在特定场景和特点问题下发挥高效率和高性能。
常见的非关系型数据库类型有键值(Key-Value)存储数据库和面向文档数据库(Document-oriented)
键值存储数据库类似hash,通过key做添加、删除、查询,性能高,优势在于简单、易部署、高并发,主要产品有
Redis: 开源、Linux平台、key-value键值型Nosql数据库,简单稳定,非常主流的、全数据in-momory、定位于“快”的键值型nosql数据库

Memcaced:一个开源的、高性能的、具有分布式内存对象的缓存系统,通过它可以减轻数据库负载,加速动态的web应用
面向文档数据库以文档的形式存储,每个文档是一系列数据项的集合,每个数据项有名称与对应的值,主要产品有
MongoDB: 开源、多平台、文档型nosql数据库,“最像关系型数据库”,定位于“灵活”的nosql数据库。适用于网站后台数据库(更新快、实时复制)、小文件系统(json,二进制)、日志分析系统(数据量大的文件)

5.编写一条sql语句,创建一个user表,其字段为: username, email, phone, sex, 设置其编码格式为utf-8,并插入一条数据.

create database user default charset utf8;
use user;
-- 创建user的库并指定编码

-- 创建用户表
drop table if exists tb_user;
-- 如果存在user的表就先删除

create table tb_user
(
userid int not null comment '用户编号',
-- 用户id 是整数 不能为空,并指定描述为'学号'
useremail varchar(30) not null comment '邮箱',
-- 邮箱不能为空且设定字符串长度最多为20个字符
username varchar(20) not null comment '姓名',
-- 学生姓名不能为空且设定字符串长度最多为20个字符
userphone int not null comment '用户编号',
-- 用户手机 是整数 不能为空,并指定描述为'手机号'
usersex bit default 1 comment '性别',
-- 学生性别 bit 默认为1
primary key (userid)
-- 设置学生id为主键
);

-- 插入学生数据
insert into tb_user (userid, username, usersex,  userphone, useremail) values
(1001, '杨逍', 12432545434, '1511879011@qq.com'),

6.使用python编写一段程序,倒序遍历一个字典,拼接所有的key与value为key1=value1&key2=value2格式.

sorted(dict.iteritems(),key=lambda dict:dict[1],reverse=True)
                   

输出结果为:


7.发现一个网页打开特变慢,如何从数据库层面进行优化?
(1)、根据服务层面:配置mysql性能优化参数;

(2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。

(3)、从数据库层面增强性能:优化SQL语句,合理使用字段索引。

(4)、从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。

(5)、减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。

(6)、不常使用的数据迁移备份,避免每次都在海量数据中去检索。

(7)、提升数据库服务器硬件配置,或者搭建数据库集群。

(8)、编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);

8.是否使用过Django框架,若是,简述如何使用Django框架在网页中打印出数据库中的一条客户信息,简述使用过的其他web框架,不限于python,包括qi技术架构,设计模式或者其实现原理.

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:
模型(Model),即数据存取层,处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

模板(Template),即表现层,处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即业务逻辑层,存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

9.区分深拷贝和浅拷贝,赋值?
1、赋值:简单地拷贝对象的引用,两个对象的id相同。

2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。

3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

10.如何应对高并发的接口访问?
[https://www.cnblogs.com/angelyan/p/10439475.html]
一.cdn加速

简单说就是把静态资源放到别人服务器上,即内容分发网络,尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上.控制时延无疑是现代信息科技的重要指标,CDN的意图就是尽可能的减少资源在转发、传输、链路抖动等情况下顺利保障信息的连贯性。

三.后台数据库使用mysql+Redis

mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在常用的 redis。首先,用户访问缓存,如果未命中,就去访问mysql,之后将mysql中的数据复制到缓存中。

redis是缓存,并且是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度。redis提供了大量的数据结构,比如string、list、set、hashset、sorted set这些,之后用户的访问就能直接从Redis的内存中去取数据了,那内存的读取速度远远大于硬盘

四.数据库的优化

1.sql的优化

2.索引的优化

3.分库分表

4.读写分离

五.使用缓存

例如python-django-restframework自带的缓存

六.集群化的部署

例如:django+uwsgi+nginx

详细部署内容请点击这里:https://www.cnblogs.com/alex3714/p/6538374.html

七.分布式+异步

celery:就是一个分布式异步的解决方案

这里详细的celery解释:https://www.cnblogs.com/alex3714/p/6351797.html

11.python的基础数据结构操作(list最常考)
增删改查:
尾部增加元素:list.append('需要插入的元素')
指定位置插入元素:list.insert(下标, '需要插入的元素')
extend()方法:

此方法是用来拓展列表,给他们追加一些元素,后面的参数可以是字符串,列表以及任何可迭代对象,python解释器会将此对象一一拆分然后追加至列表,

删除元素:list.pop(元素下标)
删除指定元素list.remove('指定元素')
list.clear()列表变成一个空列表
del list :删除整个列表
更改:
索引:list_name[0] = '修改后的值'

切片:list_name[0:3] = [a,b,c]
查询:
索引:list_name[0]
切片:
list_name[0:3]
list_name[0:3:2]

列表的其他方法:
len(list)方法:
此方法可以用来计算列表的长度,

count()方法:

此方法用来计算列表中一个元素出现的次数

sort()方法:
是对列表进行排序(列表里的元素要为数字类型),默认是正序,可以指定倒序(reverse = True)

reverse():
此方法是将列表里所有元素进行翻转,注意,不是排序,是将所有元素倒过来 ,

join()方法:

此方法用法与字符串的join方法一样,就是将列表里的元素用指定字符连接起来,字符可以是空格,可以是空字符,可以是下划线以及任意字符,
注:可以利用这种方法将一个列表转为字符串格式

12.python 类方法,静态方法区别?

13迭代器和生成器,装饰器?

14.单例模式?

15.简述python面向对象编程?

16.简述celery和其原理?


16627003-2eea8802c4bc8a3d.png
image

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过消息队列(缓冲区)来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给消息队列,消费者不找生产者要数据,而是直接从消息队列里取,消息队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个消息队列就是用来给生产者和消费者解耦的。------------->这里又有一个问题,什么叫做解耦?
解耦:假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

16627003-a1d578b496cd7956.png
image.png

参考资料: https://www.cnblogs.com/forward-wang/p/5970806.html

  1. filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表


    16627003-5672b2d19d9671b6.png
    image.png

18.什么是列表表达式?
列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。
格式:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

19.列表的加法,和extend/append的区别?
extend可以将另一个集合中的元素逐一添加到列表中,区别于append整体添加


16627003-dc69563cfcff2d1d.png
image.png

20.什么是时间戳?
时间处理有关的模块包括:time,datetime 以及 calendar
在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:
(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。(获取时间戳)
(2)格式化的时间字符串(Format String): ‘1988-03-16’
(3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

21.什么是贪婪匹配?
后边多一个?表示懒惰模式。
必须跟在或者+后边用
如:<img src="test.jpg" width="60px" height="80px"/>
如果用正则匹配src中内容非懒惰模式匹配
src=".
"
匹配结果是:src="test.jpg" width="60px" height="80px"
意思是从="往后匹配,直到最后一个"匹配结束

懒惰模式正则:
src=".*?"
结果:src="test.jpg"
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

.表示除\n之外的任意字符
*表示匹配0-无穷
+表示匹配1-无穷

22.简述Django的orm?
ORM意为对象关系模型,实现了模型和数据库的解耦,创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句.

23.字符串的join方法:


16627003-359326b63ea190ec.png
image.png

24.简述re.sub?
详情参考:https://www.jianshu.com/p/8c1d1a38f9b9
re是正则的表达式,sub是substitute表示替换,re.sub的参数:有五个参数
re.sub(pattern, repl, string, count=0, flags=0)
其中三个必选参数:pattern, repl, string

25.列出常见的状态码和意义
200 OK
请求正常处理完毕
204 No Content
请求成功处理,没有实体的主体返回
206 Partial Content
GET范围请求已成功处理
301 Moved Permanently
永久重定向,资源已永久分配新URI
302 Found
临时重定向,资源已临时分配新URI
303 See Other
临时重定向,期望使用GET定向获取
304 Not Modified
发送的附带条件请求未满足
307 Temporary Redirect
临时重定向,POST不会变成GET
400 Bad Request
请求报文语法错误或参数错误
401 Unauthorized
需要通过HTTP认证,或认证失败
403 Forbidden
请求资源被拒绝
404 Not Found
无法找到请求资源(服务器无理由拒绝)
500 Internal Server Error
服务器故障或Web应用故障
503 Service Unavailable
服务器超负载或停机维护

26.进程和线程的关系?(重点)
参考:[https://www.cnblogs.com/yuanchenqi/articles/6755717.html](* 一 进程与线程的概念* 二 threading模块* 三 multiprocessing模块* 四 协程* 五 IO模型
)
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源。
线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)CPU分给线程,即真正在CPU上运行的是线程

27.并发和并行,串行区别?
并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行

并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集


16627003-4480bd1a05364e76.png
image.png

28.同步和异步?
同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。
参考原文:https://blog.csdn.net/huangqiang1363/article/details/79508852
举个例子,今天向家里打电话要生会费,同步就是打电话,打不通就一直打,等待,oncall,一天后什么都没干,一直等待家里的返回值,异步就是发个短信通知下家里就行了,不需要返回值,就去做其他的事情了.

29.git?
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。
集中式:远程服务器保存所有版本,用户客户端有某个版本
分布式:远程服务器保存所有版本,用户客户端有所有版本
git工作原理:


16627003-582c96f99b142397.png
image.png

30.Web中Redis如何实现缓存?

一.首先你需要明白,为什么要在你的项目中使用redis缓存?
现在很多应用程序要存储结构简单更新频繁的数据,在我看来,字典表里的数据就是存储结构简单且更新频繁的数据,因此,需要读取字典表里的数据时,可以考虑使用redis了。

31.简述栈,队列,deque双端队列的区别和联系?
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
deque 即双端队列。是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,相比list增加[]运算符重载。
队列是一种特殊的[线性表],特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
数据结构:堆(Heap)计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
一、二叉树的概念:一棵二叉树是节点的一个有限集合,该集合或者为空,或者由一个根节点加上两棵左子树和右子树组成
二、二叉树的特点:
1、每个节点最多有两棵子树,即二叉树不存在度大于2的节点
2、二叉树的子树有左右之分,其子树的次序不能颠倒
三、二叉树的形式:


16627003-896b22620a5965ca
image
  1. 关于字典推导式
    字典推导式格式 : {key:value for循环 if判断}
    dict1 = {“name”: “zhangsan”, “age”: 18}
    dict2 = {value: key for key, value in dict1.items()}
    print(dict2)
    理解:
    value:key 键值对互换
    for key,value in dict.items()
    把dict1 这个字典先分解成一个元祖,元祖自动解包得出({name:zhangsan},{age:18})
    最后把他们得键值对互换

33.什么是蓝图?
在Flask项目中可以用Blueprint(蓝图)实现模块化的应用,使用蓝图可以让应用层次更清晰,开发者更容易去维护和开发项目。蓝图将作用于相同的URL前缀的请求地址,将具有相同前缀的请求都放在一个模块中,这样查找问题,一看路由就很快的可以找到对应的视图,并解决问题了。
链接:https://www.jianshu.com/p/240d936981a1

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值