<面试题>学习面试

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

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

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

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

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

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()获取用户输入,不论用户输入的是什么,获取到的就是什么数据类型的。

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

详情见:https://www.cnblogs.com/shuimohei/p/10232668.html

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命令切割文件,分多次进行读取

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

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

  

8.补充缺失的代码?

https://www.cnblogs.com/shuimohei/p/10232473.html

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

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

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

https://www.cnblogs.com/shuimohei/p/10233526.html

 

11. __init__ 和__new__的区别

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

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

      其必须要有返回值,返回实例化出来的实例,需要注意的是,可以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 程序的运行方面,有什么手段能提升性能?

1、使用多进程,充分利用机器的多核性能
2、对于性能影响较大的部分代码,可以使用 C 或 C++编写
3、对于 IO 阻塞造成的性能影响,可以使用 IO 多路复用来解决
4、尽量使用 Python 的内建函数
5、尽量使用局部变量

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。

https://www.cnblogs.com/shuimohei/p/10500266.html

https://www.cnblogs.com/shuimohei/p/10500299.html

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

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

29.什么是多线程竞争?

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

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

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

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

多线程的例子

https://www.cnblogs.com/shuimohei/p/10500634.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)。
304、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文件,当然也可以通过代码去生成。

作用:

1、提高运行效率:python是解释性语言,需要通过python解释器编译,先编译出pyc文件可以降低编译时间提高运行效率。

2、不想让源码泄露: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 页面

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

8、 View 将 html 页面内容返回给浏览器。
9、 浏览器拿到 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 服务的一个 理想框架。

转载于:https://www.cnblogs.com/shuimohei/p/11496106.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值