----------------------8月4日----------------------------------------------------------------
1. python中a==b和a is b的却别
a==b是比较运算符,变量a b的值相等则返回Ture否则返回False
a is b 是同一运算符,a,b的数值相等未必返回Ture,Python为了优化效率内置了小整数对象池和简单字符串对象池,小整数对象池包括[-5, 256]这之中的数相同时,指的是一个对象。简单字符串也如此。
2.打印5次“hello world”字符串
print(“world”*5)
3.dic中取出对应的值
①dic["key"]
②dic.values()。(取出所有的键,dic.keys())
③for k,v in dic.items(): print(k)
④ dic.get("key","没有找到该键“)
⑤dic.pop("key","没有找到该键")获取该键对应的值,并且删除字典中的这一键值对,如果该键不存在,则返回第二个参数(默认值)
-----------------------------------------------------------------------------------------------
**python中的那些容器可以存放不同数据结构?
list、tuple、set、dict
**如何创建Python中的不同数据类型?
lis=[]
tuple=()
set={}
dict={}
bul=None
**__init__.py功能?
①标识该目录为python模块包
②当用 import 导入该目录时,会执行 __init__.py 里面的代码,该文件就是一个正常的python代码文件。因此可以将初始化代码放入该文件中
**用过Python哪些装饰器
装饰器:为原函数扩展信工鞥你,用新功能待提就功能
作用,再不改变原油代码基础上,实现功能上的扩展
操作:讲一个函数当做变量存入到新的函数中,用到闭包函数(内层函数引用外层函数值,外层函数返回内层函数)的方法
闭包函数,将原函数替换为新的函数
@符号的作用
1.把@符号下面的函数当做参数传递给装饰器
2.可以把函数进行返回,让新函数代替旧函数,以实现功能上的扩展
def kuozhan2(func):
def newfunc():
print('扩展脚本1')
func()
print('扩展脚本2')
return newfunc
@kuozhan2
def fun():
print('旧方法')
装饰器嵌套
@kuozhan3
@kuozhan4
def func():
print('旧方法')
用装饰器修饰带有参数的函数
扩展新的功能要和原函数的功能在参数和返回值上保持一致
def kuozhan5(func):
def newfunc(who,where):
XXX
kuozhan5()
return newfunc
@kuozhan5
def func(who, where):
print("{who}在{where}买车",format(who,where))
func('张三',‘4s点’)
**Python中哪些数据类型的是可变参数,哪些是不可变参数
int、String、touple---不可变
dic、list---可变
1. mro是什么
method resolution Order,方法解析顺序,方法调用时需要对当前类和基类进行搜索以确定方法艘在的位置,而搜索的顺序就是 方法解析顺序
2. 什么是c3算法
为了解决原来基于深度优先算法不满足本地优先级和单调性的问题,
本地优先级:声明时父类的顺序,C(A,B)
3. 面向对象中带双下划线的特殊方法
__setattr__:添加/修改属性时会触发
__delattr__:删除属性时触发
4. 双下划线和单下划线的区别
单:保护变量。只有类对象和子类对象能访问到这些变量
双:私有成员,只有类对象能访问,子类对象不能访问
5.上下文context你知道吗?(with的用法,如果类需要支持with语句,应该如何书写?)
基本格式 with context_expression [as target(s)]: with - body 这里context_expression要返回一个上下文管理器对象, 该对象并不赋值给as中的target(s),如果制定了as子句的话,会将上下文管理器的__enter__()和__exit__()两个方法context_manager.__enter__():进入上下文管理器的运行时上下文,在语句执行前调用,。with语句将该方法返回值赋值给as子句中的target,
6. 实现一个Singleton单例类,要求遵循基本语言编程规范(用尽量多的方式)
通过函数返回一个对象、装饰器实现、__new__
希望某一个对象仅在程序中出现一次,之后所有调用使用同一个对象
__new__
class RedisClient:
_instance = None
@classmethod
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = redis.StrictRedis(**REDIS_CONFIG, bd=0)
return cls._instance
if __name__ == '__main__':
r=RedisClient()
单例模式的优点核应用?
1.节省空间,全局内只有一个实例
2.数据库配置、数据库连接池
3.网站计数器
7. json序列化时,默认遇到中文会换成unicode,想保留中文怎么办?
json.dump({"ddf":"你好“”}, ensure_ascii = Flase)
8. 用python匹配HTMLtag的时候,<.*>和<.*?>有什么区别?
<.*>贪婪匹配,匹配所有
<.*?>非贪婪匹配,匹配到第一个就停了
9.如何判断一个邮箱合法
import re
if re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):
print('right')
else:
print('wrong')
10. 用列表生成式写一个0-100的列表
a = [i for i in range(100)]
11, 用列表生成式写一个取0-100的技术
b= [i for i in range(100) if i%2 != 0]
c = [i for i in range(1,100,2)]
range可以设置步长
切片:字符串也有下标,【开始的下标:长度】
s = “hello world”
a = s[0:5]
切片加步长,每隔2个切一个[0:100:2]
d = [i for i in range(100)[::2]]
12.将类表中重复的元素过滤
lis = [1,2,2,3,3,5]
list(set(lis))
counter = {}定义一个计数器,用来保存元素在列表中出现的次数
for i in lis:
if
13.列表和元组的去表
li = []
tu = (1,2,3,4)#元组的元素不可变
14. 迭代器与生产器的区别
x = [1,2,3,4,5]
y = range(1,6)
list保存完整的值
generator不保存值
是什么:可以边迭代边计算,占用内存小
为什么要用:list中值都会存在内存中,当有大量数据时,且仅适用list中部分值,那么不适用的值就浪费了,生成器解决了这个问题
创建生成器:①将[1,2,3]改为(1,2,3)②当函数中使用了yield关键字,那么这个函数是一个generator,调用函数就是创建了一个生成器对象。
原理:生成器有一个next()方法,可以重复调用next()对象向生成器中取值,并且yield在return后会记住当前位置,并下次调用时从yield下一条语句开始执行
15.进程与线程的区别
线程是程序运行的最小单位
进程是操作系统管理的最小单元
进程可能包括好几个线程
16.说一下python中的多线程特点
一般编程语言中多线程可以利用CPU的多核心
python的多线程有GLI全局锁,不能真正意义上多核心
10.python怎么利用多核心
可以利用多进程实现