fileObject.truncate( [ size ])
2021年2月2日
想着写一个简单的脚本用来生成一些verilog的tb测试用例模板,脚本需要更新.v文件中的case语句,于是找了一下如何在文件中插入一行。
在这里看到了一段代码👉Python中文网
names = []
with open('names.txt', 'r+') as fd:
for line in fd:
names.append(line.split(' ')[-1].strip())
names.insert(2, "Charlie") # element 2 will be 3. in your list
fd.seek(0)
fd.truncate()
for i in xrange(len(names)):
fd.write("%d. %s\n" %(i + 1, names[i]))
这段代码以读写方式打开文件,将行处理后的内容放在names列表里,然后用insert函数对names列表执行插入操作,用seek将文件指针移到首部,之后调用truncate函数,最后把处理后的文本写入文件。关键在于truncate函数的作用是什么。
查了一下,语法是Python File truncate() 方法
fileObject.truncate( [ size ])
# size -- 可选,如果存在则文件截断为 size 字节
因此,在上面那段代码里面,truncate函数实际上是将这个文件里面已有的内容清空了。
并且可以推断出,以 r+ 模式打开文件的写入操作,如果新写入的行比原来的行数要少,那么就只替换前面几行,多的行会被保留下来(要不truncate函数就没啥用了,如果多的行不保留的话)。
测试的时候,就把上面代码段的truncate函数注释了,最后两行换成固定行进行测试,看看 r+ 模式是不是以替换的方式进行。
最后发现,确实是以替换的方式进行的,不过替换的单位不是行,而是字节。
lambda函数
2021年4月13日
在写程序时,需要让程序休眠一段时间,不过时间单位是微秒。想用time.sleep()函数,但这个函数的参数是秒。因此在网上找,发现了一段神奇的写法:
import time
usleep = lambda x: time.sleep(x/1000000.0)
usleep(100) #sleep during 100μs
瞬间惊为天人,lambda函数还能这么用?!
果断试了一下:
>>> k = lambda a: print(a/10)
>>> a = k(6)
0.6
>>>
>>> a = lambda x:print(x+1)
>>> print(a(6))
7
None
>>>
>>> a = lambda x:x+'123'
>>> print(a('789'))
789123
>>>
我悟了!
re模块几个表格
2021年4月20日
转义码 | 含义 |
---|---|
\d | 数字 |
\D | 非数字 |
\s | 空白符(制表符、空格、换行等) |
\S | 非空白符 |
\w | 字母数字 |
\W | 非字母数字 |
说明:反斜线(\)本身在正常的字符串中也需要转义。可以在字面值前加r前缀创建原始字符串。
锚定码 | 含义 |
---|---|
^ | 字符串或行的开头 |
$ | 字符串或行末尾 |
\A | 字符串开头 |
\Z | 字符串末尾 |
\b | 单词开头或末尾的空串 |
\B | 不在单词开头或末尾的空串 |
选项标志 | 含义 | 缩写,用于在模式中嵌入标志 |
---|---|---|
re.IGNORECASE | 打开后,忽略匹配字符的大小写 | (?i) |
re.MULTILINE | 打开后,对^和$的锚定规则应用于各行开头末尾 | (?m) |
re.DOTALL | 打开后,点字符(.)可以匹配换行符 | (?s) |
re.ASCII | 打开后,将转义码限制到ASCII字符 | (?a) |
re.VERBOSE | 详细模式,打开后,允许在模式中嵌入注释和额外的空白符 | (?x) |
eg1: case1 = re.compile(regex, re.IGNORECASE)
eg2: case2 = re.compile(regex, re.IGNORECASE | re.MULTILINE | re.DOTALL )
eg3: case3 = re.compile(r’(?i)\bT\w+’)
eg4: case4 = re.compile(r’(?im)\bT\w+’) 对多行字符串大小写无关匹配
断言 | 语法 | 备注 |
---|---|---|
肯定前向断言 | (?=pattern) | 后面的字符串符合pattern |
否定前向断言 | (?!pattern) | 后面的字符串不符合pattern |
肯定后向断言 | (?<=pattern) | 前面字符串符合pattern,表达式必须使用定长模式 |
否定后向断言 | (?<!pattern) | 前面字符串不符合pattern,表达式必须使用定长模式 |
注,pattern可为多个正则表达式的或
求列表的所有子集
2021年6月3日
在网上找如何得到列表所有子集的时候,看到这个不错的算法求列表的所有子集
上代码之前,先简单讲一下这其中的一些算法,通过之前的讲解,很容易就知道,对于一个集合中的元素,要么在它的集合中,要么不在,我们是不是可以利用0和1来表示,比如上面的集合S,我们就来试一下,
(a) --> (100)=4
(b) --> (010)=2
(c) --> (001)=1
(a,b) --> (110)=6
(a,c) --> (101)=5
(b,c) --> (011)=3
(a,b,c)–> (111)=7
() --> (000)=0
是不是具有一定的规律?
# -*- coding: utf-8 -*-
list_demo = ['a', 'b', 'c']
sub_list_all = [] # 用于存放集合所有的子集
for i in range(1 << len(list_demo)): # 循环遍历0到2**n之间的每个数
combo_list = [] # 用于存放每个单独的循环中取出的子集
for j in range(len(list_demo)):
if i & (1 << j): # 每一个数用&操作判断改为上是否有1
combo_list.append(list_demo[j]) # 有的话保存起来
sub_list_all.append(combo_list)
print(len(sub_list_all))