前:
刚看第一章。
首先第一个程序,文件名为:humansize;文件内容如下:
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))
笔记:
零、书写语法
1、python没有使用括号进行程序段分割。而是使用缩进。这样使得所有的python程序都遵行一样的书写规则。
2、python所有的名称都区分大小写。
3、python不支持内嵌的赋值。不能使用 if a = b的方式。
一、函数
申明:def approximate_size(size, a_kilobyte_is_1024_bytes=True):
1、以def关键字申明函数。无需指定函数入口参数类型和返回参数类型(实际上python从来不显式的指明类型)。虽然没有申明函数返回值,但是实际上python总是返回一个值,如果使用return则返回return指明的值,否则返回none。
2、函数参数可以指定默认值,如上例中的True。说明这个参数是可以选的,如果不使用它,它会默认为True。如程序最后一行的调用。
函数调用方式:
二、文档字符串(docstring)
使用三重引号区别文档字符串和正是程序。可以作为程序注释。
python里面所有的都是对象,函数也不例外,而且函数有一个__doc__(注意左右两边各有两个"_") 属性,可以调用函数的docstring信息。比如说利用如下语句:
>>> import humansize
>>> print(humansize.approximate_size.__doc__)
可返回:
Covert a file size to human-readable from.
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
但是,通过我的实验,除了在函数名定义后的三重引号之间的文字为docstring外其他的好像只是单程的注释。因为在程序其他段加入注释后调用上面的语句并不能返回相应的内容。
三、import路径
当使用import导入一个模块时。python3使用特定的路径进行搜索。该路径由sys.path指定。使用如下命令查看:
>>> import sys
>>> sys.path
使用sys.path.insert(0,new_path)可以插入一个新的路径,从而使其出现在路径的开头。
四、异常
如果在python shell里面发生了异常,则python会打印这个异常以及它如何发生的信息,并返回到程序的顶部,但并不处理。如果需要对异常进行处理则需要使用try...except。python使用try...except处理异常,而使用raise来抛出异常。
1、捕获导入错误
其中一个 Python 的内置异常是 ImportError
,它会在你试图导入一个模块并且失败的时候抛出。这有可能由于多种原因引起,但是最简单的情况是当在你的 import 搜索路径里面找不到这个模块的时候会发生。你可以用这个来包含可选的特性到你的程序中。例如, 这个 chardet
库 提供字符编码自动检测。也许你的程序想在这个库存在的时候使用它,但是如果用户没有安装,也会优雅地继续执行。你可以使用 try..except
块来做这样的事情。
try:
import chardet
except ImportError:
chardet = None
然后,你可以用一个简单的 if
语句来检查 chardet
模块是否存在:
if chardet:
# do something
else:
# continue anyway
五、运行脚本
看程序的最后几行代码。
if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
首先、其首行缩进与函数申明时的缩进相同。说明其层次与函数申明相同。
其次、使用模块的一个内置属性:__name__(注意左右两边各有两个"_")
模块的__name__属性取决于如何使用这个模块。如果使用import导入,那么其__name__为模块名:如下面程序:
>>> import humansize
>>> humansize.__name__
'humansize'
如果直接运行程序脚本,则模块的__name__为__main__。