Python初体验-开篇 代码全析

            第一次接触Python,现在就开始蟒蛇的威力。

 

            一、首先贴上我们要解析的code:  下载代码

                         '''Convert file sizes to human-readable form. Available functions: approximate_size(size, a_kilobyte_is_1024_bytes) takes a file size and returns a human-readable string Examples: >>> approximate_size(1024) '1.0 KiB' >>> approximate_size(1000, False) '1.0 KB' ''' SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], 1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']} def approximate_size(size, a_kilobyte_is_1024_bytes=True): '''Convert a file size to human-readable form. Keyword arguments: size -- file size in bytes a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024 if False, use multiples of 1000 Returns: string ''' if size < 0: raise ValueError('number must be non-negative') multiple = 1024 if a_kilobyte_is_1024_bytes else 1000 for suffix in SUFFIXES[multiple]: size /= multiple if size < multiple: return '{0:.1f} {1}'.format(size, suffix) raise ValueError('number too large') if __name__ == '__main__': print(approximate_size(1000000000000, False)) print(approximate_size(1000000000000)) # Copyright (c) 2009, Mark Pilgrim, All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE.

 

 

                         该程序的功能是将以字节为单位的文件大小转换为以更易读形式,如将1024 B转换为1KB

                        

 

         二、看看我们代码的执行情况:

    

                    

                   

                    我的系统里装了Cygwin,该软件能够模拟linux系统里的shell。

             首先, 使用ls命令查看当前目录里包含的文件,发现该程序的代码文件humansize.py;

             第二, 使用python命令执行该程序,注意加上文件扩展名,否则出现如图所示的NameError

         错误;执行成功后,可以看见输出(对10的12次方字节做单位转换):第一行为以1000进制做的

         单位转换,第二行以1024进制做的单位转换。

              if __name__ == '__main__': print(approximate_size(1000000000000, False)) print(approximate_size(1000000000000))

 

 

       三、再看看代码在Python Shell的调用情况:

                                                                                  

                

 

 

 

             sys.path为import的搜索路径,即当你在代码里或Python shell命令行下使用import向

     程序添加新的模块(module)时,Python解释器搜索该模块的所有路径。

 

             从上图我们可以看出:

             第一次import humansize时,提示ImportError错误;第二次import humansize时就很正常。

        这是因为我们第一次import humansize时,sys.path里不包含路径"C:/Documents 

        and Settings/Administrator.SCM/桌面/Python学习",所以import humansize时就无法

        找到humansize.py文件,当使用sys.path.insert将该路径添加进sys.path后,再import

        humansize就没问题了。

 

             import humansize后,我们就可以调用humansize.py里面的所有函数了。

             如:

             print(humansize.approximate_size(4000,False)),

 

            我们可以看到Python里调用函数的方式为:module_name.function_name(args),

       即import时所用的模块名.该模块所包含的函数名,再加上相关参数就可以了。

 

            同样地,我们还在Python Shell下 调用了print(humansize.approximate_size.__doc__)

       输出approximate_size函数的文档字符串(docstring,就是我们在其他语言里所说的注释)。

       Python里将注释放在一对三单引号之间,即''' 注释 '''  。

 

   四、最后我们总结些Python的基本语法:

 

        1、Python的性质是一个脚本语言,如js、PHP等。    

                        我们都了解脚本语言有一个性质,就是弱类型,轻量级,什么意思?就是说程序员

                     不用显示定义变量的类型,函数返回的类型,这些值得类型由脚本解释器自己去判断。

                      所以我们发现程序中定义的各变量和函数都没有返回类型,如变量SUFFIXES、size、

                    suffix、multiple等、函数approximate_size。

               2、变量:

                     Python中的变量我们不许定义,可以直接使用,变量名的定义和其他语言相似,这里

                    不多述。

                    关于变量,这里要特别注意程序中的__name__和SUFFIXES变量。

                             __name__是Python本身定义的变量。这有些类似PHP中的$_SERVER、

                      $_POST、$GET,都是预定义的。

                   

                             SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
                                                     1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] }

                    该变量是一个JSON变量。

                    下面我们简要谈谈JSON。

                3、JSON:

                      Javascript Object Notation,即js对象标记(或符号)。notation有标记、符号的

                      意思。懂js的大牛们都懂的,其是一种轻量级的数据交换格式,现在在Web上与XML

                      都实现C/S模式下的数据交换。

                      JSON简单地定义:

                      数组: test_array = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']

                      名值对对象:test_namevalue_object = { 'myname'      :   'heigger',

                                                                                            'country'  :    'china',

                                                                                            'job'          :    'IT'

                                                                                          }

 

                       该变量定义了一组名值对。访问时,可以使用variable_name[name]得到name

                        所对应的值value。如 test_namevalue_object [name]可以得到heigger、

                       SUFFIXES[1024]可以获得数组:

                                               ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] 。

 

 

                       关于JSON,还有重要的一点:就是名值对对象可以嵌套定义:

                      如nested_json= {

 

                                 'name': 'heigger',

                                 'family':

                                     {'howmanypeople':3, 'father': 'myfather', 'mother' :'mynother'}

                                 'hobby': ['computer', 'music', 'football' , 'silence']

                            }

 

 

 

                     4、字符串:

                            test_string = 'I am heigger'    使用单引号。字符串也可以算作一种JSON对象。

                  5、main程序:

                         if __name__ == '__main__': print(approximate_size(1000000000000, False)) print(approximate_size(1000000000000))

                            

                              这样的main很特殊吧,鉴于本人初次接触,不便多谈,在这我们可以使用这样的形式编写程序的main部分:

                                          if __name__ == '__main__': ''' 这是我们写的的main体 '''                                       

           6、函数定义:

                def approximate_size(size, a_kilobyte_is_1024_bytes=True): '''Convert a file size to human-readable form. Keyword arguments: size -- file size in bytes a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024 if False, use multiples of 1000 Returns: string ''' if size < 0: raise ValueError('number must be non-negative') multiple = 1024 if a_kilobyte_is_1024_bytes else 1000 for suffix in SUFFIXES[multiple]: size /= multiple if size < multiple: return '{0:.1f} {1}'.format(size, suffix) raise ValueError('number too large')  

               def approximate_size(size, a_kilobyte_is_1024_bytes=True): ''' 此处写注释 ''' #然后写函数体

           7、该程序中我们遇到一个循环结构,即for ... in

              for suffix in SUFFIXES[multiple]: size /= multiple if size < multiple: return '{0:.1f} {1}'.format(size, suffix)

              这和其他语言中的foreach结构是类似的,即循环in后数组的所有元素。

         8、code style :

              Python的代码块完全靠冒号:和代码缩进,如该程序中函数的定义、for...in

               的使用等。python中也没有用分号(;)表示一行语句的结束。

              所以Python的代码缩进风格很重要。

         9、注释 :

              单行注释:#

              多行注释:'''           '''

         10、异常处理:

              在程序中我们可以看到raise 关键字,ValueError('number must be non-negative')

            其跑出ValueError异常。

 

 

     到此为止吧!没有解释清楚的知识点定有所在,希望各位IT友指导交流。

参考:

 

1、啄木鸟社区

 

你可能感兴趣的:(【lang】Python初体验)