面对对象
类
1 | class Person: |
这里的self是一个相当于this指针一样的东西。
这里相当于Person.say(p),即任何没有参数的函数也都需要它。
__init__()是一个构造函数。
类变量
1 | class Person: |
这里的population属于整个类,某个实例拥有的变量会覆盖类拥有的变量。
Person.population与self.__class__.population是相同的效果。
@classmethod是一个装饰器,标记该方法是一个类方法。
这等效于howMany = classmethod(howMany)。
注:任何属性都是公开的,除非标识符使用__开头。
继承
python可以多继承。
1 | class Person: |
新建类后面的括号是一个Tuple,可以有多个类名,访问按照指定顺序进行。
输入与输出
input()进行读入,参数是输入提示;print()进行输出。
文件操作
1 | poem = '''\ |
open()提供encoding=可以指定为"utf-8"等编码。
Pickle
可以持久的存储对象,打开文件需要二进制选项('b'),其次,使用pickle.dump和pickle.load存储和读取。
异常
使用try except语句处理异常,同样可以加入else,finally可以在任何情况下运行。
通常使用try读取资源而用finally释放资源。
可以用as将异常对象命名,raise可以抛出异常。
1 | class TestTooShortError(Exception): |
这里的自己定义的异常需要继承。
1 | try: |
这里的finally语句是在释放资源,保证文件被关闭。
使用with语句更加方便:
1 | with open("1.txt") as f: |
这里的过程中,保证会调用__enter__()和__exit__()方法。
处理import的异常
导入库如果它不存在或是找不到时,或许只是希望程序跳过某些部分,而不是崩溃。
1 | try: |
此时检查是否导入就非常的简单:
1 | if chardet: |
某些时候希望使用某个库的另一个实现(它可能更快,更稳定),只需要在抛出异常后,在except后写下import somethingSlower as somethingFaster,从而避免重名的麻烦。
断言
assert后接表达式,错误后直接抛出异常。
os模块
os.getcwd()(访问当前目录),os.chdir()(变更工作目录)。
处理路径(os.path)
1 | print(os.path.join(os.path.expanduser('~'), 'diveintopython3', 'examples', 'humansize.py')) |
join()可以在不同的平台加入不同的分隔符,将路径转为绝对路径(也可以使用realpath()),并会在必要的时候加入分隔符,接受多个参数。
还有可以分离路径和文件名的:split(),将返回一个元组;分离文件名和后缀名的:splitext()
通配符匹配文件(glob)
glob.glob('examples/*.xml')这将返回符合的所有的文件名组成的列表。
获取元数据(os.stat())
这包括很多的元数据,修改时间(st_mtime),大小(st_size)但它们的返回值需要些处理才能看得懂。
推导
列表推导
1 | listone = [2, 3, 4] |
[(os.stat(f).st_size, os.path.realpath(f)) for f in glob.glob('*.xml')]任何表达式都可以。
字典推导
metadata_dict = {f:os.stat(f) for f in glob.glob('*test*.py')}与列表推导类似。
可以用来交换键和值:{value:key for key, value in a_dict.items()}。
集合解析
{2**x for x in range(10)}这与列表的类似。