python面试题(基础)(二)

本文讨论了Python编程面试中可能涉及的问题,包括字符串操作(如匹配标签内容和过滤字符)、正则表达式应用、多线程和多进程的区别、HTTP请求的GET和POST、以及不可变与可变数据类型的原理和使用。还展示了lambda函数的应用、字典排序和字符计数的方法,以及使用filter函数过滤列表中的奇数。

面试题

  1. 避免转移给字符串添加哪个字符代表原始字符

例如:raw_string = r'C:\Users\Username\Desktop'
  1. 中国
    ,用正则匹配出来标签里面的内容(中国),其中class类型事不确定的
import re
a = """<div class='name'>中国</div>"""
res = re.findall("<div class='.*'>(.*?)</div>", a)
print(res)
  1. 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的优势
  1. http请求中的get请求和post的请求的区别
1.GET请求是通过URL直接请求数据,数据信息可以在url中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的。
2.GET请求也有数据大小的限制,一般是不能超过1024个字节,而这种说法不完全准确,http协议并没有设置URL字节长度的限制,而是浏览器做了一些处理,所以长度依据浏览器的的不同而不同;POST请求在HTTP协议中也没有说明,一般来说是没有限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET请求,大量的数据使用POST请求
3.GET请求因为参数暴露在URL中,安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数的信息是放在请求头的,所以安全性比较高,可以使用。在实际中,涉及到登陆操作的时候,尽量使用HTTPS的请求,安全性更好
  1. int(1.4)和int(“1.4”)的区别
    INT函数只能将合法的整数字符串转换为整数,对于包含小数点的字符串吧,应该使用float函数进行转换
  2. 提高python运行效率的方法
1.使用生成器,可以节约大量的内存
2.循环代码优化,避免过多的执行重复的代码
3.核心模块用Cython,PyPy等
4.多进程,多线程,协程
5.多个ifelse的判断,把最有可能的写道最前面,减少程序的判断次数,提高效率
6.使用更高的数据结构,选择合适的数据结构可以显著的提高程序的性能,例如,使用set来简称成员资格要比使用list要快的多,因为set的平均时间复杂度是O(1),而list是O(n)
7.避免全局变量
  1. 列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:
1.整数
2.浮点数
3.字符串
4.元组
5.布尔值
原理:不可变类型意味着对象的身份,类型,和值一旦创建之后就不能改变,如果试图修改值,实际上是创建了一个新的对象,而旧的对象如果引用计数为0的情况下还会被垃圾回收。不可变类型的对象可以作为字典的键

可变的数据类型:
1.字典
2.列表
3.集合
原理:可变对象允许你在对象创建之后修改创建的内容,意味着你可以添加,删除修改存储在对象中的数据,这种灵活性以为着可变对象可以更容易的用于需要频繁的修改数据的情况下。但是也意味着,他们不能作为字典的键,因为字典的键的不变性是确定字典键的基础

总结:不可变类型提供了数据的一致性和安全性,因为一旦数据创建,就不会被意外 修改,这使得不可变类型在多线程环境中特别有用,避免了数据竞争和同步的问题。而可变类型提供了灵活性和方便的数据操作的能力,有其他需要频繁修改数据集合的时候。
  1. 利用lambda函数实现两个数相乘
n = lambda x, y: x*y
n(1,2)
  1. 字典根据键进行从小到大排序
dict1 = {'name':'1',"age":'2',"city":"3"}
lis1 = sorted(dict1.items(),key=lambda i:i[0])
dict(lis1)
  1. 如何统计字符串中字符出现的次数
方法一:
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
  1. 字符串a = “not 404 found 张三 99 深圳”,每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳"
import re
a = "not 404 found 张三 99 深圳"
re.findall(r"[a-zA-Z0-9]+",a)
  1. 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的元素
### Python 基础面试题汇总 以下是针对Python基础的一些常见面试题及其解答: #### 1. **什么是`namedtuple`? 它的作用是什么?** `namedtuple` 是 `collections` 模块中的一个工厂函数,用于创建具有命名字段的元组子类。它使得访问数据更加直观和易于理解,同时也支持通过索引来访问元素[^1]。 ```python from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) print(p.x) # 输出: 1 print(p.y) # 输出: 2 ``` #### 2. **解释一下`deque` 的用途以及如何使用?** `deque`(双端队列)是一个线程安全的双向队列实现,允许从两端高效地添加或移除元素。相比列表,`deque` 在频繁操作头部时性能更优[^1]。 ```python from collections import deque d = deque([1, 2, 3]) d.appendleft(0) # 添加到左侧 d.pop() # 移除右侧最后一个元素 print(d) # 输出: deque([0, 1, 2]) ``` #### 3. **`Counter` 类的主要功能有哪些?** `Counter` 是一个字典子类,专门用来计数可迭代对象中各元素出现的次数。它可以快速统计频率并执行集合运算[^1]。 ```python from collections import Counter c = Counter(['a', 'b', 'a', 'c', 'b', 'a']) print(c.most_common(2)) # 输出最常见的两个元素 [('a', 3), ('b', 2)] ``` #### 4. **描述`defaultdict` 和普通字典的区别?** `defaultdict` 是一种特殊的字典,默认会为不存在的键提供默认值,而不会抛出 KeyError 异常。这可以简化代码逻辑。 ```python from collections import defaultdict dd = defaultdict(int) dd['key'] += 1 # 即使'key'之前未定义也不会报错 print(dd['key']) # 输出: 1 ``` #### 5. **下面这段代码的结果是什么?为什么?** ```python def testFun(): temp = [lambda x : i * x for i in range(5)] return temp for everyLambda in testFun(): print(everyLambda(3)) ``` 运行结果将是 `[12, 12, 12, 12, 12]` 而不是预期的 `[0, 3, 6, 9, 12]`。这是因为闭包捕获的是变量本身而不是其当时的值。可以通过绑定当前值来解决这个问题[^3]。 修正后的版本如下所示: ```python def testFun(): temp = [lambda x, i=i: i * x for i in range(5)] return temp for everyLambda in testFun(): print(everyLambda(3)) # 正确输出: [0, 3, 6, 9, 12] ``` #### 6. **Python 中字符串拼接的最佳实践是什么?** 对于少量字符串连接可以直接使用加号 (`+`) 或逗号 (`,`),但对于大量字符串建议采用 `.join()` 方法以提高效率[^2]。 ```python strings = ["hello", "world"] result = "".join(strings) # 更高效的写法 print(result) # 输出: helloworld ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值