python学习笔记


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值