python --- 常见题目 2019.01.03

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区别
  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
    建议:
    1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
    2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
    others: 常见的请求方式
    GET, POST, HEAD, OPTIONS, DELETE, PUT
三. python和go的区别
  1. 性能
  2. 快速的编译时间
  3. python 没有指针的概念
  4. 格式统一
  5. 编译生成可执行文件 等等…
四. 生成器和迭代器
  1. 迭代器 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
  1. 生成器
    如果直接创建出一个列表, 以备使用, 如果列表内容过长, 会浪费大量资源
    在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、margin

width和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
八. 线程间通信
Queue
import 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—阳光喵坊(提我打折, 但不保证是哪里打折), 保证货真价实!!!谢谢各位!!!

返回顶部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值