ExASIC
分享让工作更轻松

python的条件和循环

今天开始介绍python语言的控制流语句——条件(if-else,if-elif-else)和循环(while,for)。

有了基本的数据(砖瓦),我们还需要按一定的逻辑(水泥),把数据合理的组织起来,才能实现特定的功能(房子)。这部分内容与其它语言,比如C++语言,很接近,我们主要通过对比介绍它们的异同点。

条件

if cpp vs python

可以看出python有两点不一样,一是if、elif、else后有冒号:,二是else if简写成elif。else if (C++) -> elsif (Perl) -> elif (Python),越来越简洁。

例如,下面是一段网表处理的代码片段。当不需要else分支时,可以省略。

py-10-02

py-10-03

条件if-else语句可以嵌套,用缩进来控制。下面的示例中,if-else嵌套了三级。

py-10-04

循环

py-10-05

例如,下面的while代码段从10打印到1。for代码段把列表sModKeys元素逐个写入文件outfile里。

py-10-06

py-10-07

while一般用于有条件的循环,而for一般用来对序列或列表遍历操作。例如,我们知道字符串本身就是序列,所以字符串是可以逐个字符遍历的。

for c in "abc":
    print(c, end=' ')

将打印出: a b c

for循环与range

range是for循环的最佳搭档,利用range我们可以递增或递减的、指定步长的循环。

range(start=0, stop, step=1) start是开始点,默认是0。 stop是结束点,但不包括结束点。 step是步长,默认是1。 当开始点是0、步长是1时,可以简写成range(stop)

例如,下面的代码将逐个输出字符串的字符。

s = "abc"
for x in range(len(s)): #等价于for x in [0, 1, 2]:
    print(s[x])

又如,下面的代码逆序、间隔输出,将输出f、d、b。

s = "abcdef"
for x in range(len(s)-1, -1,-2): #停止点用-1是因为s[0]有可能需要输出
    print(s[x])
for循环与zip

zip可以把两个列表打包,for可以并行对两个列表遍历。例如,

L1 = ["AND2", "NOR2", "XOR2"]
L2 = [10, 20, 30]
for (x,y) in zip(L1, L2):
    print("Cell {} used {}".format(x, y))

上面的代码将输出:
Cell AND2 used 10
Cell NOR2 used 20
Cell XOR2 used 30

这种方法,常常可以遍历字典的keys和values列表。

for循环与enumerate

enumerate可以同时取出序列的索引和元素,当遍历序列时,如果需要索引值时,这将会比较方便。例如,

L1 = ["AND2", "NOR2", "XOR2"]
for (i,c) in enumerate(L1):
    print("{}: {}".format(i, c))

将输出:
0: AND2
1: NOR2
2: XOR2

for循环与map

map把序列的元素按照指定函数进行转换,并返回新的序列。例如,

s = "abc"
for x in map(ord, s):
    print(x)

这个例子中,map把字符串s转换成对应的ASCII码序列。其中ord可以替换成自定义的函数,这给了我们很大的便利。

退出循环

最后来看看如果中止和退出循环。对于循环我们可以用break和continue来退出循环。区别在于break退出整个while或for,而continue会立即结束本次循环,进入下一次循环。

例如,下面的代码打印所有使用个数大于等于5个的Cell。

L1 = ["NADN2", "NOR2", "NXOR2", "AND2", "OR2", "XOR2", "INV2", "BUF2"]
L2 = [10, 20, 30, 1, 6, 3, 60, 7]
for (x,y) in zip(L1, L2):
    if y < 5:
        continue
    print("Cell {} used {}".format(x, y))

将输出:
Cell NAND2 used 10
Cell NOR2 used 20
Cell NXOR2 used 30
Cell OR2 used 6
Cell INV2 used 60
Cell BUF2 used 7

又如,下面的代码打印出使用最多的6种Cell。先使用sorted对字典按value排序,打印输出时,当输出次数达到6后退出for循环。

D1 = {"NAND2":10,
      "NOR2" :20, 
      "NXOR2":30,
      "AND2" :1,
      "OR2"  :6,
      "XOR2" :3,
      "INV2" :60,
      "BUF2" :7}
L2 = sorted(D1.items(), key=lambda d: d[1], reverse=True)
D3 = dict(L2)
i = 0
for k in D3.keys():
    if i == 6: break
    print("Cell {} used {}".format(k, D3[k]))
    i += 1

将输出
Cell INV2 used 60
Cell NXOR2 used 30
Cell NOR2 used 20
Cell NAND2 used 10
Cell BUF2 used 7
Cell OR2 used 6

练习题

写一个python脚本统计网表中的module和stdcell的个数,并按照使用个数从多到少进行排列。

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA