python 基础知识(面试)

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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值