谈下python的GIL
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。 多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
python中生成随机整数、随机小数、0--1之间小数方法
随机整数:random.randint(a,b),生成区间内的整数 随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数 0-1随机小数:random.random(),括号中不传参
避免转义给字符串加哪个字母表示原始字符串?
r , 表示需要原始字符串,不转义特殊字符
列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),如下图用id()方法可以打印对象的id
str1='abfdsbcbbdbfsadfsdfs'
str2='abfdsbcbbdbfsadfsdfs'
print(id(str1))
print(id(str2))
out:
1949681734472
1949681734472
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
s = "32123423424234234",去重并从小到大排序输出
str1="32123423424234234"
a=set(str1)
a=list(a)
print(a)
a.sort(reverse=False)
print(a)
out:
['4', '2', '3', '1']
['1', '2', '3', '4']
避免转义给字符串加哪个字母表示原始字符串?
r , 表示需要原始字符串,不转义特殊字符
用lambda函数实现两个数相乘
# -*- coding:utf-8 -*-
sum=lambda a,b:a*b
print(sum(4,5))
利用collections库的Counter方法统计字符串每个单词出现的次数
import collections
str='fasdfsdasdsfwefadfsdfafrrfasdfasdf'
print(collections.Counter(str))
filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# -*- coding:utf-8 -*-
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def demo(a):
if a%2!=0:
return True
else:
return False
print([one for one in filter(demo,a)])
a=(1,)b=(1),c=("1") 分别是什么类型的数据?
a=(1)
b=("1")
c=(1,)
print(type(a),type(b),type(c))
#<class 'int'> <class 'str'> <class 'tuple'>
a=(1,)
b=("1",)
c=(1,)
print(type(a),type(b),type(c))
#<class 'tuple'> <class 'tuple'> <class 'tuple'>
正则re.complie作用
re.compile是将正则表达式编译成一个对象,加快速度,并重复使用
regex=re.compile("\d+")
print(regex.findall("fasdfsdfsdfsd23423423fasdfasdf34r"))
两个列表[1,5,7,9]和[2,2,6,8]合并为[1,2,2,3,6,7,8,9]
extend() 向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加
- 直接用+号看上去与用extend()一样的效果,但是实际上是生成了一个新的列表存这两个列表的和,只能用在两个列表相加上
a=[1,2,3,4,5]
b=[4,5,6,7,8]
print(a+b)
print(a.extend(b))
用python删除文件和用linux命令删除文件方法
python:os.remove(文件名) linux: rm 文件名
datetime模块打印当前时间戳
import datetime
print(datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")+"星期:"+str(datetime.datetime.now().isoweekday()))
###写一段自定义异常代码
try:
1/0
except BaseException as e:
raise BaseException("不能除0")
正则表达式匹配中,(.)和(.?)匹配区别?(很重要)
(.)是贪婪匹配,会把满足正则的尽可能多的往后匹配 (.?)是非贪婪匹配,会把满足正则的尽可能少匹配
a='fsafdffsfasdfsdf sdaf fasdf fsdf'
print("贪婪匹配",re.search("f(.*)f",a))
a='fsafdffsfasdfsdf sdaf fasdf fsdf'
print("非贪婪匹配",re.search("f(.*?)f",a))
贪婪匹配 <_sre.SRE_Match object; span=(0, 32), match='fsafdffsfasdfsdf sdaf fasdf fsdf'>
#非贪婪匹配 <_sre.SRE_Match object; span=(0, 4), match='fsaf'>