《简明 Python 教程》笔记
原版:http://python.swaroopch.com/
中译版:https://bop.mol.uno/
- 有 int、float 没 long、double。没 char,string 不可变。
- help 函数
如果你有一行非常长的代码,你可以通过使用反斜杠将其拆分成多个物理行。这被称作显式行连接(Explicit Line Joining)5:
s = ‘This is a string. \ This continues the string.‘ print(s)
在某些情况下,会存在一个隐含的假设,允许你不使用反斜杠。这一情况即逻辑行以括号开始,它可以是方括号或花括号,但不能是结束括号。这被称作 隐式行连接(Implicit Line Joining)。i = \ 5
当我们声明一个诸如 *param 的星号参数时,从此处开始直到结束的所有位置参数(Positional Arguments)都将被收集并汇集成一个称为“param”的元组(Tuple)。
类似地,当我们声明一个诸如 **param 的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为 param 的字典(Dictionary)。def total(a=5, *numbers, **phonebook): print(‘a‘, a) #遍历元组中的所有项目 for single_item in numbers: print(‘single_item‘, single_item) #遍历字典中的所有项目 for first_part, second_part in phonebook.items(): print(first_part,second_part) print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
- 如果 return 语句没有搭配任何一个值则代表着 返回 None。None 在 Python 中一个特殊的类型,代表着虚无。每一个函数都在其末尾隐含了一句 return None,除非你写了你自己的 return 语句。
- Python 中的 pass 语句用于指示一个没有内容的语句块。
- 函数的第一行逻辑行中的字符串是该函数的 文档字符串(DocString),通过函数的
__doc__
属性获取,help 函数就是取的这个值。字符串约定(不是必须)是一串多行字符串,其中第一行以某一大写字母开始,以句号结束。第二行为空行,后跟的第三行开始是任何详细的解释说明。 - 当模块第一次被导入时,它所包含的代码将被执行。
- 包是指一个包含模块与一个特殊的
__init__.py
文件的文件夹,后者向 Python 表明这一文件夹是特别的,因为其包含了 Python 模块。 - Python 中有四种内置的数据结构——列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。
- 列表是可变的(Mutable)而字符串是不可变的(Immutable)。
- 元组(Tuple)用于将多个对象保存到一起。你可以将它们近似地看作列表,但是元组不能提供列表类能够提供给你的广泛的功能。元组的一大特征类似于字符串,它们是不可变的,也就是说,你不能编辑或更改元组。
- 一个空的元组由一对圆括号构成,就像 myempty = () 这样。然而,一个只拥有一个项目的元组并不像这样简单。你必须在第一个(也是唯一一个)项目的后面加上一个逗号来指定它,如此一来 Python 才可以识别出在这个表达式想表达的究竟是一个元组还是只是一个被括号所环绕的对象。
- 字典的键值只能使用不可变的对象(如字符串)。
- 列表、元组和字符串可以看作序列(Sequence)的某种表现形式。序列的主要功能是资格测试(Membership Test)(也就是 in 与 not in 表达式)和索引操作(Indexing Operations),它们能够允许我们直接获取序列中的特定项目。
- 如果你希望创建一份诸如序列等复杂对象的副本(而非整数这种简单的对象(Object)),你必须使用切片操作来制作副本。如果你仅仅是将一个变量名赋予给另一个名称,那么它们都将引用同一个对象。
- 围绕函数,也就是那些能够处理数据的代码块设计我们的程序,这被称作面向过程(Procedure-oriented)的编程方式。还有另外一种组织起你的程序的方式,它将数据与功能进行组合,并将其包装在被称作“对象”的东西内。在大多数情况下,你可以使用过程式编程,但是当你需要编写一个大型程序或面对某一更适合此方法的问题时,你可以考虑使用面向对象式的编程技术。
- 类方法与普通函数只有一种特定的区别——前者必须多加一个参数(习惯叫self,但是可以是任何名字)在参数列表开头,这个名字必须添加到参数列表的开头,但是你不用在你调用这个功能时为这个参数赋值,Python 会为它提供。
- 当你调用一个这个对象的方法,如 myobject.method(arg1, arg2) 时,Python 将会自动将其转换成 MyClass.method(myobject, arg1, arg2)——这就是 self 的全部特殊之处所在。
__init__
方法会在类的对象被实例化(Instantiated)时立即运行,相当于java 的构造方法。- 字段(field)只不过是绑定(Bound)到类与对象的命名空间(Namespace)的普通变量。字段(Field)有两种类型:类变量与对象变量
- 除了
类名.字段
,我们还可以使用self.__class__.字段
来引用类变量,因为每个对象都通过 self.class 属性来引用它的类。 类方法(classmethod)和静态方法(staticmethod)
class Person: @classmethod def id(cls): pass
装饰器(decorator)@classmethod
等价于调用 id = classmethod(id)
- 双下划线开头的字段或方法是私有的,对类和对象来说都是如此。
class Student(SchoolMember):
表示Student
是SchoolMember
的子类。要想使用继承,在定义类需要在类后面跟一个包含基类名称的元组。- 如果子类中定义了
__init__
方法,则实例化子类时不会自动调用父类的__init__
方法;如果子类中没有定义,则初始化子类时会自动调用父类的__init__
。 - Python 提供了一个叫作
Pickle
的标准模块,通过它你可以将任何纯 Python 对象存储到一个文件中,并在稍后将其取回。这叫作持久地(Persistently)存储对象。 - 通过在程序的第一行写
# encoding=utf-8
表明当前 python 文件时用 utf-8 编码的。 用
try..except..else..finally
处理异常。用raise
抛出异常,被抛出的必须是Exception
的子类对象。
python try: text = input(‘Enter something --> ‘) except EOFError: print(‘Why did you do an EOF on me?‘) except KeyboardInterrupt as ex: print(‘You cancelled the operation.‘) else: # 如果没有异常则执行 print(‘You entered {}‘.format(text)) finally: pass
with
语句。可以使一些finally
写起来简单些。
python with open("poem.txt") as f: for line in f: print(line, end=‘‘)
with
会获取到 open() 返回的对象 f,并在接下来的代码块执行之前先执行 f.__enter__()
,在代码块执行之后接着执行 f.__exit__()
。
- 熟悉 Python 标准库 之后,许多事都变得很容易。
用元组多项赋值,也可以以此实现多返回。
python a,b = 1,2
- class 中有些方法有特殊意义,特殊方法用来模拟内置类(built-in types)的一些行为。
__init__(self, ...)
This method is called just before the newly created object is returned for usage.__del__(self)
Called just before the object is destroyed (which has unpredictable timing, so avoid using this).__str__(self)
Called when we use the print function or when str() is used.__lt__(self, other)
Called when the less than operator (<) is used. Similarly, there are special methods for all the operators (+, >, etc.)__getitem__(self, key)
Called when x[key] indexing operation is used.__len__(self)
Called when the built-in len() function is used for the sequence object.
lambda 表达式
:points = [{‘x‘: 2, ‘y‘: 3}, {‘x‘: 4, ‘y‘: 1}] points.sort(key=lambda i: i[‘y‘]) print(points)
列表推导(List Comprehension):
listone = [2, 3, 4] listtwo = [2*i for i in listone if i > 2] print(listtwo)
- 通过使用
*
和**
前缀可以向函数传递元素个数不确定的元组和字典。 What Next。 //TODO