Python编程思想

几年前问过一个同事:“有没有编程思想入门的书?”他说没有。现在我大概理解了编程思想,下文通过一例加强理解。

通过command+space打开spotlight输入terminal,进入终端后输入“jupyter notebook”回车,点击右上角New>Python2(环境是Anaconda,python2.7版本,直接谷歌搜进入官网下载安装),新建一个列表:

music = ["Shape of You","Love on the Brain","Fake Love"]

Python列表的增删改查功能暂且不表,列表可以嵌套,如:

music = ["Shape of You",2017,"Ed Sheeran",85,
      ["Bruno Mars",["Taylor Swift", "Drake","Rihanna","Big Sean","James"]]]

我们可以通过print(music[4][1][0])来取值,也可以遍历列表。

for i in music:
     print i

Shape of You
2017 
Ed Sheeran
85 
['Bruno Mars', ['Taylor Swift', 'Drake', 'Rihanna', 'Big Sean', 'James']]

现在我们要把嵌套表里值也取出来,最容易想到的是if条件。
遍历music列表,发现列表中元素包含列表,则对这个列表元素再遍历一遍。
那么如何判断列表中元素类型为列表?先看看[官方文档]内置函数有没有,打开官方文档搜索function或者built-function发现很多内置函数:

好像只有isinstance和issubclass可能合适,再看看好像isinstance对。

isinstance(object, classinfo)

 Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect     or virtual) subclass thereof. Also return true if classinfo is a type object (new-style class) and object is an object of that type or of a (direct, indirect or virtual) subclass thereof. If object is not a class instance or an object of the given type, the function always returns false. If classinfo is a tuple of class or type objects (or recursively, other such tuples), return true if object is an instance of any of the classes or types. If classinfo is not a class, type, or tuple of classes, types, and such tuples, a TypeError exception is raised. 

我们试试,没有问题,就它了:

isinstance(music[3],list)
 False

 isinstance(music[4],list)
 True

开始写了

for item in music:
     if isinstance(item,list):
        for i in item:
            print i 
     else:
         print item

 Shape of You 
 2017
 Ed Sheeran
 85
 Bruno Mars
 ['Taylor Swift', 'Drake', 'Rihanna', 'Big Sean', 'James']

结果还差一点点,是三层嵌套,再加一个判断:

for item in music:
     if isinstance(item,list):
        for i in item:
            if isinstance(i,list):
               for deep_item in i:
                   print deep_item
        else:
                print i
     else:
         print item

Shape of You
2017
Ed Sheeran
85
Bruno Mars
Taylor Swift
Drake
Rihanna
Big Sean
James

如果有100个嵌套,我得写100次if,很显然函数就是解决办法。搜索官方文档,发现有详细说明
开始自己写函数:

def print_deep(item):
    for i in item:
        if isinstance(i,list):
            print_deep(i)
        else:
            print i

print_deep(music)

Shape of You
2017
Ed Sheeran
85
Bruno Mars
Taylor Swift
Drake
Rihanna
Big Sean
James


但是输出结果每一行都没有缩进,能不能通过空格展示嵌套?官方文档写的实在是太差了,介绍另外一个Hands-on Python Tutorial对python函数的介绍–1.11.4. Function Parameters,python函数可以指定多个函数参数。那好,我们可以用第二个函数控制缩进。第一层级,缩进2格,第二层级,缩进4格;第三层级缩进6格。

我们先解决python打印tab的问题,经过搜索发现,2.0版本不行得先导入3.0版本print函数,这样就可以直接调用打印tab。
从python3导入print函数语句是:

 from __future__ import print_function

python3的pirint函数对应的tab缩进是:

print ('\t',end = '')

需要注意的是导入python3的print函数后,print后面要用括号才能够执行命令,而导入前python2中print则不需要括号。

好了我们再看看前面的python内置函数,似乎range()能够控制tab缩进的次数。我们给函数增加一个参数level,最后语句如下:

from __future__ import print_function
 def print_deep(item,level):
       for i in item:
           if isinstance(i,list):
              print_deep(i,level+1)
           else:
               for tab in range(level):
                   print ('\t',end = '')
               print(i)


print_deep(music,0)

Shape of You
2017
Ed Sheeran
85
    Bruno Mars
        Taylor Swift
        Drake
        Rihanna
        Big Sean
        James

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注