1.如何在一个函数内部修改全局变量
利用global修改全局变量
a=5
def fun():
global a
a=4
fun()
print(a)
2.列出5个python标准库
os:提供了不少与操作系统相关联的函数
sys:通常用于命令行参数
re:正则匹配
math:数学运算
datetime:处理日期时间
3.谈下python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
4.*args,**kwargs什么意思?
这里**args,**kwargs主要用于函数定义,你可以将不定数量的参数传递给一个函数。这里的不定的意思是预先并不知道函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字,*args是用来发送一个非键值对的可变数量的参数列表给一个函数
eg:
def demo(args_f,*args_v):
print (args_f)
for x in args_v:
print (x)
demo('a','b','c','d')
**kwargs允许你将不定长度的键值对作为参数传递给一个函数,如果你想要在一个函数里处理带名字的参数,你应该使用 **kwargs
eg:
def demo(**args_v):
for k,v in args_v.items():
print(k,v)
demo(name='nginx')
5.python内建数据类型有哪些
整型–int
布尔型–bool
字符串–str
列表–list
元组–tuple
字典–dict
6.简述面向对象中__new__和__init__区别
__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
class Bike:
def __init__(self,WheelNum,Color):
self.WheelNum=WheelNum
self.Color=Color#__init__方法自动被调用,可以创建对象接收参数
def move(self):
print('车会跑')
#创建对象
BM=Bike(2,'green')
print('车的颜色为:%s' %(BM.Color))
print('车轮数量:%d' %(BM.WheelNum))
由上可知:只打印__init__方法执行的结果,move方法未执行。
__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。
class A(object):
def __init__(self):
print('这是init方法',self)
def __new__(cls):
print('这是cls的ID',id(cls))
print('这是new方法',object.__new__(cls))
return object.__new__(cls)
A()
print('这是类A的ID',id(A))
cls和类ID一样,说明指向同一个类,也就是cls就是创建的实例类
init方法和new方法返回值地址一样,说明返回值是对象
7.避免转义给字符串加哪个字母表示原始字符串?
r , 表示需要原始字符串,不转义特殊字符
8.数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student
9.python2和python3区别?列举5个
Python3 使用 print 必须要以小括号包裹打印内容,比如 print(‘hi’)
Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print ‘hi’
python2 range(1,10)返回列表,python3中返回迭代器,节约内存
python2中使用ascii编码,python3中使用utf-8编码
python2中unicode表示字符串序列,str表示字节序列, python3中str表示字符串序列,byte表示字节序列
python2中为正常显示中文,引入coding声明,python3中不需要
python2中是raw_input()函数,python3中是input()函数
10.列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),用id()方法可以打印对象的id
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
11.用python删除文件和用linux命令删除文件方法
python:os.remove(文件名)
linux: rm 文件名
12.字典根据键从小到大排序
dict={'name':'zz','age':19,'city':'西安','tel':'13249869988'}
list=sorted(dict.items(),key=lambda i:i[0],reverse=False)
print('sorted根据字典键排序',list)
new_dict={}
for i in list:
new_dict[i[0]]=i[1]
print('新字典',new_dict)
13.正则表达式匹配中,(.)和(.?)匹配区别?
(.)是贪婪匹配,会把满足正则的尽可能多的往后匹配
(.?)是非贪婪匹配,会把满足正则的尽可能少匹配
s='哈哈呵呵'
import re
res1=re.findall('(.*)',s)
print('贪婪匹配',res1)
res2=re.findall('(.*?)',s)
print('非贪婪匹配',res2)
14.简述Django的orm
ORM,全拼Object-Relation Mapping,意为对象-关系映射
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL/Oracle/sqlite…,如果数据库迁移,只需要更换Django的数据库引擎即可
15.提高python运行效率的方法
使用生成器,因为可以节约大量内存
循环代码优化,避免过多重复代码的执行
核心模块用Cython PyPy等,提高效率
多进程、多线程、协程
多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率
16.简述mysql和redis区别
redis: 内存型非关系数据库,数据保存在内存中,速度快
mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢
17.分别从前端、后端、数据库阐述web项目的性能优化
前端优化:
减少http请求、例如制作精灵图
html和CSS放在页面上部,javascript放在页面下面,因为js加载比HTML和Css加载慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差
后端优化:
缓存存储读写次数高,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
异步方式,如果有耗时操作,可以采用异步,比如celery
代码优化,避免循环和判断次数太多,如果多个if else判断,优先判断最有可能先发生的情况
数据库优化:
如有条件,数据可以存放于redis,读取速度快
建立索引、外键等
18.简述同源策略
同源策略需要同时满足以下三点要求:
1)协议相同
2)域名相同
3)端口相同
http:www.test.com与https:www.test.com 不同源——协议不同
http:www.test.com与http:www.admin.com 不同源——域名不同
http:www.test.com与http:www.test.com:8081 不同源——端口不同
只要不满足其中任意一个要求,就不符合同源策略,就会出现“跨域”
19.简述cookie和session的区别
session 在服务器端,cookie 在客户端(浏览器)
session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置
cookie安全性比session差
20.简述多线程、多进程
进程:
操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:
CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
应用:
IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间
CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势
21.列出几种魔术方法并简要介绍用途
__init__:对象初始化方法
__new__:创建对象时候执行的方法,单列模式会用到
__str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法
那么就会打印从在这个方法中return的数据
__del__:删除对象执行的方法
22.r、r+、rb、rb+文件打开模式区别
23.HTTP请求中get和post区别
GET请求是通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的;
GET提交有数据大小的限制,一般是不超过1024个字节,而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限,而是浏览器做了些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET,大量的数据使用POST。
GET请求因为数据参数是暴露在URL中的,所以安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到登录操作的时候,尽量使用HTTPS请求,安全性更好。
24.类,对象,属性,方法简述概念
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:推土车是汽车的实例化;姚明是人的实例化;小白(狗的名字)是狗的实例化;二郎神是神的实例化;
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.6米多;小白的毛发是棕色的;二郎神额头上有只眼睛;
方法:日每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。
如果大家。没有找到一个好的Python交流群可以加入小编的学习交流群;418775537,里面有资料以及各位同行的学习者分享交流