Python基础笔记(1)-Python速览
类型操作
python3中有六个标准数据类型,分别是Number数字、String字符串、List列表、Tuple元组、Set集合、Dictionary字典。数据类型有可变与不可变之分:
- 不可变数据:Number、String、Tuple
- 可变数据:List、Dictionary、Set
在参数传递过程中,不可变类型和可变类型有一定的区别:
- 如果传递的是不可变类型,则是一个值传递,函数内部的修改不会对实际对象产生影响
- 如果是可变类型,则是引用传递,函数内部的修改会对实际对象产生影响
数字(Number)
python3中的数字类型支持int、float、bool、complex(复数)。
可以使用
type()
内置函数来查询变量所指的对象类型,或者使用isinstance()
来判断是否是某种类型:
1
2
3
a = 20
type(a) # <class 'int'>
isinstance(a, int) # True
type()
:只考虑最基本的类型,不会认为子类是一种父类类型isinstance()
:考虑继承,认为子类是一种父类类型
在变量赋值的时候创建Number对象,可以使用del语句删除单个或者多个对象的引用。
相关数学函数 | ||
---|---|---|
abs(x) | ceil(x) | exp(x) |
fabs(x) | floor(x) | log(x) |
log10(x) | max(x1,x2,...) | min(x1,x2,...) |
modf(x) | pow(x, y) | round(x [,n]) |
sqrt(x) |
fabs(x)
:返回数字的绝对值modf(x)
:返回x的整数部分与小数部分
字符串(String)
- 反斜杠可以用来转义,使用
r
可以让反斜杠不发生转义 - 按字面意义级联字符串,如
"this " "is " "string"
会被自动转换为this is string
- 字符串可以用
+
运算符连接在一起,用*
运算符重复。 - Python
中的字符串有两种索引方式,从左往右以
0
开始,从右往左以-1
开始 - 字符串的截取的语法格式如下:
变量[头下标:尾下标:步长]
- python字符串不能被改变,不能向一个索引位置赋值
字符串格式化:
1 |
|
字符串常用方法:
方法 | 描述 |
---|---|
capitalize() | 字符串首字母大写 |
swapcase() | 大写转小写、小写zhuan |
count(str, beg=0, end=len(string)) | 返回str在字符串里面出现的次数 |
startswith(substr, beg=0, end=len(string)) | 检查字符串是否以substr开始,返回布尔值 |
endswith(suffix, beg=0, end=len(string)) | 检查字符串是否以suffix结束,返回布尔值 |
find(str, beg=0, end=len(string)) | 检查str是否包含在字符串中,如果找到则返回开始索引,否则返回-1 |
rfind(str, beg=0, end=len(string)) | 与find类似,不过是从右边开始查找 |
index(str, beg=0, end=len(string)) | 与find类似,但是如果没有找到会报异常 |
rindex(str, beg=0, end=len(string)) | 与index类似,不过是从右边开始查找 |
join(seq) | 以字符串作为分隔符,对seq进行拼接 |
len(string) | 返回字符串长度 |
replace(old, new [,max]) | 将字符串中的old替换为new,max指定替换的最大次数 |
split(str="", num=string.count(str)) | 以str为分隔符截取字符串,如果num有指定值,则仅截取num+1个子字符串 |
lstrip() / rstrip() / strip() | 删除字符串左边/右边/左右的空格 |
列表(List)
增删改查:
1 |
|
列表常用方法:
方法 | 描述 |
---|---|
list.append(obj) | 在列表末尾添加新的对象 |
list.count(obj) | 统计某个元素在列表中出现的次数 |
list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值 |
list.index(obj) | 从列表中找到某个值第一次匹配的索引位置 |
list.insert(index, obj) | 将对象插入列表 |
list.pop([index = -1]) | 移除列表中的元素并返回该值 |
list.remove(obj) | 移除列表中某个值的第一个匹配项 |
list.reverse() | 列表逆序 |
list.sort(key=None, reverse=False) | 列表排序 |
list.clear() | 清空列表 |
list.copy() | 复制列表 |
元组(Tuple)
- 可以使用下标索引来访问元组中的值,也可以截取其中的部分元素
- 元组中的元素值不允许修改,但是可以对元组进行连接组合
- 元组中的元素值不允许删除,但是可以用del语句删除整个元组
集合(Set)
- 空集合的创建只能使用
set()
,因为{}
是用来创建空字典的
集合常用方法:
方法 | 描述 |
---|---|
add() | 为集合添加元素 |
update() | 为集合添加元素 |
clear() | 移除集合中的所有元素 |
copy() | 复制集合 |
union() | 返回两个集合的并集 |
difference() | 返回集合的差集 |
intersection() | 返回集合的交集 |
symmetric_difference() | 返回两个集合中不重复元素集合 |
isdisjoint() | 判断两个集合是否包含相同元素 |
issubset() | 判断集合是否为另一个集合的子集 |
issuperset() | 判断集合是否为另一个集合的超集 |
pop() | 随机移除元素 |
remove() | 移除指定元素 |
discard() | 删除集合中指定元素 |
字典(Dictionary)
- 键值对中的Key必须是不可变类型,例如数字、字符串、元组
字典常用方法:
方法 | 描述 |
---|---|
dict.clear() | 删除字典内所有元素 |
dict.copy() | 返回一个字典的浅复制 |
dict.fromkeys(seq[, value]) | 静态方法。创建一个新字典,以序列seq中的值为key,value为默认值 |
dict.get(key, default=None) | 返回指定Key的值,如果不在则返回默认值 |
dict.setdefault(key, default=None) | 返回指定Key的值,如果不在则会添加对应的Key并将值设置为default |
dict.items() | 返回Key-Value集合 |
dict.keys() | 返回Key集合 |
dict.values() | 返回value集合 |
dict.update(dict2) | 利用dict2来更新dict |
dict.pop(key[,default]) | 删除Key所对应的值并返回 |
dict.popitem() | 返回并删除字典中的最后一个键值对 |
数据类型转换
函数 | 描述 |
---|---|
int(x [,base]) | 将x转换为一个整数,可以指定base进制 |
float(x) | 将x转换为一个浮点数 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将x转换为字符串 |
repr(x) | 将x转化为表达式字符串,返回一个对象的String格式 |
eval(str) | 执行字符串中的有效Python表达式并返回一个对象 |
tuple(s) | 将序列s转换为一个元组 |
list(s) | 将序列s转换为一个列表 |
set(s) | 将序列s转换为可变集合 |
dict(d) | 创建一个字典,d是键值对元组序列 |
frozenset(s) | 将s转换为不可变集合 |
chr(x) | 将整数转换为一个字符,对应ASCII码 |
ord(x) | 将字符转换为对应的ASCII码整数 |
hex(x) | 将一个整数转换为十六进制字符串 |
oct(x) | 将一个整数转换为八进制字符串 |
模块和包
模块是一个包含所有定义函数和变量的文件,其后缀名为.py
。模块可以被其他的程序import
引入,以使用该模块中的函数等功能。
1 |
|
一个模块被另一个程序第一次引用的时候,其主程序将被运行。我们可以使用__name__
属性来使得程序块仅在模块自身运行时执行:
1 |
|
内置的
dir()
函数可以找到模块内定义的所有名称,以一个字符串列表的形式返回
包是一种管理Python模块命名空间的形式,在包中组织了目录的层级关系。目录只有包含了一个叫做__init__.py
的文件才会被认作是一个包,在这个文件中可以包含一些初始化代码等,当然也可以什么都不写。
注意,如果是使用形如from package import item
引入的时候,item既可以是包中的子模块,也可以是包中定义的其他名称,比如函数,类或者变量。如果是使用形如import item.subitem.subsubitem
这种形式引入的时候,则除了最后一项,其他的都必须是包,并且最后一项可以是模块或者包,但是不可以是类、函数或者变量的名字。
当我们引入一个包的时候,会执行它的__init__.py
文件,因此在这个文件我们可以定义一些初始化操作。在这个文件中,我们也可以定义一个名称为__all__
的列表变量,这样如果我们使用形如from package import *
的形式引入的话,就会引入__all__
列表变量中定义的相关模块。如果此时__all__
没有定义的话,则不会导入包中的任何子模块。不过总结来说,我们还是推荐使用from package import sepcific_submodule
这种形式来引入。
错误和异常
异常处理机制:
1 |
|
抛出异常使用raise
关键字。我们也可以创建一个新的异常类,它需要直接或者间接继承Exception
。
面向对象
基础
1 |
|
- 构造方法为
__init__()
- 以单下划线开头的属性是protected类型的,以双下划线开头的属性是private类型的
- 以双下划线开头和结尾代表Python里的特殊方法
1 |
|
- 可以在继承中使用父类的构造函数
- 同名重写父类方法
1 |
|
- 直接通过指定多个父类来实现多继承
- 如果父类中有相同的方法名,而子类使用的时候没有指定,则Python从继承列表中从左到右搜索
- 使用
super()
来调用父类中的方法
类属性和方法:
- 类的私有属性以两个下划线开头,不能在类的外部被使用或直接访问
- 类的私有方法以两个下划线开头,只能在类的内部调用
特殊方法
在Python中,类存在一些特殊方法,即前后均为双下划线的方法。这些特殊方法有着各自的功能。
专有方法 | 描述 |
---|---|
__new__ |
创建类实例时会被调用,优先于构造函数执行 |
__init__ |
构造函数 |
__del__ |
析构函数 |
__str__ |
对象的字符串表示,用于print |
__repr__ |
对象的字符串表示,一般用于调试 |
__setitem__ |
按照索引赋值 |
__getitem__ |
实现通过索引取值 |
__len__ |
获取长度 |
__cmp__ |
比较运算 |
__call__ |
直接对实例进行调用,就像使用函数一样 |
__add__ |
加运算,用于运算符重载 |
__sub__ |
减运算,用于运算符重载 |
__mul__ |
乘运算,用于运算符重载 |
__truediv__ |
除运算,用于运算符重载 |
__mod__ |
求余运算,用于运算符重载 |
__pow__ |
乘方运算,用于运算符重载 |
- hasattr()函数
hasattr()函数用来判断某个类实例对象是否包含指定名称的属性或者方法,用法如下:
1 |
|
- getattr()函数
getattr()函数用来获取某个类实例对象中指定属性的值,如果不存在对应属性,则判断是否设定了默认值。如果有则返回默认值,如果没有则报错AttributeError
:
1 |
|
- setattr()函数
setattr()函数可以用来修改实例对象中的属性值,也可以实现为实例对象动态添加属性或者方法:
1 |
|
迭代器与生成器
迭代器
迭代器是一个可以记住遍历位置的对象,它从集合的第一个元素开始访问,知道所有的元素都被访问结束。迭代器只能往前而不能后退。我们需要利用iter()
方法来创建一个迭代器对象,然后使用其中提供的一个next
方法来访问下一个元素,我们也可以用常规的for来遍历一个迭代器对象。
1 |
|
我们也可自己创建一个迭代器,只需要在自定义的类中实现两个方法__iter__()
以及__next__()
方法:
__iter__()
:返回一个迭代器对象,这个对象实现了__next__()
方法,并通过StopIteration
异常来标识迭代的完成__next__()
:返回下一个值
1 |
|
生成器
使用了yield的函数被称生成器(Generator)。生成器是一个返回迭代器的函数,只能用于迭代操作,我们可以将生成器理解为一个迭代器。在每次调用生成器的时候,遇到yield函数会暂停并保存当前的运行信息,返回yield的值,直到下一次调用next方法的时候再从当前位置继续运行。
1 |
|
依赖生成
一个好的习惯是对于每一个Python项目都准备一个对应的虚拟环境,这样可以保证不同项目之间的环境不会产生冲突。在Python中也提供了相关的命令来查看当前的依赖项,下面的命令可以列出当前环境中的依赖项。
1 |
|
不过直接使用该命令可能会输出一些路径信息而非版本信息,此时使用下面的命令可以解决:
1 |
|
通常情况下,我们会将项目的依赖项以及相关版本都存放在requirements.txt
文件当中,此时我们将上面命令的输出进行重定向即可。同时,我们也可以很轻易地通过这个文件进行依赖项的安装,通过下面的命令即可:
1 |
|