面试题
- 避免转移给字符串添加哪个字符代表原始字符
例如:raw_string = r'C:\Users\Username\Desktop'
-
中国,用正则匹配出来标签里面的内容(中国),其中class类型事不确定的
import re
a = """<div class='name'>中国</div>"""
res = re.findall("<div class='.*'>(.*?)</div>", a)
print(res)
- python中断言方法举例
a = 3
assert (a > 1)
b = 1
assert(b> 2)
print('断言失败')
4. 简述多线程,多进程
进程:
1.操作系统进行资源的分配和调度的基本单位,多个进程之间相互独立
2.稳定性好,如果一个进程崩溃,不影响其他的进程,但是进程消耗资源打,开启的进程数量有限制。
线程:
1.cpu进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下面的多个线程可以共享该进程的所有资源。
2.如果IO密集操作,则可以多线程运行效率高,缺点就是如果一个线程崩溃,则这个进程也会崩溃
应用:
IO密集的就用多线程,例如在用户输入sleep的时候,可以切换到其他线程执行,减少等待的时间
cpi密集的就用多进程,因为加入IO操作少,用多线程的话,线程共享一个全局解释器锁,当前运行的线程就会霸占GIL,其他线程没有GIL,就不能重新利用多核CPU的优势
- http请求中的get请求和post的请求的区别
1.GET请求是通过URL直接请求数据,数据信息可以在url中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的。
2.GET请求也有数据大小的限制,一般是不能超过1024个字节,而这种说法不完全准确,http协议并没有设置URL字节长度的限制,而是浏览器做了一些处理,所以长度依据浏览器的的不同而不同;POST请求在HTTP协议中也没有说明,一般来说是没有限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET请求,大量的数据使用POST请求
3.GET请求因为参数暴露在URL中,安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数的信息是放在请求头的,所以安全性比较高,可以使用。在实际中,涉及到登陆操作的时候,尽量使用HTTPS的请求,安全性更好
- int(1.4)和int(“1.4”)的区别
INT函数只能将合法的整数字符串转换为整数,对于包含小数点的字符串吧,应该使用float函数进行转换
- 提高python运行效率的方法
1.使用生成器,可以节约大量的内存
2.循环代码优化,避免过多的执行重复的代码
3.核心模块用Cython,PyPy等
4.多进程,多线程,协程
5.多个ifelse的判断,把最有可能的写道最前面,减少程序的判断次数,提高效率
6.使用更高的数据结构,选择合适的数据结构可以显著的提高程序的性能,例如,使用set来简称成员资格要比使用list要快的多,因为set的平均时间复杂度是O(1),而list是O(n)
7.避免全局变量
- 列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:
1.整数
2.浮点数
3.字符串
4.元组
5.布尔值
原理:不可变类型意味着对象的身份,类型,和值一旦创建之后就不能改变,如果试图修改值,实际上是创建了一个新的对象,而旧的对象如果引用计数为0的情况下还会被垃圾回收。不可变类型的对象可以作为字典的键
可变的数据类型:
1.字典
2.列表
3.集合
原理:可变对象允许你在对象创建之后修改创建的内容,意味着你可以添加,删除修改存储在对象中的数据,这种灵活性以为着可变对象可以更容易的用于需要频繁的修改数据的情况下。但是也意味着,他们不能作为字典的键,因为字典的键的不变性是确定字典键的基础
总结:不可变类型提供了数据的一致性和安全性,因为一旦数据创建,就不会被意外 修改,这使得不可变类型在多线程环境中特别有用,避免了数据竞争和同步的问题。而可变类型提供了灵活性和方便的数据操作的能力,有其他需要频繁修改数据集合的时候。
- 利用lambda函数实现两个数相乘
n = lambda x, y: x*y
n(1,2)
- 字典根据键进行从小到大排序
dict1 = {'name':'1',"age":'2',"city":"3"}
lis1 = sorted(dict1.items(),key=lambda i:i[0])
dict(lis1)
- 如何统计字符串中字符出现的次数
方法一:
from collections import Counter
a = 'asdajsdnakjshdkjhqweb mznxbcmznbqkjwheqh zkdhaisdho qiwksdckjas'
res = Counter(a)
方法二:
char_count_direct = {}
for char in a:
if char in char_count_direct:
char_count_direct[char] += 1
else:
char_count_direct[char] = 1
char_count_direct
- 字符串a = “not 404 found 张三 99 深圳”,每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳"
import re
a = "not 404 found 张三 99 深圳"
re.findall(r"[a-zA-Z0-9]+",a)
- filter 方法求出列表中所有的奇数,并构造新的列表
a = range(0,100)
def fn(n):
return n%2 == 1
num_list = list(filter(fn, a))
提示:
filter函数是python的一个内置函数,用于过滤序列,保留那些使给定函数返回值为True的元素。
1.接受两个参数,一个函数一个可迭代对象
2.逐个将可迭代对象中的元素传递给函数
3.若函数对元素返回True,则该元素会被filter()函数保留
4.最终filter函数返回一个迭代器,其中包含所有使得给定函数返回True的元素