python --- 面试题 2019.01.03
一. redis 设置过期时间
1. redis 链接
redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接。同理,python的redis没有实现select命令。
2. redis设置过期时间
以字符串为例
1.set(key, value, ex=None, px=None)
ex—过期时间, 秒
px—过期时间,毫秒
set(‘jack’, ‘25’, ex=605) — 设置key为jack, value为25, 过期时间为60秒5, 当超过设置时间后, 删除该条数据, 返回nil。
redis命令
set ‘jack’ 25 EX 10 — 设置key为jack, value为25, 过期时间为10秒, 当超过设置时间后, 删除该条数据, 返回nil。
get ‘jack’ —查看, 如果在过期时间内返回value, 如果超过过期时间返回nul。
ttl ‘jack’ — 查看所剩过期时间, 如果在过期时间内返回 (integer) 剩余时间, 否则返回(integer) -2。
2. setex(key, value, time)
time --- 过期时间, 秒 set('jack', 25, 10) --- 设置key为jack, value为25, 过期时间为10秒, 当超过设置时间后, 删除该条数据, 返回nil。redis命令
setex key time value
setex ‘jack’ 10 25 — 设置key为jack, value为25, 过期时间为10秒, 当超过设置时间后, 删除该条数据, 返回nil。
查看方法相同。
二. 登录GET和POST区别
- get是从服务器上获取数据,post是向服务器传送数据。
- get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
- get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
- get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
others: 常见的请求方式
GET, POST, HEAD, OPTIONS, DELETE, PUT
三. python和go的区别
- 性能
- 快速的编译时间
- python 没有指针的概念
- 格式统一
- 编译生成可执行文件 等等…
四. 生成器和迭代器
- 迭代器 Iterator
可以被for循环的对象称为可迭代对象。
判断一个对象是否可以迭代可以用for循环, 以及 isinstance 方法。
终端输入ipython3 — 几个案例
In [1]: import collections
In [2]: isinstance([], collections.Iterable)
Out[2]: True
In [3]: isinstance(888, collections.Iterable)
Out[3]: False
可以被next()不断调用并返回下一个值的对象被称为迭代器。
终端输入ipython3 — 几个案例
In [1]: isinstance([], collections.Iterator)
Out[1]: False
In [2]: isinstance(itor, collections.Iterator)
Out[2]: True
- 生成器
如果直接创建出一个列表, 以备使用, 如果列表内容过长, 会浪费大量资源
在Python中,一边循环一边计算的机制,称为生成器:generator。
①列表生成式
In [1]: l = [x for x in range(10)]
In [2]: l
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
②生成器
In [3]: gen = (x for x in range(5))
In [4]: gen
Out[4]: <generator object <genexpr> at 0x105cd3eb8>
③生成器用法
In [5]: for num in l:
...: print(num)
...:
0
1
2
3
4
5
6
7
8
9
In [12]: gen = (x for x in range(5))
In [13]: next(gen)
Out[13]: 0
In [14]: next(gen)
Out[14]: 1
In [15]: next(gen)
Out[15]: 2
In [16]: next(gen)
Out[16]: 3
In [17]: next(gen)
Out[17]: 4
In [18]: next(gen)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-18-6e72e47198db> in <module>()
----> 1 next(gen)
StopIteration:
每次调用next()方法时, 会返回gen的下一个值, 当没有更多元素时, 抛出StopIteration。
④斐波那契数列
斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到。
def fib(length):
a, b = 0, 1
for x in range(length):
print(b)
a, b = b, a + b
def fib():
a, b = 0, 1
for x in range(5):
print(b)
a, b = b, a + b
yield b
gen = fib()
next(gen)
next(gen)
...
next(gen)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
五. 盒子模型
盒子模型,英文即box model。无论是div、span、还是a都是盒子。 但是,图片、表单元素一律看作是文本,它们并不是盒子。这个很好理解,比如说,一张图片里并不能放东西,它自己就是自己的内容。
盒子中的区域
一个盒子中主要的属性就5个:width、height、padding、border、marginwidth和height:内容的宽度、高度(不是盒子的宽度、高度)。
padding:内边距。
border:边框。
margin:外边距。
让我们俯视这个盒子,它有上下左右四条边,所以每个属性除了内容(content),都包括四个部分:上下左右;这四部分可同时设置,也可分别设置;内边距可以理解为盒子里装的东西和边框的距离,而边框有厚薄和颜色之分,内容就是盒子中间装的东西,外边距就是边框外面自动留出的一段空白。
把所有的网页元素都看成一个盒子
六. RESTful风格
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
①统一接口
RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
DELETE(DELETE):从服务器删除资源。
②URI
可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。一般的,每个资源至少有一个URI与之对应,最典型的URI即URL。
③无状态
所谓无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。有状态和无状态的区别,举个简单的例子说明一下。如查询员工的工资,如果查询工资是需要登录系统,进入查询工资的页面,执行相关操作后,获取工资的多少,则这种情况是有状态的,因为查询工资的每一步操作都依赖于前一步操作,只要前置操作不成功,后续操作就无法执行;如果输入一个url即可得到指定员工的工资,则这种情况是无状态的,因为获取工资不依赖于其他资源或状态,且这种情况下,员工工资是一个资源,由一个url与之对应,可以通过HTTP中的GET方法得到资源,这是典型的RESTful风格。
④认证机制
由于RESTful风格的服务是无状态的,认证机制尤为重要。例如上文提到的员工工资,这应该是一个隐私资源,只有员工本人或其他少数有权限的人有资格看到,如果不通过权限认证机制对资源做一层限制,那么所有资源都以公开方式暴露出来,这是不合理的,也是很危险的。
认证机制解决的问题是,确定访问资源的用户是谁;权限机制解决的问题是,确定用户是否被许可使用、修改、删除或创建资源。权限机制通常与服务的业务逻辑绑定,因此权限机制需要在每个系统内部定制,而认证机制基本上是通用的,常用的认证机制包括 session auth(即通过用户名密码登录),basic auth,token auth和OAuth,服务开发中常用的认证机制为后三者。
七. 进程间通信
① 共享变量from threading import Thread
l = []
def my_thread1():
for num in range(3):
l.append(num)
def my_thread2():
s = "hello"
for word in s:
l.append(word)
if __name__ == "__main__":
t1 = Thread(target=my_thread1)
t1.start()
t2 = Thread(target=my_thread2)
t2.start()
print(l)
[0, 1, 2, 'h', 'e', 'l', 'l', 'o']
② 通过queue
from threading import Thread
from queue import Queue
def my_thread1(q):
for num in range(5):
q.put(num)
def my_thread2(q):
while True:
r = q.get()
print(r)
if not q.qsize():
return
if __name__ == "__main__":
q = Queue()
t1 = Thread(target=my_thread1, args=(q, ))
t1.start()
t2 = Thread(target=my_thread2, args=(q, ))
t2.start()
0
1
2
3
4
八. 线程间通信
Queueimport multiprocessing
from multiprocessing import Process, Queue
import time
def get_1():
while True:
time.sleep(1)
r = q.get()
print("我是线程---%s, num===%d"%(multiprocessing.current_process().name, r))
print(q.empty())
if q.empty():
return
def get_2():
while True:
time.sleep(1)
r = q.get()
print("我是线程---%s, num===%d"%(multiprocessing.current_process().name, r))
print(q.empty())
if q.empty():
return
if __name__ == "__main__":
q = Queue()
for num in range(10):
q.put(num)
p1 = Process(target=get_1)
p1.start()
p2 = Process(target=get_2)
p2.start()
我是线程---Process-1, num===0
False
我是线程---Process-2, num===1
False
我是线程---Process-1, num===2
False
我是线程---Process-2, num===3
False
我是线程---Process-1, num===4
我是线程---Process-2, num===5
False
False
我是线程---Process-1, num===6
False
我是线程---Process-2, num===7
False
我是线程---Process-1, num===8
我是线程---Process-2, num===9
True
True
另外: 给自己打个广告, 如果有需要书籍或者有问题的朋友可以联系我
另外另外: 本人家中有猫有狗, 副业做的是宠物相关, 宠物食品, 宠物零食, 宠物罐头等, 如果有需要请 关注TB—阳光喵坊(提我打折, 但不保证是哪里打折), 保证货真价实!!!谢谢各位!!!