江湖

因为爱,所以爱

  • 主页
  • 归档
  • 目录
所有文章 友链 关于我

江湖

  • 主页
  • 归档
  • 目录

面试集锦

2019-11-20
字数统计: 2.7k字   |   阅读时长: 12分

本人总结的一些python面试题,希望你可以获得收获!

第一阶段 Python基础

  1. for循环的坑

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
       for i in "你好呀":
    pass
    print(i)

    --------------------
    lst = []
    for i in lst:
    lst.appent('alex')
    print(lst)
    # 不会打印内容,因为lst是空的,循环不起来

    ------------------------
    lst = [1,2]
    for i in lst:
    lst.append('33')
    print(lst)
    # 循环打印lst中的内容 --此循环是死循环

    --------------------------
    lst = [1,2]
    for i in lst:
    lst.append('333')
    print(lst)
    # 死循环,不会打印内容

    --------------------------
    lst = []
    for i in range(5):
    lst.append([])
    print(lst)
    # [[],[],[],[],[]]

    ----------------------------
    lst = [1,2]
    lst[0] = lst
    print(lst)
    # [[……],2]
  1. 整数和布尔值的转换

    1
    2
    bin(56) -- 十进制转二进制
    int('1011', 2) -- 二进制转十进制
  2. 一行代码互换a,b

    1
    2
    3
    a, b = 10, 20
    a, b = b, a
    print(a, b)
  3. 一句代码将lst去重

    1
    2
    lst = [23,4,2342,34,2234,34,2,1,234,2,23,12,1,21,12]
    print(list(set(lst)))
  4. 字典的创建方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1. 通过fromkeys生成字典
    dic = dict.fromkeys("abc",[])
    **注意,我这儿用dic接收了
    dic['a'].append(1)
    print(dic)
    # {'a': [3], 'b': [3], 'c': [3]} 可迭代,主要

    2. 通过字典生成式
    dic = {i:i*i for i in range(10)}

    3. dict生成
    dic = dict(a=1,b=2,c=3)
  5. 删除列表的坑(要记住,列表和字典是可变数据类型)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    lst = [1, 2]
    for i in lst:
    lst.append(3)
    print(lst) # 死循环

    -------------------
    lst = [1,2,3,4,5]
    for i in lst:
    lst.pop()
    print(lst) # [1,2]


    lst = [1,2,3,4]
    for i in lst:
    lst.pop(0)
    print(lst) # [3,4]
  1. 成功删除的方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # 列表
    lst = [1,2,3,4,5,6]
    for i in range(len(lst)):
    lst.pop()
    print(lst)

    -------------------------
    lst = [1,2,3,4,5,6]
    for i in range(len(lst)-1, -1, -1):
    del lst[i]
    print(lst)

    ----------------------------
    lst = [1,2,3,4,5,6]
    lst1 = lst.copy()
    for i in lst1:
    lst.remove(i)
    print(lst)

    --------------------------------
    # 字典
    dic = dict.fromkeys('2345678',1)
    dic1 = dic.copy()
    for i in dic1:
    dic.pop(i)
    print(dic)

    -------------------------------
    dic = {}
    dic.fromkeys('abc',[])
    print(dic) # {} 一定要仔细,这个没有给原来的dic赋值,所以上面的语句跟dic没关系

第二阶段 函数

1. 三元运算

1
2
a, b = 0, 2
print(a if a > b else b)

2. lambda 表达式

3. yield关键字

第三阶段 面向对象

1.构造函数和析构函数

1
2
3
4
5
6
7
8
9
10
11
12
** 构造函数,用于创建对象的函数
** 析构函数,用于销毁对象的函数

class Foo(object):
def __new__(self, *args, **kwargs): # 构造函数
pass

def __del__(self, *args, **kwargs): # 析构函数
pass

obj = Foo()
del obj

2.重写和重载的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
** 重载
class Foo(object):
def f1(self, int a1):
return 123

def f1(self, int a1, float a2):
return 345

重载,函数名相同而参数类型/个数/返回值不同。

** 重写
class Foo(object):
def f1(self):
print(123)

class Bar(Foo):
def f1(self):
print(666)

重写,在子类中对父类中的方法进行重写

3.什么是接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Interface Iperson:
def f1(self,a1)

def f2(self,a1)

public interface Predator {
boolean chasePrey(Prey p);
void eatPrey(Prey p);
}

接口就是以interface关键字开头,内部可以定义方法,但方法中不用写具体实现,他的作用,专门用来约束实现他的类,Python中没有接口类型。

class UserInfo(IPerson): # UserInfo类实现了IPerson接口
def f1(self,a1):
return 123

def f2(self,a1):
print("sdf")
return 666

4.Python的类执行多继承/其他语言不支持多继承

1
2
3
4
5
6
7
8
9
10
11
12
13
# Python
class Foo(Base,NewBase):
pass

# 其他
class Base:
pass

class NewBase(Base):
pass

class Foo(NewBase):
pass

5. 在其他语言中 可以实现多个接口/不可以继承多个类

1
2
3
4
5
6
7
8
9
10
# Java
interface IBase:
def f1(self)

interface INewBase:
def f2(self)

class Foo(IBase, INewBase):
def f1(self):
pass

6. 抽象类和抽象方法

抽象类:使用元类来描述父类。在元类中给出一个抽象方法。这样子类就不得不给出抽象类方法的具体实现,也可以起到约束作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# java
abstrac class Base(object): # 抽象类
def f1(self): # 普通方法
print(123)

def abstract f2(self): # 抽象方法,内部不能写任何代码
pass

class Foo(Base):

def f2(self):
print(123)

obj = Foo()
obj.f2()
obj.f1()

# python
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 抽象类,接口类,规范和约束,metaclass-->指定的是一个元类
@abstractmethod
def pay(self): pass # 抽象方法

class WebChat(Payment):
def recharge(self): pass

obj = WebChat() # 实例化就报错 抽象类的概念处理

第四阶段 高级编程

1. 进程和线程的区别?

  • 模块
  • 网络
  • 并发

第五阶段 数据库

1.数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
数据库设计:博客系统 / 呼啦圈
SQL语句:
select * from user left join depart on user.depart_id = depart.id

select * from user left join depart on user.depart_id = depart.id order by id desc

inner join 和 left join的区别?

select gender,count(1) from user group by gender

select gender,count(1) from user group by gender having count(1) > 2

视图:是一个虚拟的表。
为某个sql语句取名字: select * from user where id<100 ====> t1
select * from t1 where name = '成说'、
存储过程:是大堆存储在数据库中的SQL语句。
create producer pro(x1):
update ...
delete ...
select ...
触发器:存储在数据中的一个特殊的东西。
create trigger x1 before insert 表:
....
create trigger x1 after insert 表:

2. redis

如何在不重启的情况下,将rdb持久化切换成aof持久化?
  1. 准备一个rdb的redis数据库

  2. 通过命令直接切换aof

    127.0.0.1:6379> CONFIG set appendonly yes #开启AOF功能
    OK
    127.0.0.1:6379> CONFIG SET save “” #关闭RDB功能
    OK

  3. 正确情况下,会生成aof日志文件了,此时命令操作都是在aof里面了

  4. 还得修改配置文件,以上命令只是临时生效,改完以后,下次指定配置文件启动,就一直是aof了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >    port 6379
    > logfile /data/6379/redis.log
    > dir /data/6379
    > dbfilename dbmp.rdb
    > save 900 1
    > save 300 10
    > save 60 10000
    > daemonize yes
    > appendonly yes
    > appendfsync everysec
    >

第六阶段 前端&django

1.在浏览器上输入www.xxx.com发生了什么?

1
2
3
- dns解析:将域名www。xxx。com解析成ip地址,首先从浏览器缓存找域名对应的ip,找不到的话会到hosts文件中找,接下来才到你配置的dns中找,找不到的话继续向它上级dns找,直到根dns,还是没找到的话就报错,寻找dns一般用udp协议
- 本质通过socket进行通信
- 请求到达框架,按照django请求生命周期走...

2.http和https的区别?

1
2
3
4
5
http:默认端口  80
https:默认端口 443

http的数据是基于明文传输 不安全 被中间人截获没有隐私可言
https的数据是基于密文传输 较为安全 被中间人截获之后也只能得到密文

http和https区别详解

3.cookie和session的区别

1
2


4.get和post的区别

1
2


第七阶段 crm

第八阶段 drf

第九阶段 cmdb

第十阶段 flask

1.编程语言及他们之间的区别?

1
2
3
4
5
6
C/C++,很多语言的底层实现都是c,代码执行效率高,自己做内存管理,对代码要求比较高,很多功能需要手动实现。
Java,比较好的编程语言,很多企业级应用都会选择java。
C#,是微软开始的编程语言,部署是需要放在window server上,最大弊端是window系统花钱
PHP,一般用于快速搭建网站,漏洞也比较多
Python,简洁且入门简单,很少的代码就可以做很多事情。
Golang,语法和c比较接近,处理并发时比较有优势 + docker

2.数据库连接池

0x01 初级阶段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pymysql
from flask import Flask

app = Flask(__name__)


def fetchall(sql):
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
cursor.close()
conn.close()
return result

@app.route('/login')
def login():
result = fetchall('select * from user')
return 'login'


@app.route('/index')
def index():
result = fetchall('select * from user')
return 'xxx'


@app.route('/order')
def order():
result = fetchall('select * from user')
return 'xxx'


if __name__ == '__main__':
app.run()

0x02 给老版做修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import pymysql
from flask import Flask

app = Flask(__name__)

CONN = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')

def fetchall(sql):
cursor = CONN.cursor()
cursor.execute(sql)
result = cursor.fetchall()
cursor.close()
return result

@app.route('/login')
def login():
result = fetchall('select * from user')
return 'login'


@app.route('/index')
def index():
result = fetchall('select * from user')
return 'xxx'


@app.route('/order')
def order():
result = fetchall('select * from user')
return 'xxx'


if __name__ == '__main__':
app.run()

0x03 数据库连接池

安装

1
2
pip3 install dbutils
pip3 install pymysql

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pymysql
from DBUtils.PooledDB import PooledDB

POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的链接,0表示不创建
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always

host='127.0.0.1',
port=3306,
user='root',
password='222',
database='cmdb',
charset='utf8'
)

# 去连接池中获取一个连接
conn = POOL.connection()

cursor = conn.cursor()
cursor.execute('select * from web_models_disk')
result = cursor.fetchall()
cursor.close()

# 将连接放会到连接池
conn.close()

print(result)

0x04 多线程测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pymysql
from DBUtils.PooledDB import PooledDB

POOL = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=6, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=2, # 初始化时,链接池中至少创建的链接,0表示不创建
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always

host='127.0.0.1',
port=3306,
user='root',
password='222',
database='cmdb',
charset='utf8'
)


def task(num):
# 去连接池中获取一个连接
conn = POOL.connection()
cursor = conn.cursor()
# cursor.execute('select * from web_models_disk')
cursor.execute('select sleep(3)')
result = cursor.fetchall()
cursor.close()
# 将连接放会到连接池
conn.close()
print(num,'------------>',result)


from threading import Thread
for i in range(57):
t = Thread(target=task,args=(i,))
t.start()

0x05 基于函数实现sqlhelper

1
2


4.dr如何帮助我们快速开发的?drf提供了哪些功能?

1
2
3
4
5
6
7
8
9
- 视图,APIView
- 解析器,根据用户请求体格式不同进行数据解析,解析之后放在request.data中。
在进行解析时候,drf会读取http请球头 content-type.
如果content-type:x-www-urlencoded,那么drf会根据&符号分割的形式去处理请求体
user=wang&age=19
如果content-type:application/json,那么drf会根据json形式去处理请求体。
{"user":"alex","age":19}
- 序列化:many=True or False (多个数据或单个数据)
- 渲染器,可以帮我们把json数据渲染到页面上进行友好的展示。(内部会根据请求设备不同做不同的展示)
  1. 序列化:展示特殊的数据(choices、FK、M2M)可使用

    1
    2
    3
    depth
    source,无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。【fk/choice】
    SerializerMethodField,定义钩子方法。【m2m】
  2. 序列化的一些其他用法

1
2
3
4
5
6
7
8
9
10
11
12
13
class NewArticleSerializer(serializers.ModelSerializer):
tag_info = serializers.SerializerMethodField()
class Meta:
model = models.Article
fields = ['title','summary','tag_info']

def get_tag_info(self,obj):
return [row for row in obj.tag.all().values('id','title')]

class FormNewArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = '__all__'

扩展

  • 随笔
git工具的使用
drf总结草稿
© 2020 江湖
Hexo Theme Yilia by Litten
 | 10098    | 9541
  • 所有文章
  • 友链
  • 关于我

tag:

  • python
  • flask
  • 目录
  • drf
  • django
  • restful
  • 技术
  • linux
  • 虚拟环境
  • nginx
  • saltstack
  • redis
  • 单例模式
  • websocket,django
  • 项目,drf,restful
  • 收藏夹
  • rpc
  • docker
  • rebbitmq
  • 随笔
  • 并发编程

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • django信号、缓存和读写分离

    2019-12-27

    #django

  • 2019-12-26

  • 干货链接/收藏夹

    2019-12-18

    #收藏夹

  • nginx+uwsig+crm+mysql+virtualenv+supervisor

    2019-12-15

    #linux#nginx

  • saltstack日常学习

    2019-12-15

    #linux#saltstack

  • rpc远程调用

    2019-12-12

    #linux#rpc

  • redis主从复制、哨兵和集群

    2019-12-12

    #linux#redis

  • 消息队列之rabbitmq学习使用及消息持久化

    2019-12-12

    #linux#rebbitmq

  • docker全部知识点总结

    2019-12-07

    #docker

  • redis持久化存储之AOF+RDB

    2019-12-02

    #linux#redis

  • 通过django+channels+websocket实现网络聊天室

    2019-11-25

    #websocket,django

  • drf系列总结目录

    2019-11-24

    #python#目录#drf#django#restful

  • flask剖析第六说--Flask源码之:路由加载

    2019-11-22

    #python#flask

  • flask剖析第四说--LocalStack和Local对象实现栈的管理

    2019-11-22

    #python#flask

  • flask剖析第二说--快速使用flask

    2019-11-22

    #python#flask

  • flask剖析第五说--Flask源码之:配置加载

    2019-11-22

    #python#flask

  • flask剖析第三说--threading.local和高级方法

    2019-11-22

    #python#flask

  • SqlHelper--单例模式

    2019-11-22

    #python#单例模式

  • flask剖析第一说--通过werkzurg了解wsgi

    2019-11-22

    #python#flask

  • drf源码分析第八说 -- Jwt认证

    2019-11-22

    #python#drf#django

  • linux--虚拟环境搭建python-django项目

    2019-11-22

    #linux#虚拟环境

  • git工具的使用

    2019-11-22

    #技术

  • 面试集锦

    2019-11-20

    #随笔

  • drf总结草稿

    2019-11-20

    #drf#django

  • drf源码分析第六说 -- 权限

    2019-11-19

    #python#drf#django

  • drf源码分析第七说 -- 节流/频率限制

    2019-11-19

    #python#drf#django

  • drf源码分析第五说--认证

    2019-11-17

    #python#drf#django

  • drf源码分析第四说 -- 简单视图流程/api/版本管理

    2019-11-17

    #python#drf#django

  • drf源码分析第三说--分页

    2019-11-16

    #python#drf#django

  • functools中偏函数及示例源码

    2019-11-15

    #flask

  • drf源码分析第二说 -- 快速上手drf

    2019-11-14

    #python#drf#django

  • drf源码分析第一说--restful规范

    2019-11-13

    #python#drf

  • 呼啦圈项目总结草稿

    2019-11-08

    #项目,drf,restful

  • flask请求生命周期

    2019-11-05

    #flask

  • Flask从入门到放弃目录

    2019-10-21

    #python#flask#目录

  • 进程

    2019-10-17

    #并发编程

  • 协程

    2019-10-17

    #并发编程

  • Hello World

    2019-08-22

  • my-first-blog

    2019-08-22

    #技术

  • CSDN
  • 博客园
  • 林殊途
遮浪加西浪啊,快哇波为刚啊
这条大路遮两崩啊,给里不噶两崩啊
嗯gia嗯gia 就嗯gia 蛙洗好桑gia
宏大驴大咧头大 我就西嘎发bia