精心整理的 Python 相关的基础知识,用于面试,或者平时复习,都是很好的!废话不多说,直接开搞
由于文章过长,萝卜哥也贴心的把文章整理成了PDF文档,在文末查看获取方式
- 基础篇
- 1. 为什么学习 Python
- 2. 解释型和编译型语言的区别
- 3. 简述下 Python 中的字符串、列表、元组和字典
- 4. 简述上述数据类型的常用方法
- 5. 简述 Python 中的字符串编码
- 6.一行代码实现数值交换
- 7. is 和 == 的区别
- 8.Python 函数中的参数类型
- 9.`*arg` 和 `**kwarg` 作用
- 10.一行代码实现1-100之和
- 11.获取当前时间
- 12.PEP8 规范
- 13.Python 的深浅拷贝
- 14.查看下面代码的输出
- 15.可变类型与不可变类型
- 16.打印九九乘法表
- 17.filter、map、reduce 的作用
- 18.re 的 match 和 search 区别
- 19.面向对象中`__new__` 和 `__init__` 区别
- 20.三元运算规则
- 21.生成随机数
- 22.zip 函数用法
- 23.range 和 xrange 的区别
- 24.with 方法打开文件的作用
- 25.什么是正则的贪婪匹配
- 26.为什么不建议函数的默认参数传入可变对象
- 27.字符串转列表
- 28.字符串转整数
- 29.删除列表中的重复值
- 30.字符串单词统计
- 31.列表推导,求奇偶数
- 32.一行代码展开列表
- 33.实现二分法查找函数
- 34.字典和 json 转换
- 35.列表推导式、字典推导式和生成器
- 36.简述 read、readline、readlines 的区别
- 37.打乱一个列表
- 38.反转字符串
- 39.单下划线和双下划线的作用
- 40.新式类和旧式类
- 41.Python 面向对象中的继承有什么特点
- 42.super 函数的作用
- 43.类中的各种函数
- 44.如何判断是函数还是方法
- 45.isinstance 的作用以及与 type()的区别
- 46.单例模式与工厂模式
- 47.查看目录下的所有文件
- 48.计算1到5组成的互不重复的三位数
- 49.去除字符串首尾空格
- 50.去除字符串中间的空格
- 51. 字符串格式化方式
- 52. 将"hello world"转换为首字母大写"Hello World"(不使用 title 函数)
- 53. 一行代码转换列表中的整数为字符串
- 54. 合并两个元组到字典
- 55. 给出如下代码的输入,并简单解释
- 56. Python 中的反射
- 57. 实现一个简单的 API
- 58. metaclass 元类
- 59. sort 和 sorted 的区别
- 60. Python 中的 GIL
- 61. 产生8位随机密码
- 62. 输出原始字符
- 63. 列表内,字典按照 value 大小排序
- 64. 简述 any() 和 all() 方法
- 65. 反转整数
- 66. 函数式编程
- 67. 简述闭包
- 68. 简述装饰器
- 69. 协程的优点
- 70. 实现一个斐波那契数列
- 71. 正则切分字符串
- 72. yield 用法
- 73. 冒泡排序
- 74. 快速排序
- 75. requests 简介
- 76. 比较两个 json 数据是否相等
- 77. 读取键盘输入
- 78. enumerate
- 79. pass 语句
- 80. 正则匹配邮箱
- 81. 统计字符串中大写字母的数量
- 82. json 序列化时保留中文
- 83. 简述继承
- 84. 什么是猴子补丁
- 85. help() 函数和 dir() 函数
- 86. 解释 Python 中的`//`,`%`和`**`运算符
- 87. 主动抛出异常
- 88. tuple 和 list 转换
- 89. 简述断言
- 90. 什么是异步非阻塞
- 91. 什么是负索引
- 92. 退出 Python 后,内存是否全部释放
- 93. Flask 和 Django 的异同
- 94. 创建删除操作系统上的文件
- 95. 简述 logging 模块
- 96. 统计字符串中单词出现次数
- 97. 正则 re.complie 的作用
- 98. try except else finally 的意义
- 99.反转列表
- 100. 字符串中数字替换
- 综合篇:网络编程
- 101. 简述 OSI 七层协议
- 102. 三次握手、四次挥手的流程
- 103. 什么是 C/S 和 B/S 架构
- 104. TCP 和 UDP 的区别
- 105. 局域网和广域网
- 106. arp 协议
- 107. 什么是 socket?简述基于 TCP 协议的套接字通信流程
- 108. 简述 进程、线程、协程的区别以及应用场景
- 109. 如何使用线程池和进程池
- 110. 进程之间如何进行通信
- 111. 进程锁和线程锁
- 112. 什么是并发和并行
- 113. threading.local 的作用
- 114. 什么是域名解析
- 115. LVS 是什么及作用
- 116. Nginx 的作用
- 117. keepalived 及 HAProxy
- 118. 什么是 rpc
- 119. 从浏览器输入一个网址到展示网址页面的过程
- 120. 什么是cdn
- 综合篇:数据库和框架
- 121. 列举常见的数据库
- 122. 数据库设计三大范式
- 123. 什么是数据库事务
- 124. MySQL 索引种类
- 125. 数据库设计中一对多和多对多的应用场景
- 126. 简述触发器、函数、视图、存储过程
- 127. 常用 SQL 语句
- 128. 主键和外键的区别
- 129. 如何开启 MySQL 慢日志查询
- 130. MySQL 数据库备份命令
- 131. char 和 varchar 的区别
- 132. 最左前缀原则
- 133. 无法命中索引的情况
- 134. 数据库读写分离
- 135. 数据库分库分表
- 136. redis 和 memcached 比较
- 137. redis中数据库默认是多少个 db 及作用
- 138. redis 有哪几种持久化策略
- 139. redis 支持的过期策略
- 140. 如何保证 redis 中的数据都是热点数据
- 141. Python 操作 redis
- 142. 基于 redis 实现发布和订阅
- 143. 如何高效的找到 redis 中的某个 KEY
- 144. 基于 redis 实现先进先出、后进先出及优先级队列
- 145. redis 如何实现主从复制
- 146. 循环获取 redis 中某个非常大的列表数据
- 147. redis 中的 watch 的命令的作用
- 148. redis 分布式锁
- 149. http 协议
- 150. uwsgi,uWSGI 和 WSGI 的区别
- 151. HTTP 状态码
- 152. HTTP常见请求方式
- 153. 响应式布局
- 154. 实现一个简单的 AJAX 请求
- 155. 同源策略
- 156. 什么是 CORS
- 157. 什么是 CSRF
- 158. 前端实现轮询、长轮询
- 159. 简述 MVC 和 MTV
- 160. 接口的幂等性
- 161. Flask 框架的优势
- 162. 什么是 ORM
- 163. PV、UV 的含义
- 164. supervisor 的作用
- 165. 使用 ORM 和原生 SQL 的优缺点
- 166. 列举一些 django 的内置组件
- 167. 列举 Django 中执行原生 sql 的方法
- 168. cookie 和 session 的区别
- 169. beautifulsoup 模块的作用
- 170. Selenium 模块简述
基础篇
1. 为什么学习 Python
Python 语言简单易懂,上手容易,随着 AI 风潮,越来越火
2. 解释型和编译型语言的区别
编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++ 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python, (Java 有些特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。)
3. 简述下 Python 中的字符串、列表、元组和字典
字符串(str):字符串是用引号括起来的任意文本,是编程语言中最常用的数据类型
列表(list):列表是有序的集合,可以向其中添加或删除元素
元组(tuple):元组也是有序集合,但是是无法修改的。即元组是不可变的
字典(dict):字典是无序的集合,是由 key-value 组成的
集合(set):是一组 key 的集合,每个元素都是唯一,不重复且无序的
4. 简述上述数据类型的常用方法
字符串:
-
切片
mystr='luobodazahui'
mystr[1:3]
output
'uo'
-
format
mystr2 = "welcome to luobodazahui, dear {name}"
mystr2.format(name="baby")
output
'welcome to luobodazahui, dear baby'
-
join
可以用来连接字符串,将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
mylist = ['luo', 'bo', 'da', 'za', 'hui']
mystr3 = '-'.join(mylist)
print(mystr3)
outout
'luo-bo-da-za-hui'
-
replace
String.replace(old,new,count) 将字符串中的 old 字符替换为 New 字符,count 为替换的个数
mystr4 = 'luobodazahui-haha'
print(mystr4.replace('haha', 'good'))
output
luobodazahui-good
-
split
切割字符串,得到一个列表
mystr5 = 'luobo,dazahui good'
# 以空格分割
print(mystr5.split())
# 以h分割
print(mystr5.split('h'))
# 以逗号分割
print(mystr5.split(','))
output
['luobo,dazahui', 'good']
['luobo,daza', 'ui good']
['luobo', 'dazahui good']
列表:
-
切片 同字符串 -
append 和 extend 向列表中国添加元素
mylist1 = [1, 2]
mylist2 = [3, 4]
mylist3 = [1, 2]
mylist1.append(mylist2)
print(mylist1)
mylist3.extend(mylist2)
print(mylist3)
outout
[1, 2, [3, 4]]
[1, 2, 3, 4]
-
删除元素 del:根据下标进行删除 pop:删除最后一个元素 remove:根据元素的值进行删除
mylist4 = ['a', 'b', 'c', 'd']
del mylist4[0]
print(mylist4)
mylist4.pop()
print(mylist4)
mylist4.remove('c')
print(mylist4)
output
['b', 'c', 'd']
['b', 'c']
['b']
-
元素排序 sort:是将list按特定顺序重新排列,默认为由小到大,参数 reverse=True 可改为倒序,由大到小。 reverse:是将list逆置
mylist5 = [1, 5, 2, 3, 4]
mylist5.sort()
print(mylist5)
mylist5.reverse()
print(mylist5)
output
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
字典:
-
清空字典 dict.clear()
dict1 = {
'key1':1, 'key2':2}
dict1.clear()
print(dict1)
output
{}
-
指定删除 使用 pop 方法来指定删除字典中的某一项
dict1 = {
'key1':1, 'key2':2}
d1 = dict1.pop('key1')
print(d1)
print(dict1)
output
1
{'key2': 2}
-
遍历字典
dict2 = {
'key1':1, 'key2':2}
mykey = [key for key in dict2]
print(mykey)
myvalue = [value for value in dict2.values()]
print(myvalue)
key_value = [(k, v) for k, v in dict2.items() ]
print(key_value)
output
['key1', 'key2']
[1, 2]
[('key1', 1), ('key2', 2)]
-
fromkeys 用于创建一个新字典,以序列中元素做字典的键,value 为字典所有键对应的初始值
keys = ['zhangfei', 'guanyu', 'liubei', 'zhaoyun']
dict.fromkeys(keys, 0)
output
{'zhangfei': 0, 'guanyu': 0, 'liubei': 0, 'zhaoyun': 0}
5. 简述 Python 中的字符串编码
计算机在最初的设计中,采用了8个比特(bit)作为一个字节(byte)的方式。一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节
最早,计算机只有 ASCII 编码,即只包含大小写英文字母、数字和一些符号,这些对于其他语言,如中文,日文显然是不够用的。后来又发明了Unicode,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。UTF-8 是隶属于 Unicode 的可变长的编码方式
在 Python 中,以 Unicode 方式编码的字符串,可以使用 encode() 方法来编码成指定的 bytes,也可以通过 decode() 方法来把 bytes 编码成字符串 encode
"中文".encode('utf-8')
output
b'\xe4\xb8\xad\xe6\x96\x87'
decode
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
output
'中文'
6.一行代码实现数值交换
1a = 1
2b = 2
3a, b = b, a
4print(a, b)
output
12 1
7. is 和 == 的区别
先来看个例子
c = d = [1,2]
e = [1,2]
print(c is d)
print(c == d)
print(c is e)
print(c == e)
output
True
True
False
True
== 是比较操作符,只是判断对象的值(value)是否一致,而 is 则判断的是对象之间的身份(内存地址)是否一致。对象的身份,可以通过 id() 方法来查看
id(c)
id(d)
id(e)
output
88748080
88748080
88558288
可以看出,只有 id 一致时,is 比较才会返回 True,而当 value 一致时,== 比较就会返回 True
8.Python 函数中的参数类型
位置参数,默认参数,可变参数,关键字参数
9.*arg
和 **kwarg
作用
允许我们在调用函数的时候传入多个实参
def test(*arg, **kwarg):
if arg:
print("arg:", arg)
if kwarg:
print("kearg:", kwarg)
test('ni', 'hao', key='world')
output
arg: ('ni', 'hao')
kearg: {'key': 'world'}
可以看出, *arg
会把位置参数转化为 tuple **kwarg
会把关键字参数转化为 dict
10.一行代码实现1-100之和
sum(range(1, 101))
11.获取当前时间
import time
import datetime
print(datetime.datetime.now())
print(time.strftime('%Y-%m-%d %H:%M:%S'))
output
2019-06-07 18:12:11.165330
2019-06-07 18:12:11
12.PEP8 规范
简单列举10条:
-
尽量以免单独使用小写字母'l',大写字母'O',以及大写字母'I'等容易混淆的字母
-
函数命名使用全部小写的方式,可以使用下划线
-
常量命名使用全部大写的方式,可以使用下划线
-
使用 has 或 is 前缀命名布尔元素,如: is_connect = True; has_member = False
-
不要在行尾加分号, 也不要用分号将两条命令放在同一行
-
不要使用反斜杠连接行
-
顶级定义之间空2行, 方法定义之间空1行,顶级定义之间空两行
-
如果一个类不继承自其它类, 就显式的从object继承
-
内部使用的类、方法或变量前,需加前缀
_
表明此为内部使用的 -
要用断言来实现静态类型检测
13.Python 的深浅拷贝
浅拷贝
import copy
list1 = [1, 2, 3, [1, 2]]
list2 = copy.copy(list1)
list2.append('a')
list2[3].append('a')
print(list1, list2)
output
[1, 2, 3, [1, 2, 'a']] [1, 2, 3, [1, 2, 'a'], 'a']
能够看出,浅拷贝只成功”独立“拷贝了列表的外层,而列表的内层列表,还是共享的
深拷贝
import copy
list1 = [1, 2, 3, [1, 2]]
list3 = copy.deepcopy(list1)
list3.append('a')
list3[3].append('a')
print(list1, list3)
output
[1, 2, 3, [1, 2]]