今天开始介绍python语言的控制流语句——条件(if-else,if-elif-else)和循环(while,for)。
有了基本的数据(砖瓦),我们还需要按一定的逻辑(水泥),把数据合理的组织起来,才能实现特定的功能(房子)。这部分内容与其它语言,比如C++语言,很接近,我们主要通过对比介绍它们的异同点。
可以看出python有两点不一样,一是if、elif、else后有冒号:,二是else if简写成elif。else if (C++) -> elsif (Perl) -> elif (Python),越来越简洁。
例如,下面是一段网表处理的代码片段。当不需要else分支时,可以省略。
条件if-else语句可以嵌套,用缩进来控制。下面的示例中,if-else嵌套了三级。
例如,下面的while代码段从10打印到1。for代码段把列表sModKeys元素逐个写入文件outfile里。
while一般用于有条件的循环,而for一般用来对序列或列表遍历操作。例如,我们知道字符串本身就是序列,所以字符串是可以逐个字符遍历的。
将打印出:
a b c
range是for循环的最佳搭档,利用range我们可以递增或递减的、指定步长的循环。
range(start=0, stop, step=1)
start是开始点,默认是0。
stop是结束点,但不包括结束点。
step是步长,默认是1。
当开始点是0、步长是1时,可以简写成range(stop)
例如,下面的代码将逐个输出字符串的字符。
又如,下面的代码逆序、间隔输出,将输出f、d、b。
zip可以把两个列表打包,for可以并行对两个列表遍历。例如,
上面的代码将输出:
Cell AND2 used 10
Cell NOR2 used 20
Cell XOR2 used 30
这种方法,常常可以遍历字典的keys和values列表。
enumerate可以同时取出序列的索引和元素,当遍历序列时,如果需要索引值时,这将会比较方便。例如,
将输出:
0: AND2
1: NOR2
2: XOR2
map把序列的元素按照指定函数进行转换,并返回新的序列。例如,
这个例子中,map把字符串s转换成对应的ASCII码序列。其中ord可以替换成自定义的函数,这给了我们很大的便利。
最后来看看如果中止和退出循环。对于循环我们可以用break和continue来退出循环。区别在于break退出整个while或for,而continue会立即结束本次循环,进入下一次循环。
例如,下面的代码打印所有使用个数大于等于5个的Cell。
将输出:
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循环。
将输出
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的个数,并按照使用个数从多到少进行排列。