面试题

后续技术类文档更新到微信公众号-------->>喜欢的扫码关注

在这里插入图片描述

11. 请筛选年龄小于18或者大于40的Person
from django.db import models
class Person(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField()

当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象

fromdjango.db.modelsimports Q
q=Q(question_startswith="What")

生成了一个Q()对象,我们可以使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数。当多个Q()对象组合起来时,Django会自动生成一个新的Q()

from django.db.models import Q
from users.models import Person
Person.objects.all().filter(age__lt= 18) #条件 > 18 (age = 18) = 18 (age__gte = 18) >= 18
Person.objects.all().filter(Q(age__lt= 18) | Q(age__gt=40))

关于Q()对象的详细讲解

12. mysql数据库,分数表中有两个字段分别是name,score表示玩家姓名和分数。
表中有一亿数据,数据会变动。
现要求任给一个name,输出其名次。(请使用任何手段,提高查询效率)

查询效率慢的原因:
1:没有加索引或者索引失效
where条件使用如下语句会索引失效:null、!=、<>、or连接、in(非要使用,可用关键字exist替代)和not in、’%abc%’;
使用参数:num=@num、表达式操作:where num/2=100、函数操作:where substring(name,1,3)=‘abc’-name;
使用索引:

select id from table with(index(索引名)) where num=@num;

详细参见:MySQL千万级数据库查询怎么提高查询效率

13. linux下如何安装pip?如何使用requirements.txt?

Python 项目中可以包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便在新环境中进行部署操作。
在虚拟环境使用以下命令将当前虚拟环境中的依赖包以版本号生成至文件中:
pip freeze > requirements.txt
当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令:
pip install -r requirements.txt
在安装 Flask-MySQLdb 的时候可能会报错,可能是依赖包没有安装,执行以下命令安装依赖包:
sudo apt-get build-dep python-mysqldb

14. 试举例python中线程不安全的情况,如何避免?

一个银行账户,还有余额10000元,现在A通过银行卡从中取10000元,而同时另外一个人B通过存折也从这个账户中取10000元。取钱之前,要首先进行判断:如果账户中的余额大于要取的金额,则可以执行取款操作,否则,将拒绝取款。
我们假定有两个线程来分别从银行卡和存折进行取款操作,当A线程执行完判断语句后,获得了当前账户中的余额数(10000元),因为余额大于取款金额,所以准备执行取钱操作(从账户中减去10000元),但此时它被线程B打断,然后,线程B根据余额,从中取出10000元,然后,将账户里面的余额减去10000元,然后,返回执行线程A的动作,这个线程将从上次中断的地方开始执行:也就是说,它将不再判断账户中的余额,而是直接将上次中断之前获得的余额减去10000。此时,经过两次的取款操作,账户中的余额为0元,从账面上来看,银行支出了10000元,但实际上,银行支出了20000元

GIL: Global Interpreter Lock,全局解释器锁。为了解决多线程之间数据完整性和状态同步的问题,设计为在任意时刻只有一个线程在解释器中运行。
当对全局资源存在写操作时,如果不能保证写入过程的原子性,会出现脏读脏写的情况,即线程不安全。Python的GIL只能保证原子操作的线程安全,因此在多线程编程时我们需要通过加锁来保证线程安全。
最简单的锁是互斥锁(同步锁),互斥锁是用来解决io密集型场景产生的计算错误,即目的是为了保护共享的数据,同一时间只能有一个线程来修改共享的数据。

15. 如何搜索,安装python库,安装时遇到网络慢的情况如何解决。
  1. 直接使用pip install 安装python库或者在pycharm的settings的Project项目下的Project interperter里面搜索安装
  2. 去GitHub上搜索安装
  3. 在windows系统下可以去Unofficial Windows Binaries for Python Extension Packages提供的安装包下载之后进行安装
  4. 使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的烦恼。
    可以更换安装源;清华源;阿里源等一些国内源
  5. 临时使用方法
    比如我们需要安装 selenium 库,那么可以使用这样的安装命令
pip install  -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
16. 你使用什么手段(工具)来调试python程序?
  1. 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看
  2. 用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。
    断言
    凡是用print来辅助查看的地方,都可以用断言(assert)来替代
    assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。
    如果断言失败,assert语句本身就会抛出AssertionError:
  3. logging
    把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件
    logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
    logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
  4. pycharm中常使用断点调试
17. 当时用git pull 命令发生了什么?

一般会发生代码冲突
解决参考:关于使用命令解决git pull拉取代码时发生的冲突解决办法

18. 你目前如何测试google搜素引擎?

搜索引擎命令大全!
link:URL = 列出到链接到目标URL的网页清单.
related:URL = 列出于目标URL地址有关的网页.
site:http://domain.com 搜索区域仅限于目标网站.
allinurl:WORDS = 只显示在URL地址里有搜索结果的页面.
inurl:WORD = 跟allinurl类似,但是只在URL中搜索第一个词.
详细参见:google搜索引擎使用方法

19. python如何定位和解决bug?可举例说明。

在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办

第一我们先看看它的语法,语法很简单,就是在try-except中放入你想要执行的代码块,例如:

try:
  somecode1
except 异常类型/名称:
  somecode2

这是最简单的一种情况,如果情况复杂可以使用多个except句子,例如:

try:
  somecode0
except 异常类型/名称1:
  somecode1
except 异常2:
  somecode2
except 异常3:
  somecode3

接下来我们来看一个简单例子,读写文件我们经常的操作,一个常见的问题就是找不到文件,或者文件名称,路径不正确,对这种情况,你就可以采用try-except代码块直观的方式来处理了:

try:
  withopen(filename, 'r+') as fp:
    data = fp.read()
exceptIOError:
  msg = 'sorry, can not read or write this ' + filename
  print(msg)

except的例子,2个数字相减:

loop = 1
while loop == 1:
  try:
    a = input('请输入第一个数字> ')
    b = input('请输入第二个数字 > ')
  exceptNameError:
    print( "请输入数字,不能输入字母")
 continue
  exceptSyntaxError:
    print( "请仅输入一个数字.")
 continue
  print (a - b)
  try:
    loop = input('按1再开始 > ')
  except (NameError,SyntaxError):
    loop = 0

try-except还有更高级的用法,加入else,finally等:

try:
     Normal execution block
except A:
     Exception A handle
except B:
     Exception B handle
except:
     Other exception handle
else:
     if no exception,get here

finally:
     print(“finally”) 
20. 当你发现程序中有一条sql查询语句非常慢, 你将如何优化?

1:如果索引是复合索引,必须使用该索引的第一个字段作为条件才能保证系统使用该索引,否则索引不会被引用,并且应尽可能的让字段顺序与索引顺序一致。

2:索引并不是越多越好,一个表索引最好不要超过6个。索引固然可以提高select效率,但是也降低了insert效率和update效率,因为insert和update会使索引重建,所以怎么建索引需要慎重考虑。

3:建表的一些优化:

尽量使用数字型字段,若数据只含有数值信息尽量不要设计成字符型,这会降低查询和连接的性能,并会增加存储开销。因为引擎在处理查询和连接时会逐个比较字符串中每个字符,而对于数字型而言只需比较一次就够了。
尽量使用varchar/nvarchar代替char/nchar,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高一些。
4:任何地方都不要使用select * from table,用具体的字段列表代替*,不要返回用不到的任何字段。

5:尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

6:并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

7:尽量避免大事务操作,提高系统并发能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值