python常见的面试题一

*****以下资料来源于互联网

1.单词反转
不使用任何库函数,将给定字符串按单词反转
输入格式是:“this is a string”
输出格式是: “string a is this”

data="this is a string"
print(data[::-1])       #按照字母反转
print(' '.join(data.split()[::-1]))    #按照单词反转
结果是:
gnirts a si siht
string a is this


2。什么是先序、中序、后序。

先序、中序、后序是二叉树的遍历规则。
二叉树遍历的定义:按照一定的规律不重复地访问(或取出结点中的信息,或对结点作其它的处理)二叉树中的每一个结点。
前序遍历的规则如下:
若二叉树为空,则退出。否则
⑴访问处理根结点;
⑵前序遍历左子树;
⑶前序遍历右子树;
特点:由左而右逐条访问由根出发的树支 (回溯法的基础)
中序遍历的规则:
若二叉树为空,则退出;否则
⑴中序遍历左子树;
⑵访问处理根结点;
⑶中序遍历右子树;
后序遍历的规则如下:
若二叉树为空,则退出;否则
⑴后序遍历左子树;
⑵后序遍历右子树;
⑶访问处理根结点;

3.新类和旧类

Python中类分为新式类和旧式类。
1.新式类都从object继承,经典类不需要。
2.新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。
3.新式类相同父类只执行一次构造函数,经典类重复执行多次。

!!!!!Python 2.x中默认都是经典类,只有显式继承了object才是新式类
!!!!!Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object

4.django如何实现邮箱手机号都能登陆

首先在settings.py加一行代码:
AUTHENTICATION_BACKENDS=['users.views.CustomBackend' , ]
括号内必须有逗号
在views.py中加代码:

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q #起作用的模块!!!!!
from .models import User   #你的用户

class Loginuser(ModelBackend):
    """邮箱和用户名都能登陆"""
    def login(self, request, username=None, password=None, **kwargs):
        try:
            #设置用户名和邮箱都能登陆
            user=User.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

5.求平衡点

平衡点就是假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点。例如:一个列表numbers = [1, 3, 5, 7, 8, 25, 4, 20]。25前面的总和为24,25,后面的总和也是24,那么这个点就是平衡点。 
实现代码如下:
def balance_point(thy_list):
    num = len(thy_list)
    if num >= 3:
        for i in range(num):
            if i == 0:
                pass
            else:
                list1 = thy_list[:i]  # 将传入的列表切片,将一个列表分成2个列表
                list2 = thy_list[i+1:]
                sum1 = sum(list1)   # 对切片后的列表分别求和
                sum2 = sum(list2)
                if sum1 == sum2:
                    return '平衡点:%d,其值为%d' % (i, thy_list[i])
        return '无平衡点'
    else:
        return '列表长度不够!'


if __name__ == '__main__':
	print(balance_point([1, 3, 5, 7, 8, 25, 4, 20]))

6.如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?

for a in range(1001):
    for b in range(1001):
        c = 1000 - a - b
        if a**2 + b**2 == c**2:
            print(a,b,c)
        else:
            pass

7.对数据结构了解吗?有哪些数据结构?

在数据结构中,从逻辑上可以将其分为线性结构和非线性结构。常用的结构有链表和二叉树结构。链表是连续型数据结构,b树是非线性数据结构。

8.蓝图的作用是什么?

用于实现单个应用的视图、模板、静态文件的集合。一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。可以帮助我们实现模块化应用的功能。

9.知道线程、进程吗?它们的区别?了解gil锁?了解协程吗?

线程进程的区别是:
1.一个进程可以有多个线程,这些线程共用一个内存空间。
2.多线程比多进程执行效率高,但是由于共享内存,一旦子线程挂了,就全挂了。
3.多线程如果在多核cpu上同时执行,单个cpu上使用多线程通常会有线程等待。
Io密集型任务主要需要IO的读取,利用CPU的效率较低,大量时间花费在IO上。使用多进程优势,计算密集型需要等待计算结果,所以哪种方式都不太占优势,相对来说线程消耗资源少,一般使用使用线程。

GIL锁是性能与资源的平衡,解决线程死锁问题。在遇到 I/O 操作时会释放这把锁。如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁。

协程相当于线程,只是多了一个yield函数。

10.http状态码都代表什么意思?

100字段是客户端请求;
200字段表示请求成功;
300字段表示重定向;
400字段表示请求出错;
500字段表示服务器内部出错。

11.编写一个search(s)的函数,将当前目录及其所有子目录下查找文件名包含指定字符串的文件,打印完整路径.

import os, logging

def search(s):
    rootdir = '.'       # 指明被遍历的文件夹

    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
    for parent,dirnames,filenames in os.walk(rootdir):
         for filename in filenames:      #输出文件信息
            #print "filename is:" + filename
            if filename.find(s) != -1:
                print "the full path of the file is:" + os.path.abspath(os.path.join(parent,filename)) #输出文件路径信息

if __name__ == '__main__':
    search('test')


12.new __init__区别

__init__的意义是类实例创建的时候自动执行,初始化实例的值。
__new__的意义是创建一个类的实例。
1、继承自object的新式类才有__new__。
2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别。
3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例。
4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。
5、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

13.静态方法的应用场景?类方法的应用场景?

'''
实例方法,第一个参数必须要默认传实例对象,一般习惯用self。
静态方法,参数没有要求。
类方法,第一个参数必须要默认传类,一般习惯用cls。
'''
1、对于不需要访问实例属性和类属性的函数定义成静态函数。
2、需要访问类属性的定义成类函数。
3、需要访问实例属性的定义成实例函数。
静态方法一般做工具使用,因为会被频繁调用。
类方法一般是需要更新功能时使用,一般情况下很少用。

14.表关联有几种方式?

表关联方式内联、外联、自联。一般是主外键关联,主外键关联方式有一对一、一对多、多对多。

15.数据库优化方式?

1.开启查询缓存。
2.精简索引。
3.查询方式尽量不用全局匹配,用精确匹配。
4.数据如果过大就分库。
5.尽量不要滥用高阶函数。

16.mysql的数据引擎有哪些?

常用的数据引擎有myisam和innodb。
默认是myisam。
myisam适合大量数据的查询。对于批量io操作效率不高,因为myisam运行的时候会锁住整个表,而且不会保存外键关系。
innodb原理比myisam复杂,比myisam写的操作效率高,因为innodb运行时候锁住行。

17.数据库怎么设计的?

数据库模型是E-R模型,用ERWin或PowerDesigner来建立模型。

18.权限认证怎么做的?

一般用基于django自带的框架,自定义权限认证逻辑。或者基于RBAC角色控制权限设置。

19.熟不熟悉docker?

docker是一个打包工具。docker部署很方便,把docker打包的镜像复制到运行环境直接运行。打包环境跟运行环境必须一致。特点是一次构建多次交付。docker分为镜像、容器、仓库。

20.逻辑判断题:

a\b\c\d中有一个是小偷,审讯结果是:
a说我不是小偷。 
b说c是小偷 。
c说小偷肯定是d 。
d说c胡说! 
其中三个人说的是实话,一个人说的是假话。判断谁是小偷。
for x in ['a','b','c','d']:
	y = (x!='a')+(x=='c')+(x=='d')+(x!='d')
	if y = 3:
		print ("小偷是:%s" %x)
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值