<面试题>学习面试

1.代码中要修改不可变数据会出现什么问题? 抛出什么异常? 

  代码不会正常运行,抛出 TypeError 异常。javascript

# 好比修改元祖。会报错
TypeError: 'tuple' object does not support item assignment

2.print 调用 Python 中底层的什么方法?

print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。html

import sys

obj = "hello world!"

print(obj)
# print等同于
sys.stdout.write(obj + '\n')

  

3.下面这段代码的输出结果将是什么?请解释?

class Parent(object):
	x = 1


class Child1(Parent):
	pass


class Child2(Parent):
	pass


# 继承指向父类x所在地址:1635999904
print(id(Parent.x), id(Child1.x), id(Child2.x))
# 1 1 1
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
# 1 2 1
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
# 3 2 3
print(Parent.x, Child1.x, Child2.x)

4.简述你对 input()函数的理解?

在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。前端

在 Python2 中,input()获取用户输入,不论用户输入的是什么,获取到的就是什么数据类型的。java

5. 阅读下面的代码,写出 A0,A1 至 An 的最终值。

详情见:http://www.javashuo.com/article/p-nlwwkbku-by.htmlpython

6. range 和 xrange 的区别?

 
range返回一个列表,直接开辟一块内存空间保存列表
xrange返回一个生成器,边循环边使用,只有在使用时才会开辟空间

7.  4G 内存怎么读取一个 5G 的数据?

"""方法1:经过生成器屡次读取"""


# 生成器
def get_lines():
	with open('Cookie和Session.py', 'r', encoding='utf-8') as f:
		while True:
			data = f.readlines(100)
			if data:
				yield data
			else:
				break


# 迭代器
file = get_lines()
print(next(file))
print(next(file))
print(next(file))

方法2:使用linux命令切割文件,分屡次进行读取mysql

 
"""能够经过linux命令split切割成小文件,而后再对数据进行处理,此方法效率比较高。能够按照行数切割,能够按照文件大小切割"""

python@ubuntu:~/Desktop$ split -l 2 requirements.txt re.txt 
 意思:按照两行切割requirements.txt文件,切割后的文件名叫re.txt。
 回车后会生成好多re文件,里面都是两行代码

  

8.补充缺失的代码?

http://www.javashuo.com/article/p-pebfbare-cg.htmllinux

9. 经常使用的 Python 标准库都有哪些?

os 操做系统,time 时间,random 随机,pymysql 链接数据库,threading 线程,multiprocessing
进程,queue 队列。
第三方库:
django 和 flask 也是第三方库,requests,virtualenv,selenium,scrapy,xadmin,celery,
re,hashlib,md5。
经常使用的科学计算库(如 Numpy,Scipy,Pandas)。c++

10. 赋值、浅拷贝和深拷贝的区别?

http://www.javashuo.com/article/p-fwapcvwh-cq.html

 

11. __init__ 和__new__的区别

init 在对象建立后,对对象进行初始化。
new 是在对象建立以前建立一个对象,并将该对象返回给 init。web

__new__: 对象的建立,是一个静态方法,第一个参数是cls。(想一想也是,不多是self,对象还没建立,哪来的self)ajax

      其必需要有返回值,返回实例化出来的实例,须要注意的是,能够return父类__new__()出来的实例,也能够直接将object的__new__()出来的实例返回。

class Bar(object):
    pass

class Foo(object):
    def __new__(cls, *args, **kwargs):
        return Bar()

print(Foo()) 

 

12.输入某年某月某日,判断这一天是这一年的第几天?

# 今年的第几天
import datetime

year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入天数:"))
data1 = datetime.date(year=year, month=month, day=day)
data2 = datetime.date(year=year, month=1, day=1)

result = data1 - data2
# <class 'datetime.timedelta'> 1 day, 0:00:00
result = result.days + 1
print(result)

  

13.打乱一个排好序的列表

import random

a = [1, 2, 3, 4]
# 返回值为None
random.shuffle(a)
print(a)

  

14. Python 中的 os 模块常见方法?

 os.remove()删除文件
 os.rename()重命名文件
 os.walk()生成目录树下的全部文件名
 os.chdir()改变目录

 os.mkdir/makedirs 建立目录/多层目录
 os.rmdir/removedirs 删除目录/多层目录
 os.listdir()列出指定目录的文件
 os.getcwd()取得当前工做目录
 os.chmod()改变目录权限
 os.path.basename()去掉目录路径,返回文件名
 os.path.dirname()去掉文件名,返回目录路径
 os.path.join()将分离的各部分组合成一个路径名
 os.path.split()返回(dirname(),basename())元组
 os.path.splitext()(返回 filename,extension)元组
 os.path.getatime\ctime\mtime 分别返回最近访问、建立、修改时间
 os.path.getsize()返回文件大小
 os.path.exists()是否存在
 os.path.isabs()是否为绝对路径
 os.path.isdir()是否为目录
 os.path.isfile()是否为文件

15.Python 的 sys 模块经常使用方法?

 sys.exit(n) 退出程序,正常退出时 exit(0)
 sys.hexversion 获取 Python 解释程序的版本值,16 进制格式如:0x020403F0
 sys.version 获取 Python 解释程序的版本信息
 sys.maxint 最大的 Int 值
 sys.maxunicode 最大的 Unicode 值
 sys.modules 返回系统导入的模块字段,key 是模块名,value 是模块
 sys.path 返回模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值
 sys.platform 返回操做系统平台名称
 sys.stdout 标准输出
 sys.stdin 标准输入
 sys.stderr 错误输出
 sys.exc_clear() 用来清除当前线程所出现的当前的或最近的错误信息
 sys.exec_prefix 返回平台独立的 python 文件安装的位置
 sys.byteorder 本地字节规则的指示器,big-endian 平台的值是'big',little-endian 平台的值是'little'
 sys.copyright 记录 python 版权相关的东西
 sys.api_version 解释器的 C 的 API 版本
 sys.version_info 元组则提供一个更简单的方法来使你的程序具有 Python 版本要求功能

 16.关于 Python 程序的运行方面,有什么手段能提高性能?

一、使用多进程,充分利用机器的多核性能
二、对于性能影响较大的部分代码,可使用 C 或 C++编写
三、对于 IO 阻塞形成的性能影响,可使用 IO 多路复用来解决
四、尽可能使用 Python 的内建函数
五、尽可能使用局部变量

17.10 个经常使用的 Linux 命令?

pwd 显示工做路径
ls 查看目录中的文件

cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
mkdir dir1 建立一个叫作 'dir1' 的目录'
rm -f file1 删除一个叫作 'file1' 的文件',-f 参数,忽略不存在的文件,从不给出提示。
rmdir dir1 删除一个叫作 'dir1' 的目录'
groupadd group_name 建立一个新用户组
groupdel group_name 删除一个用户组
tar -cvf archive.tar file1 建立一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 建立一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp 目录下
tar -cvfj archive.tar.bz2 dir1 建立一个 bzip2 格式的压缩包
tar -xvfj archive.tar.bz2 解压一个 bzip2 格式的压缩包
tar -cvfz archive.tar.gz dir1 建立一个 gzip 格式的压缩包
tar -xvfz archive.tar.gz 解压一个 gzip 格式的压缩包

18.字典按照值排序

d = {'a': 3, 'b': 1, 'c': 2, 'd': 4}
# 有返回值
d_reverse = sorted(d.items(), key=lambda x:x[1], reverse=True)
d_sorted = sorted(d.items(), key=lambda x:x[1], reverse=False)
print(d_reverse,d_sorted)

  

19.Python 中类方法、类实例方法、静态方法有何区别?

类方法:是类对象的方法,在定义时须要在上方使用“@classmethod”进行装饰,形参为 cls,
表示类对象,类对象和实例对象均可调用;
类实例方法:是类实例化对象的方法,只有实例对象能够调用,形参为 self,指代对象自己;
静态方法:是一个任意函数,在其上方使用“@staticmethod”进行装饰,能够用对象直接调用,
静态方法实际上跟该类没有太大关系。

20. Python 的内存管理机制及调优手段?

内存管理机制:引用计数、垃圾回收、内存池。

引用计数:
引用计数是一种很是高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增长 1, 当
其再也不被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除。
垃圾回收 :
1. 引用计数
引用计数也是一种垃圾收集机制,并且也是一种最直观,最简单的垃圾收集技术。当 Python 的某
个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。好比
某个新建对象,它被分配给某个引用,对象的引用计数变为 1。若是引用被删除,对象的引用计数为 0,
那么该对象就能够被垃圾回收。不过若是出现循环引用的话,引用计数机制就再也不起有效的做用了
2. 标记清除
若是两个对象的引用计数都为 1,可是仅仅存在他们之间的循环引用,那么这两个对象都是须要被
回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。因此先将循环引
用摘掉,就会得出这两个对象的有效计数。
3. 分代回收(屡次没清除的保留,下次不回收这些内容)
从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操做实际上与系统
中总的内存块的数量是相关的,当须要回收的内存块越多时,垃圾检测带来的额外操做就越多,而垃圾
回收带来的额外操做就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额
外操做。

内存池:
1. Python 的内存机制呈现金字塔形状,-1,-2 层主要有操做系统进行操做;
2. 第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操做;
3. 第 1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于
256K 时有该层直接分配内存;
4. 第 3 层是最上层,也就是咱们对 Python 对象的直接操做;
Python 在运行期间会大量地执行 malloc 和 free 的操做,频繁地在用户态和核心态之间进行切
换,这将严重影响 Python 的执行效率。为了加速 Python 的执行效率,Python 引入了一个内存池
机制,用于管理对小块内存的申请和释放。
Python 内部默认的小块内存与大块内存的分界点定在 256 个字节,当申请的内存小于 256 字节
时,PyObject_Malloc 会在内存池中申请内存;当申请的内存大于 256 字节时,PyObject_Malloc 的
行为将蜕化为 malloc 的行为。固然,经过修改 Python 源代码,咱们能够改变这个默认值,从而改
变 Python 的默认内存管理行为

21.Python 函数调用的时候参数的传递方式是值传递仍是引用传递

不可变参数用值传递:

  像整数和字符串这样的不可变对象,是经过拷贝进行传递的,由于你不管如何都不可能在原处改变
不可变对象

可变参数是引用传递的:
  好比像列表,字典这样的对象是经过引用传递、和 C 语言里面的用指针传递数组很类似,可变对象
能在函数内部改变。

22.为何函数名字能够当作参数用?

Python 中一切皆对象,函数名是函数在内存中的空间,也是一个对象。

23.回调函数,如何通讯的?

回调函数是把函数的指针(地址)做为参数传递给另外一个函数,将整个函数看成一个对象,赋值给调
用的函数。

 

24.单例模式

# 单例模式,不管调用多少次,获得对象的引用相同(内存地址相同)
# 思路:没建立对象就先分配空间,分配好空间每次都返回这个内存空间地址,再也不使用new方法从新分配
class MusicPlayer(object):
	# 记录单例对象的引用,第一个被建立的对象
	instance = None
	# 记录是否执行过初始化动做
	init_flag = False

	def __new__(cls, *args, **kwargs):
		# 1.判断类属性是否为空对象
		if cls.instance is None:
			# 2.调用父类的方法,为第一个对象分配空间
			cls.instance = super().__new__(cls)
		# 3.返回保存的对象引用
		return cls.instance

	# 4.改写初始化方法,使它只执行一次
	def __init__(self):
		# 5.判断是否执行过初始化动做,为Ture直接返回
		if MusicPlayer.init_flag:
			return
		# 6.若是没有执行就进行初始化
		print("初始化")

		# 7.修改类属性标记
		MusicPlayer.init_flag = True


# 建立多个对象,地址相同
player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)

  

应用场景:

(1)资源共享的状况下,避免因为资源操做时致使的性能或损耗等。如日志文件,应用配置。(2)控制资源的状况下,方便资源之间的互相通讯。如线程池等。 1.网站的计数器 2.应用配置 3.多线程池 4.数据库配置,数据库链接池 5.应用程序的日志应用....

25.生成器、迭代器的区别?

迭代器是一个更抽象的概念,任何对象,若是它的类有 next 方法和 iter 方法返回本身自己,对于 string、list、
dict、tuple 等这类容器对象,使用 for 循环遍历是很方便的。在后台 for 语句对容器对象调用 iter()函数,iter()
是 python 的内置函数。iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()
也是 python 的内置函数。在没有后续元素时,next()会抛出一个 StopIteration 异常。
生成器(Generator)是建立迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在须要返回数
据的时候使用 yield 语句。每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置
和全部的数据值)
区别:生成器能作到迭代器能作的全部事,并且由于自动建立了 iter()和 next()方法,生成器显得特别简洁,并且
生成器也是高效的,使用生成器表达式取代列表解析能够同时节省内存。除了建立和保存程序状态的自动方法,当
发生器终结时,还会自动抛出 StopIteration 异常。

26.贪婪匹配和非贪婪匹配

<.*>是贪婪匹配,会从第一个“<”开始匹配,直到最后一个“>”中间全部的字符都会匹配到,中间可能会包含
“<>”。
<.*?>是非贪婪匹配,从第一个“<”开始日后,遇到第一个“>”结束匹配,这中间的字符串都会匹配到,可是
不会有“<>”。

27.进程

进程:程序运行在操做系统上的一个实例,就称之为进程。进程须要相应的系统资源:内存、时间
片、pid。

http://www.javashuo.com/article/p-xwaonjaw-cw.html

http://www.javashuo.com/article/p-hgxrhfiz-dc.html

28. 谈谈你对多进程,多线程,以及协程的理解,项目是否用?

这个问题被问的几率至关之大,其实多线程,多进程,在实际开发中用到的不多,除非是那些对项
目性能要求特别高的,有的开发工做几年了,也确实没用过,你能够这么回答,给他扯扯什么是进程,
线程(cpython 中是伪多线程)的概念就行,实在不行你就说你以前写过下载文件时,用过多线程技术,
或者业余时间用过多线程写爬虫,提高效率。
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最
小单位,进程拥有本身独立的内存空间,因此进程间数据不共享,开销大。
线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个
线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提升了程序的运行效率。
协程:是一种用户态的轻量级线程,协程的调度彻底由用户控制。协程拥有本身的寄存器上下文和
栈。 协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存
器上下文和栈,直接操做栈则基本没有内核切换的开销,能够不加锁的访问全局变量,因此上下文的切
换很是快。

协程也只是单CPU,可是能减少切换代价提高性能

29.什么是多线程竞争?

线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:
数据几乎同步会被多个线程占用,形成数据混乱 ,即所谓的线程不安全
那么怎么解决多线程竞争问题?-- 锁。
锁的好处:
确保了某段关键代码(共享数据资源)只能由一个线程从头至尾完整地执行能解决多线程资源竞争下
的原子操做问题。
锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地降低了
锁的致命问题:死锁:若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不肯先解锁,

互相干等着,程序没法执行下去,这就是死锁。

GIL 锁 全局解释器锁(只在 cpython 里才有)
做用:限制多线程同时执行,保证同一时间只有一个线程执行,因此 cpython 里的多线程实际上是伪
多线程!

三者的关系:进程里有线程,线程里有协程。

多线程的例子

http://www.javashuo.com/article/p-yyssnnvr-dm.html

30.说说下面几个概念:同步,异步,阻塞,非阻塞?

同步:多个任务之间有前后顺序执行,一个执行完下个才能执行。
异步:多个任务之间没有前后顺序,能够同时执行有时候一个任务可能要在必要的时候获取另外一个
同时执行的任务的结果,这个就叫回调!
阻塞:若是卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。
非阻塞:若是不会卡住,能够继续执行,就是说非阻塞的。
同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。

 

31. Python 中的进程与线程的使用场景? 

多进程适合在 CPU 密集型操做(cpu 操做指令比较多,如位数多的浮点运算)。
多线程适合在 IO 密集型操做(读写数据操做较多的,好比爬虫)。

线程是并发,进程是并行;
进程之间相互独立,是系统分配资源的最小单位,同一个线程中的全部线程共享资源。

并行:同一时刻多个任务同时在运行。
并发:在同一时间间隔内多个任务都在运行,可是并不会在同一时刻同时运行,存在交替执行的情
况。

实现并行的库有:multiprocessing
实现并发的库有:threading
程序须要执行较多的读写、请求和回复任务的须要大量的 IO 操做,IO 密集型操做使用并发更好。
CPU 运算量大的程序程序,使用并行会更好。

IO 密集型:系统运做,大部分的情况是 CPU 在等 I/O (硬盘/内存)的读/写。
CPU 密集型:大部份时间用来作计算、逻辑判断等 CPU 动做的程序称之 CPU 密集型。

32.UDP

 

33.TCP

 

34.简述 TCP 和 UDP 的区别以及优缺点?

UDP 是面向无链接的通信协议,UDP 数据包括目的端口号和源端口号信息。
优势:UDP 速度快、操做简单、要求系统资源较少,因为通信不须要链接,能够实现广播发送
缺点:UDP 传送数据前并不与对方创建链接,对接收到的数据也不发送确认信号,发送端不知道数
据是否会正确接收,也不重复发送,不可靠。

TCP 是面向链接的通信协议,经过三次握手创建链接,通信完成时四次挥手
优势:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP 相对于 UDP 速度慢一点,要求系统资源较多。

35.描述用浏览器访问 www.baidu.com 的过程

先要解析出 baidu.com 对应的 ip 地址
 要先使用 arp 获取默认网关的 mac 地址
 组织数据发送给默认网关(ip 仍是 dns 服务器的 ip,可是 mac 地址是默认网关的 mac 地址)
 默认网关拥有转发数据的能力,把数据转发给路由器
 路由器根据本身的路由协议,来选择一个合适的较快的路径转发数据给目的网关
 目的网关(dns 服务器所在的网关),把数据转发给 dns 服务器
 dns 服务器查询解析出 baidu.com 对应的 ip 地址,并原路返回请求这个域名的 client
获得了 baidu.com 对应的 ip 地址以后,会发送 tcp 的 3 次握手,进行链接

 使用 http 协议发送请求数据给 web 服务器
 web 服务器收到数据请求以后,经过查询本身的服务器获得相应的结果,原路返回给浏览器。
 浏览器接收到数据以后经过浏览器本身的渲染功能来显示这个网页。
 浏览器关闭 tcp 链接,即 4 次挥手结束,完成整个访问过程

36.POST,GET请求的过程

POST 请求的过程:
1.浏览器请求 tcp 链接(第一次握手)
2.服务器答应进行 tcp 链接(第二次握手)
3.浏览器确认,并发送 post 请求头(第三次握手,这个报文比较小,因此 http 会在此时进行
第一次数据发送)
4.服务器返回 100 continue 响应
5.浏览器开始发送数据
6.服务器返回 200 ok 响应

GET 请求的过程:
1.浏览器请求 tcp 链接(第一次握手)
2.服务器答应进行 tcp 链接(第二次握手)
3.浏览器确认,并发送 get 请求头和数据(第三次握手,这个报文比较小,因此 http 会在此时
进行第一次数据发送)
4.服务器返回 200 OK 响应

37.HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,而后讲出他们都表示什么意思?

100-199:表示服务器成功接收部分请求,要求客户端继续提交其他请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,经常使用 200(OK 请求成功)。
300-399:为完成请求,客户须要进一步细化请求。302(全部请求页面已经临时转移到新的 url)。
30四、307(使用缓存资源)。
400-499:客户端请求有错误,经常使用 404(服务器没法找到被请求页面),403(服务器拒绝访问,
权限不够)。
500-599:服务器端出现错误,经常使用 500(请求未完成,服务器遇到不可预知的状况)。

38.请简单说一下三次握手和四次挥手?

 

 

 

三次握手过程:
1 首先客户端向服务端发送一个带有 SYN 标志,以及随机生成的序号 100(0 字节)的报文
2 服务端收到报文后返回一个报文(SYN200(0 字节),ACk1001(字节+1))给客户端
3 客户端再次发送带有 ACk 标志 201(字节+)序号的报文给服务端
至此三次握手过程结束,客户端开始向服务端发送数据。

1 客户端向服务端发起请求:我想给你通讯,你准备好了么?
2 服务端收到请求后回应客户端:I'ok,你准备好了么
3 客户端礼貌的再次回一下客户端:准备就绪,我们开始通讯吧!
整个过程跟打电话的过程如出一辙:1 喂,你在吗 2 在,我说的你听获得不 3 恩,听获得(接下来请
开始你的表演)
补充:SYN:请求询问,ACk:回复,回应。
四次挥手过程:
因为 TCP 链接是能够双向通讯的(全双工),所以每一个方向都必须单独进行关闭(这句话才是
精辟,后面四个挥手过程都是其具体实现的语言描述)
四次挥手过程,客户端和服务端均可以先开始断开链接
1 客户端发送带有 fin 标识的报文给服务端,请求通讯关闭
2 服务端收到信息后,回复 ACK 答应关闭客户端通讯(链接)请求
3 服务端发送带有 fin 标识的报文给客户端,也请求关闭通讯
4 客户端回应 ack 给服务端,答应关闭服务端的通讯(链接)请求

39.HTTP 常见请求头?

1. Host (主机和端口号)
2. Connection (连接类型)
3. Upgrade-Insecure-Requests (升级为 HTTPS 请求)
4. User-Agent (浏览器名称)
5. Accept (传输文件类型)
6. Referer (页面跳转处)
7. Accept-Encoding(文件编解码格式)
8. Cookie (Cookie)
9. x-requested-with :XMLHttpRequest (是 Ajax 异步请求)

40.七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?

IP: 网络层
TCP/UDP: 传输层
HTTP、RTSP、FTP: 应用层协议

41.url 的形式?

scheme://host[:port#]/path/…/[?query-string][#anchor]

协议://IP地址:端口号/资源路径/参数 锚

42. AJAX 是什么?如何使用 AJAX?

ajax(异步的 javascript 和 xml) 可以刷新局部网页数据而不是从新加载整个网页。
第一步,建立 xmlhttprequest 对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest
对象用来和服务器交换数据。
第二步,使用 xmlhttprequest 对象的 open()和 send()方法发送资源请求给服务器。
第三步,使用 xmlhttprequest 对象的 responseText 或 responseXML 属性得到服务器的响应。
第四步,onreadystatechange 函数,当发送请求到服务器,咱们想要服务器响应执行一些功能就
须要使用 onreadystatechange 函数,每次 xmlhttprequest 对象的 readyState 发生改变都会触发
onreadystatechange 函数。

43.什么是pyc文件?pyc文件的做用

  pyc文件就是py程序编译后获得的文件,是一种二进制文件。看成为模板被调用的时候会自动生成pyc文件,固然也能够经过代码去生成。

做用:

一、提升运行效率:python是解释性语言,须要经过python解释器编译,先编译出pyc文件能够下降编译时间提升运行效率。

二、不想让源码泄露:pyc文件能够独立于py文件,删除py文件也不会出错,第二次运行会优先寻找pyc文件。并且pyc文件没法进行反编译,因此,为了防止源码泄露能够直接发布pyc文件。

44.Flask 和 Django 路由映射的区别?  

  在 django 中,路由是浏览器访问服务器时,先访问的项目中的 url,再由项目中的 url 找到应用中
url,这些 url 是放在一个列表里,听从从前日后匹配的规则。在 flask 中,路由是经过装饰器给每一个视
图函数提供的,并且根据请求方式的不一样能够一个 url 用于不一样的做用。

45. Django 建立项目的命令?

django-admin startproject 项目名称

python manage.py startapp 应用 app 名

46. 对 MVC,MVT 解读的理解?

M:Model,模型,和 MVC 中的 M 功能相同,和数据库进行交互。

V:view,视图,和 MVC 中的 C 功能相同,接收请求,进行处理,与 M 和 T 进行交互,返回应答。
T:Template,模板,和 MVC 中的 V 功能相同,产生 Html 页面

一、 用户点击注册按钮,将要注册的内容发送给网站的服务器。
二、 View 视图,接收到用户发来的注册数据,View 告诉 Model 将用户的注册信息保存进数据库。
三、 Model 层将用户的注册信息保存到数据库中。
四、 数据库将保存的结果返回给 Model
五、 Model 将保存的结果给 View 视图。
六、 View 视图告诉 Template 模板去产生一个 Html 页面。
七、 Template 生成 html 内容返回给 View 视图。

八、 View 将 html 页面内容返回给浏览器。
九、 浏览器拿到 view 返回的 html 页面内容进行解析,展现。

47. 验证码过时时间怎么设置?

  将验证码保存到数据库或 session,设置过时时间为 1 分钟,而后页面设置一个倒计时(通常是前端
js 实现 这个计时)的展现,一分钟事后再次点击获取新的信息。

48.Python 中三大框架各自的应用场景?

django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000,
若是要实现高并发的话,就要对 django 进行二次开发,好比把整个笨重的框架给拆掉,本身写 socket
实现 http 的通讯,底层用纯 c,c++写提高效率,ORM 框架给干掉,本身编写封装与数据库交互的框
架,由于啥呢,ORM 虽然面向对象来操做数据库,可是它的效率很低,使用外键来联系表与表之间的
查询;
flask:轻量级,主要是用来写接口的一个框架,实现先后端分离,提高开发效率,Flask 自己至关于一
个内核,其余几乎全部的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都须要
用第三方的扩展来实现。好比能够用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验
证等。Flask 没有默认使用的数据库,你能够选择 MySQL,也能够用 NoSQL。

Tornado: Tornado 是一种 Web 服务器软件的开源版本。Tornado 和如今的主流 Web 服务器框
架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,并且速度至关快。
得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒能够处理数以千计的链接,所以 Tornado
是实时 Web 服务的一个 理想框架。

49.并行和并发

你吃饭吃到一半,电话来了,你一直到吃完了之后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。  (不必定是同时的)

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。  

 

并发的关键是你有处理多个任务的能力,不必定要同时。  

并行的关键是你有同时处理多个任务的能力。  

 

因此我认为它们最关键的点就是:是不是『同时』。

并发是轮流处理多个任务,并行是同时处理多个任务
-------------------------------------------------------------------------

  若是某个系统支持两个或者多个动做(Action)同时存在,那么这个系统就是一个并发系统。若是某个系统支持两个或者多个动做同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差别在于“存在”这个词。

   在并发程序中能够同时拥有两个或者多个线程。这意味着,若是程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每一个线程都处于执行过程当中的某个状态。若是程序可以并行执行,那么就必定是运行在多核处理器上。此时,程序中的每一个线程都将分配到一个独立的处理器核上,所以能够同时运行。

   我相信你已经可以得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你能够编写一个拥有多个线程或者进程的并发程序,但若是没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。所以,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

摘自:《并发的艺术》 — 〔美〕布雷谢斯

50.解释什么是异步非阻塞?

同步异步指的是在客户端

同步意味着客户端提出了一个请求之后,在回应以前只能等待

异步意味着 客户端提出一个请求之后,还能够继续提其余请求阻塞

非阻塞 指的是服务器端

阻塞意味着服务器接受一个请求后,在返回结果之前不能接受其余请求

非阻塞意味着服务器接受一个请求后,尽管没有返回结果,仍是能够继续接受其余请求

51.简述数据三大范式?

第一范式:确保每列的原子性. 若是每列(或者每一个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则知足第一范式.

例如:顾客表(姓名、编号、地址、……)其中"地址"列还能够细分为国家、省、市、区等。

第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关. 若是一个关系知足第一范式,而且除了主键之外的其它列,都依赖于该主键,则知足第二范式.

例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关. 若是一个关系知足第二范式,而且除了主键之外的其它列都不依赖于主键列,则知足第三范式. 为了理解第三范式,须要根据Armstrong千米之必定义传递依赖。

假设A、B和C是关系R的三个属性,若是A-〉B且B-〉C,则从这些函数依赖中,能够得出A-〉C,如上所述,依赖A-〉C是传递依赖。

例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,知足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后通过传递依赖,"顾客姓名"也和"订单编号"相关。为了知足第三范式,应去掉"顾客姓名"列,放入客户表中。

相关文章
相关标签/搜索