get post请求的区别
1. post请求安全性高于get。get请求直接将参数暴露在url上,post请求将参数隐藏
传递密码时要用post
2. get请求对数据长度有限制,url的最大长度是2048个字符。post无限制
传递大量数据时,用post
3. get只允许传递ASCII字符,而post可以传递任意字符
4. http语义规定get获取数据,post提交数据
post那么多优点为啥用get
1. get 是从服务器获取数据,post是向服务器传送数据
文件操作时,xreadlines 和readlines的区别;
# readlines(常用)
是把文件的全部内容读到内存,并解析成一个list,当文件体积很大时,需要占用很多内存
# xreadlines
直接返回一个iter(file)迭代器,在python2.3之后已经被不推键使用,直接使用for迭代对象
列举布尔值为False的常见值
0 [] () {} '' False None
零 空列表 空元组 空字典 空字符串
is和== 的区别
is 比较的是id
== 比较的是值
现有字典 dicts = {‘a’:24,‘b’:52,‘c’:12,‘k’:33} 按照value排序
dicts.items() 返回一个键值对列表
# dict_items([('a', 24), ('b', 52), ('c', 12), ('k', 33)])
new_dicts = sorted(dicts.items key=lambda x:x[1])
print(new_dicts)
# [('c', 12), ('a', 24), ('k', 33), ('b', 52)]
请翻转字符串
s = '123456'
print(s[::-1])
请将list中的元素age按从大到小排序
l = [{'name': 'a', 'age': 21}, {'name': 'c', 'age': 11}, {'name': 'b', 'age': 25}]
print(l[1])
# {'name': 'c', 'age': 11}
print(l[1]['age'])
# 11
new_l = sorted(l, key=lambda x: x['age'], reverse=True) # True 降序
print(new_l)
# [{'name': 'b', 'age': 25}, {'name': 'a', 'age': 21}, {'name': 'c', 'age': 11}]
字符串格式化方式
name = '臧三'
age = 11
s1 = '%s 你好' % name
s2 = '{} 你好{}'.format(name, age)
s3 = f'{name} 你好 {age}'
print(s1) # 臧三 你好
print(s2) # 臧三 你好11
print(s3) # 臧三 你好 11
下面代码输出啥
l = [1, 12, 2, 3, 2]
print(l[10:])
# []
'''
代码输出[],不会产生indexerror错误。
如果尝试获取l[10] ,将会报错
'''
写一个列表生成式,产生公差为10的等差
# 公差为10
print([i*10 for i in range(5)]) # [0, 10, 20, 30, 40]
# 公比为2
print([2**i for i in range(5)]) # [1, 2, 4, 8, 16]
删除list里重复元素
l1 = [1, 2, 3, 43, 21, 1, 1]
l2 = list(set(l1))
print(l2)
# [1, 2, 3, 43, 21]
找出两个列表中的相同元素,不同元素
l1 = [1, 12, 2, 3, 2]
l2 = [1, 2, 3, 43, 21, 1, 1]
set1 = set(l1)
set2 = set(l2)
# 相同元素(交集)
print(set1&set2) # {1, 2, 3}
# 不同元素(并集)
print(set1^set2) # {21, 43, 12}
列举字符串。列表。 元组。字段常用的方法
什么是反射?以及应用场景
python 深拷贝浅拷贝
python垃圾回收机制
打乱一个排好序的list
import randomrandom.shuffle(list1)
从0-99随机取10个数,要求不重复
print([x*x for i in range(1,11)])
介绍try- except
python 如何抛出异常。捕获 。处理
python递归的最大层数
998
列表推导式和生成器表达式区别
print([i % 2 for i in range(1, 10)])# [1, 0, 1, 0, 1, 0, 1, 0, 1]print((i % 2 for i in range(1, 10)))# <generator object <genexpr> at 0x000001EFD6F81B48>
闭包
实现一个装饰器,限制该函数被调用的频率,10秒一次
谈谈对闭包的理解
python 函数调用的时候参数的传递方式是值传递还是引用传递
递归函数停止的条件
mro是什么
什么是c3算法
列举面向对象只中带双下划线的特殊方法
双下线和单下划线区别
with用法
单例模式优点和应用
json序列化时,默认遇到中文转化成Unicode,如果要保留中文怎么办
<.> 和<.?> 区别
如何判断一个邮箱合法
基础题
如何交换两个变量的值
# python 特殊语法a,b = b, a# 其他语言int a=5,int b=3,1. 建立中间变量法int temp,temp = a,b = a,b = temp,2. 加减法a = a+bb = a-b (a+b-b )a = a-b (a+b-(a-b))3. 异或法a = a^bb = a^ba = a^b
如何高效拼接两个字符串
1. 用 + 来拼接字符串,如果拼接的字符串有多( n )个,python解释器会申请 n-1 个 内存空间,然后进行拷贝。2. 使用 .join(list) 只使用了一次内存空间。
list = [a,a,a,1,2,3,4,5,A,B,C]提取出”12345”
1. 遍历list = ['a','a','a',1,2,3,4,5,'A','B','C']a = []for i in list: if type(i) == int: a.append(i) 2. 解压赋值a,b,c,*aa,b,c,d = my_listprint(aa)
什么是元类
python 中 search 和match知识点
search和match都在re模块中。1. match只匹配字符串的开始,如果开始不符合正则表达式,则匹配失败,函数返回None2. search匹配整个字符串,直到找到一个匹配。
python深浅拷贝
1. 浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,2. 深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。
# 浅拷贝l1 = [1,2,3]l2 = copy.copy(l1)l1[0] = 'hello'print(l1,l2)# ['hello',2,3] [1,2,3]因为列表1本来在一块空间之内,通过copy列表2开辟了一块新的空间,并把列表1的元素复制过来。所以无论怎么修改列表1,列表2不会变。l3 = [[1,2,3],[4,5,6]]l4 = copy.copy(l3)l3[0][0] = 'hello'print(l3,l4)# [['hello',2,3][4,5,6]] [['hello',2,3][4,5,6]]l3最外层指向一块内存地址,内层l3[0] l3[1] 分别指向一块内存地址。浅拷贝只复制了外层的内存地址,所以改变内层的数据,l4也会改变。# 深拷贝l5 = [[11,22,33][44,55,66]]l6 = copy.deepcopy(l5)print(l5,l6)深拷贝复制了内层的内存地址,所以修改l5,l6没有变化
python深浅拷贝 https://www.bilibili.com/video/BV1eE411P7Vh?from=search&seid=14542617443564894000&spm_id_from=333.337.0.0
多线程
python 内存管理
python filter方法
filter就像map,reduce,apply,zip等都是内置函数,用c语言实现,功能强大用于过滤与函数func()不匹配的值。两个参数第一个参数:function 或者 None第二个参数:sequence ,序列filter筛选出func(单参数函数)返回为True的值。func也可以用lambda如果为空,返回序列中为True的值。# 使用时:可以将filter对象转换成列表、元组、集合也可以使用for循环遍历
def func(x): return x>5l = [3,4,5,6,7,8]a = filter(func,l)print(a)print(list(a))# <filter object at 0x000001C064155488># [6, 7, 8]li = [1, 2, '', []]b = filter(None, li)print(list(b))# [1,2]
reduce()函数
标准库functools中的函数reduce()可以将一个接受两个参数的函数以迭代累积的方式作用到一个序列或迭代器上。# 可以指定一个初始值
from functools import reducea = [1, 2, 3]l = reduce(lambda x, y: x + y, a, 6)print(l)# 12
map函数
map把一个函数func依次映射到序列的每个元素上,并返回一个可迭代的map对象作为结果
m = map(lambda x:x+1,[1,2,3,4])print(m)print(list(m))# <map object at 0x000002B805F4F248># [2, 3, 4, 5]
函数签名
# 当我们在写函数时,比如a是字符串,这样写 a. 不会有提示def func1(a): a.# 这样写会提示字符串的所有方法def func2(a:str): a. # 指定返回值def func2(a:str,b:int)->str: pass# 没有返回值def func2(a:str,b:int)->None: pass
正则表达式re.sub
从一个字符串str中找到一个东西,然后替换成另一个东西
s = re.sub(pattern='张三',repl='zs',string=l,flags=re.S)print(s)pattern 要替代的字符串repl 替换成xxstring 要查找的字符串flags 匹配模式re.S 全文匹配# 去除所有的空格 re.sub(pattern=r'\s+',repl='',string=l,flags=re.S) # 另一种写法b = re.compile(r'\s+',flags = re.S)re.sub(pattern=b,repl='',string=l)
re.search()
re.findall
pattern = re.compile()url = pattern.findall(str)
字符串的查询替换
python 的 find 和 replace 函数find 查找的,返回下标(如果有多个,返回第一个的下标),查找不到,返回-1
string = 'life is short, I use python'print(string.find('file'))print(string.find('life'))print(string.replace('short', 'long'))# -1# 0# life is long, I use python
给定一个列表,打乱
shuffle 函数
import randoml = [1, 2, 3, 5, 6, 7, 8]random.shuffle(l)print(l)# [7, 8, 2, 5, 6, 1, 3]
装饰器
python 实现单例模式
实现一个斐波那契数列的生成器
前两项 0 1 ,后面每一项都等于前两项和。
def fib(n): a, b = 0, 1 for i in range(n): a, b = b, a + b yield adef main(): for val in fib(10): print(val)if __name__ == '__main__': main()
使用字符串拼接达到字幕滚动效果
import osimport timedef main(): content = 'xxx的python面试集' while True: os.system('cls') print(content) time.sleep(0.2) content = content[1:] + content[0]if __name__ == '__main__': main()
设计一个函数,返回给定文件名的后缀
考察正则表达式
def get_suffix(filename,has_dot=False): ''' filename:文件名 has_dot : 返回的后缀是否带点 ''' pos = filename.rfind('.') # 找到最右边的点的索引 if 0 < pos <len(filename)-1: index = pos if has_dot else pos+1 return filename[index:] else: return ''print(get_suffix('1.x.txt'))
可变长位置参数 *args
def func(*args): print(args) print(type(args))if __name__ == '__main__': func(1,2,'lkx') print('-'*10) func('9',10,'ljh') (1, 2, 'lkx')<class 'tuple'>----------('9', 10, 'ljh')<class 'tuple'>
可变长关键字参数 **kwargs
def func2(**kwargs): print(type(kwargs))if __name__ == '__main__': func2(a=1, b='122') <class 'dict'>
装饰器
# 以下是一个求质数的函数import time# 装饰器def is_prime(num): if num<2: return False elif num == 2: return True else: for i in range(2, num): if num%i == 0: return False return True# 输出2-1000之间的所有质数def prime_nums(): t1 = time.time() for i in range(2,1000): if is_prime(i): print(i) t2 = time.time() print(t2-t1)prime_nums()
以上代码看起来比较混乱,既包含逻辑部分,又包含计时部分
如果有多个函数需要计时,很麻烦,
使用装饰器
def display_time(func): def wapper(): t1 = time.time() func() t2 = time.time() print(t2 - t1) return wapperdef is_prime(num): if num < 2: return False elif num == 2: return True else: for i in range(2, num): if num % i == 0: return False return True# 输出2-1000之间的所有质数@display_timedef prime_nums(): for i in range(2, 1000): if is_prime(i): print(i)prime_nums()运行prime_nums()函数时,他首先会运行装饰器display_time,走到func()时,才运行prime_nums()
如果prime_nums()函数有返回值该怎么办
把返回值记录起来,放到res中去,res来接收func(),最后return
def display_time(func): def wapper(): t1 = time.time() res = func() t2 = time.time() print(t2 - t1) return res return wapperdef is_prime(num): if num < 2: return False elif num == 2: return True else: for i in range(2, num): if num % i == 0: return False return True# 输出2-1000之间的所有质数@display_timedef prime_nums(): count = 0 for i in range(2, 1000): if is_prime(i): count = count + 1 return countcount = prime_nums()print(count)
现在的问题是,我们把2-1000写在了函数了,如果我们要把计算的数写在
prime_nums()怎么办
需要在装饰器wapper中加参数,但是如果我们不知道加几个时,可以用 *args
# z装饰器def display_time(func): def wapper(*args): t1 = time.time() res = func(*args) t2 = time.time() print(f'total time:{t2-t1} s') # print('total time:{:.4} s'.format(t2-t1)) return res return wapperdef is_prime(num): if num < 2: return False elif num == 2: return True else: for i in range(2, num): if num % i == 0: return False return True# 输出2-1000之间的所有质数@display_timedef prime_nums(maxnum): count = 0 for i in range(2, maxnum): if is_prime(i): count = count + 1 return countcount = prime_nums(1000)print(count)