Python入门

update 2020.04.14: 读《Python 简明教程》后,进行了了一些修改

基础语法

r''表示不转义

三引号指定多行字符串,其中可以自由使用单双引号

在字符串中航模为的单个反斜杠表示字符串在下一行中继续,但是不添加换行符

print遇到逗号输出一个空格,默认结束换行,用end=''改变结尾自动输出的字符

format方法:大括号内索引从0开始,可以省略,也可以用关键字的方法

切片:变量[头下标:尾下标:步长]

在同一行中使用多条语句,语句之间使用分号分割

使用反斜杠进行显式行连接,即将一个语句分成多个物理行

如果有左括号没有右括号,则为隐式行连接

二进制:0b100相当于4

八进制:0o100相当于64

十六进制:0x100相当于256

在交互模式中,最后被输出的表达式结果被赋值给变量_

Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误

如果从break退出循环,对应的else块不会执行

函数

global声明变量是个全局变量

一个函数逻辑上第一行的字符串是这个函数的DocStrings。DocStrings的书写惯例是:首行首字母大写,结尾有句号;第二行为空行;第三行以后为详细的描述

模块

每一个 Python 模块都定义了各自的 __name__。如果其值为 '__main__',这说明用户正在单独运行这个模块,这时我们可以进行合适的操作

内置的dir()函数能以列表的形式返回某个对象定义的一系列标识符。如果这个对象是个模块,返回的列表中会包含模块内部所有的函数、类和变量。

这个函数接收一个可选的参数。当参数是模块名时,函数会返回对应模块的标识符列表。没有参数时则会返回当前模块的标识符列表

数据结构

创建空元组:tup1 = ()

创建一个空字典dict1 = {}

创建一个空集合set1 = set()

在 Python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list, dict 等则是可以修改的对象。

Python 函数的参数传递:

  • 不可变类型:类似 C++ 的值传递,如 整数、字符串、元组
  • 可变类型:类似 C++ 的引用传递,如 列表,字典

可变参数*args,转化为tuple

关键字参数**kw,转化为dict

可变参数可以直接传入,也可以通过*解封list/tuple传入

关键字参数也可以通过**解封dict传入

命名的关键字参数:限制可以传入的参数名,使用*分隔,但是如果之前有可变参数,就不需要分隔符了

当你创建了一个对象,并把它赋值给一个变量时,这个变量只是引用了这个对象,变量并不能代表对象自身!因此,你可以把变量名当作一个指针,它指向储存对象的那一块计算机内存。这称作绑定名称到对象

定义在类内,方法外的变量为类变量,属于这个类,在方法中使用类名.变量名访问

而方法内使用self.变量名的变量为对象变量,属于一个对象

每一个对象都通过self.__class__ 属性指向自己的类,因此类对象也可以用self.__class__.变量名访问

所有的类成员都是公共的。只有一种情况除外:如果你使用 双下划线前缀(例如__privatevar)时,Python会使用命名粉碎规则(name-mangling)作用于这个变量,并使其变为私有变量。

因此,结论就是所有的仅在类和对象之中的变量应当使用一个下划线来开头,所有其他的命名都是公共的,可以被其他类和对象访问。请记住这只是约定而非Python强制规定(使用双下划线除外)。

迭代、生成器、迭代器

用collections模块的Iterable类型判断一个对象是否可迭代

enumerate(list)把一个list变成索引、元素对

在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是(迭代器)Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

在类中创建一个迭代器:

  • __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
  • __next__() 方法会返回下一个迭代器对象。
  • StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

列表生成式外如果是[]就是list,如果是()就是generator

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行

调用一个生成器函数,返回的是一个迭代器对象

高阶函数、装饰器、偏函数

匿名函数:lambda [arg1 [,arg2,.....argn]]:expression

同时遍历两个或更多序列时,用zip()组合

反向遍历序列,使用reversed()函数

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

reduce()把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

filter()也接收一个函数和一个序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。函数返回一个Iterator

装饰器可以被想象成为一个快捷的方式去调用一个包裹函数(一个包裹着另外一个函数的函数,因此可以在内部函数调用之前及之后做一些事情)

functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单

文件

f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。

如果要改变文件当前的位置, 可以使用f.seek(offset, from_what)函数。

from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:

  • seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
  • seek(x,1) : 表示从当前位置往后移动x个字符
  • seek(-x,2):表示从文件的结尾往前移动x个字符

from_what 值为默认为0,即文件开头

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object

当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

异常

我们将所有可能引发异常或错误的语句放入try语句块中,然后将对应错误或异常的处理程序放入except子句(程序块)中。except子句会处理单个特定的错误或异常,或是一个带括号的错误或异常列表。 如果没有提供错误或异常的名字,它将处理所有的错误和异常

assert语句用于断言某值为True。 例如,如果您非常确定您正在使用的列表中至少有一个元素并且想要检查它,并且如果不是True则引发错误,那么assert语句在这种情况下是理想的。当assert语句失败时,会引发AssertionError

作者

xqmmcqs

发布于

2020-02-29

更新于

2022-01-18

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×