第一次接触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、啄木鸟社区