Python杂记
这些是我学习Python的过程中杂乱的一些记录,我将这些记录和Python的一些基本常识记录在这里,如果你想看系统的知识部分,目录在左边,点击对应的地方跳转吧!
逻辑运算符
代码 | 逻辑表达 |
---|---|
or | 或 |
and | 且 |
not | 取反 |
打印输出不换行
print("输出的内容", end="") # 加上end="",等于一个空的字符串,下一次输出会接在这次输出后继续输出
结束循环
代码 | 结束方式 |
---|---|
break | 结束所有的循环,往外跳一层 |
continue | 退出本次循环,进入下一次循环 |
变量
查看变量类型:
type(******)
常用的格式符号
符号 | 含义 |
---|---|
%c | 字符 |
%s | 字符串 |
%d | 有符号十进制整数 |
%f | 浮点实数 |
运算符
+ | - | * | / | // | % | ** |
---|---|---|---|---|---|---|
加 | 减 | 乘 | 除 | 取整数 | 取余 | 幂 |
复合运算
c+=a ==> c=c+a | c-=a ==> c=c-a |
---|---|
c*=a ==> c=c*a | c/=a ==> c=c/a |
c%=a ==> c=c%a | c**=a ==> c=c**a |
c//=a ==> c=c//a |
常用的数据类型转换
int(x) | 将x转换为一个整数 |
---|---|
long(x) | 将x转化为一个长整数 |
float(x) | 将x转化为一个浮点数 |
complex(real) | 创建一个复数 |
str(x) | 将对象转换为字符串 |
repr(x) | 将对象x转化为表达式字符串 |
eval(str) | 计算str中有效Python表达式,并返回一个对象 |
tuple(s) | 将序列s转换为一个元组 |
list(s) | 将序列s转化为一个列表 |
chr(x) | 将一个整数转化为一个字符 |
unichr(x) | 将一个整数转换为Unicode字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转化为十六进制字符串 |
oct(x) | 将一个整数转换为八进制字符串 |
Python内置的部分函数
len(item) | 容器中元素的个数 |
---|---|
max(item) | 返回容器中最大元素 |
min(item) | 返回容器中最小值 |
del(item) | 删除变量 |
可变和不可变类型
不可变类型 | 可变类型 |
---|---|
数字、字符串、元组 | 列表、字典 |
交换两个变量的值
# 所有语言都可用的方法
a = a + b
b = a - b
a = a - b
# Python特有的方法
a, b = b, a
a+=a与a=a+a的区别
以上三个程序,结果都不相同,第一个程序,因为a是不可变类型,所以不变;第二个程序,同样使用+=运算,但a变成了可变类型,所以发生了改变;第三个程序,虽然a是可变类型,但未使用+=运算,a没有发生改变。
开始执行语句
if __name__ == "__main__":
这个语句的作用是,当你这个模块写好之后,在本模块中加入这个语句,开始测试程序,当别的模块将你导入时,你测试程序的代码就不会被执行。
给程序传递参数
例如:
import sys # 所运行的python模块
print(sys.argv) # 所存储的参数,以列表形式存储
向以上程序传递参数运行,传递的参数中间用空格隔开,运行效果如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HCbUW79r-1572255305130)(https://cy-pic.kuaizhan.com/g3/75/30/f6c6-8db3-46e8-be68-2e3d913de9a828)]
eval向上一次转换
如上图,列表变为字符串后,再用列表是转换不回之前的列表的,但是用eval就可以
"=="和"is"的区别
== | 内容相同,值相同返回True |
---|---|
is | 两个变量存储的是同一个东西,即地址要相同才能返回True |
深拷贝和浅拷贝
浅拷贝:只复制地址
深拷贝:将内容复制出来,copy.deepcopy()
只深拷贝一层,不全部深拷贝:copy.copy()
当c是可变类型时,会深拷贝一层,当c是元组之类不可变类型时,等同于浅拷贝
进制转换
四舍五入
Python2中:使用round()方法来四舍五入
round(1.5) ==> 2.0
round(2.5) ==> 3.0
round(2.563, 2) ==> 2.56
Python3中round()方法的定义:离两个整点一样近时,取偶数(慎用)
round(1.5) ==> 2.0
round(2.5) ==> 2.0
round(1.35, 1) ==> 1.4
Python3中的四舍五入:
- 采用int向下取整:+0.5的方法
- 如上图,前两个四舍五入到整数,最后一个四舍五入保留到小数点后两位
字符串Str
字符串用单引号或双引号声明
切片
切片的前两个数值是切片的范围,第三个数值为切片的步长
查找
方法名 | 写法 | 备注 |
---|---|---|
find() | str.find() | 找到返回第一个字符的下标,找不到返回-1 |
rfind() | str.rfind() | 从右往左找,返回的结果和find()相同 |
index() | str.index() | 从左往右找,找到返回字符下标,找不到出现ValueError异常 |
rindex() | str.rindex() | 从右往左找,返回的结果和index()相同 |
计数
方法名 | 写法 | 备注 |
---|---|---|
count() | str.count(“xxx”) | 返回xxx在str的start和end之间出现的次数 |
检查
方法名 | 写法 | 备注 |
---|---|---|
startswith() | str.startswith(“xxx”) | 以xxx开头返回True,否则为False |
endswith() | str.endswith(“xxx”) | 以xxx结尾返回True,否则为False |
isalpha() | str.isalpha() | 纯字母返回True,否则返回False |
isdigit() | str.isdigit() | 纯数字返回True,否则返回False |
isalnum() | str.isalnum() | 所有字符都是数字或字母返回True,反之返回False |
isspace() | str.isspace() | 只含有空格返回True,反之返回False |
字符变化
方法名 | 写法 | 备注 |
---|---|---|
replace() | str.replace(“xxx”, “yyy”, n) | 将字符串中的xxx替换为yyy,替换n次 |
capitalize() | str.capitalize() | 把字符串第一个字符大写 |
title() | str.title() | 把字符串的每个单词首字母大写 |
lower() | str.lower() | 所有字符小写 |
upper() | str.upper() | 所有字符大写 |
显示
方法名 | 写法 | 备注 |
---|---|---|
center() | str.center(n) | 居中显示,n代表总共显示的宽度 |
ljust() | str.ljust(n) | 靠左显示 |
rjust() | str.rjust(n) | 靠右显示 |
空格
方法名 | 写法 | 备注 |
---|---|---|
lstrip() | str.lstrip() | 删除左边的空格 |
rstrip() | str.rstrip() | 删除末尾的空格 |
strip() | str.strip() | 删除两边的空白字符 |
切割和拼接
方法名 | 写法 | 备注 |
---|---|---|
split() | str.split(“xxx”, n) | 字符串以xxx字符进行切割,切割后最多有n个字符串,返回一个切割完成后的列表 |
partiton() | str.partition(“xxx”) | 以从左边找到的第一个xxx为中心切割字符串,返回元组 |
rpartition() | str.rpartition(“xxx”) | 以从右边找到的第一个xxx为中心切割字符串,返回元组 |
splitlines() | str.splitlines() | 按照换行符分割成一个列表 |
join() | 如下图例子 | 用指定的字符拼接多个字符串 |
拼接举例:
列表List
列表用[]进行声明
增删改查
方法名 | 写法 | 备注 |
---|---|---|
append() | list.append(x) | 列表尾部添加元素x |
insert() | list.insert(n, x) | 将元素x添加到下标为n的地方 |
extend() | list0.extend(list1) | 将list1中的元素逐一添加到list0中 |
pop() | list.pop() | 删除并返回列表最后一个元素 |
remove() | list.remove(x) | 删除列表中的元素x,从左开始,只删除一次 |
del() | del list[n] | 删除列表下标为n的元素 |
index(),count() | 这两个方法和字符串的用法相同 |
列表的切片和字符串的切片相同
排序
方法名 | 写法 | 备注 |
---|---|---|
sort() | list.sort() | 对列表从小到大排序 |
list.sort(key=len) | 按长度进行排序 | |
list.sort(reverse=True) | 升序排序 |
逆置
方法名 | 写法 | 备注 |
---|---|---|
reverse() | list.reverse() | 将列表逆置 |
列表生成式
a = [i for i in range(a, b, c)] # a为起始值,b为结束值,c为步长
a = [i for i in range(a, b, c) if i%2==0]
a = [(i, j) for i in range(a) for j in range(b)]
字典Dir
字典用 {键: 值} 声明
增删改查
dic["key"] = value # key不存在为添加,key存在为修改
del dic["key"] # key存在正常删除指定的键值对,key不存在时出现KeyError异常
dic.clear() # 清空整个字典
dic.get("key", n) # 查询字典中的键值,key存在时返回对应的value,不存在时返回n值。
dic.get("key") # 不加n时,如果key不存在会出现KeyError异常
dic.pop("key") # 将该键值对从字典中删除
dic.popitem() # 随机弹出一个字典项
dic.setdefault("key": value) # 功能和get()方法差不多,但key不存在时,会添加键值对{"key": value},存在时返回默认的value
dic1.update(dic2) # 将dic2中的键值对加入到dic1中,如果有相同的key会替换掉原来的值
dic.has_key("key") # key存在返回True,不存在返回False
所有键构成的一个对象
dic.keys()
例如:
所有值构成一个对象
dic.values()
items()
这个方法返回一个所有(键:值)元组的列表的对象
fromkeys()
这个方法用于创建一个新字典,如下图:
默认创建出的字典的值为None,如果不想使用默认的value值,可以自己提供一个特定值
元组Tuple
元组用 () 进行声明,元组的处理和列表相同,区别在于不能进行增删改操作,只支持查询的操作
集合Set
集合也用 {} 声明,但和字典不同,集合的特点是内部元素不能重复,所以集合常用来对列表中的元素去重,集合支持增删改查操作
函数
函数的声明:
def 函数名():
pass
关键字global:
变量前只要加上关键字,那声明的一定是全局变量
global a = []
不定长参数
def xxx(a, b, *args, **kwargs):
pass
多余的参数,没带变量名的以元组的形式保存在args中,带变量名的以字典的形式存储在**kwargs中*
如上图所示,我们在传递参数指定变量名时不能指定已有的变量名
匿名函数
-
方法中使用匿名函数
如下图,字典存放在列表中对列表的排序为例
-
函数调用传递匿名函数
如下图:
-
用户输入匿名函数并执行
使用eval()转换为其它类型,如下图:
操作文件
操作符
操作符 | 含义 |
---|---|
r | 以只读的方式打开,文件指针放在文件开头 |
w | 打开一个文件写入,已经存在的文件会被覆盖,不存在的文件会创建 |
a | 打开一个文件,将内容追加到文件末尾,不存在的文件会创建 |
rb | 以二进制格式打开一个文件只读 |
wb | 以二进制格式打开一个文件写入 |
ab | 以二进制格式打开一个文件追加 |
r+ | 打开一个文件用于读写,指针放在文件开头 |
w+ | 打开一个文件用于读写 |
a+ | 打开一个文件用于追加 |
rb+ | 同上综合理解 |
wb+ | 同上综合理解 |
ab+ | 同上综合理解 |
打开关闭
- 第一种,手动打开,手动关闭
f = open("文件路径", "操作符")
...
f.close()
- 第二种,手动打开,自动关闭
with open("文件路径", "操作符") as f: # 文件打开并存到变量f中
pass
部分方法
方法 | 写法 | 备注 |
---|---|---|
read() | file.read(n) | 每次读出n个字符,不写n时,一次全部读出,每读一次,虚拟光标向后移 |
write() | file.write(“xxx”) | 写入xxx内容,并返回写入的字符数 |
readline() | file.readline() | 一行一行的读 |
readlines() | file.readlines() | 将每一行读出并以列表的形式保存 |
seek() | file.seek(offset, whence) | 文件定位,移动虚拟光标。offset:开始的偏移量代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始;whence:可选,默认值为 0,表示要从哪个位置开始偏移,0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。 |
OS操作文件和文件夹
功能 | 方法 |
---|---|
文件重命名 | os.rename(“old_name”, “new_name”) |
删除文件 | os.remove(“xxxx”) |
创建文件夹 | os.mkdir(“xxx”) |
删除文件夹 | os.rmdir(“xxx”) |
获取当前路径 | os.getcwd() |
改变默认路径 | os.chdir(“xxx”) |
获取目录列表 | os.listdir(“xxx”) |
类Class
面向对象编程,面向对象开发的三个基本要素:①封装②集成③多态。类是模型,组成类的三部分:①类名②类的属性③类的方法。
类的定义
class 类名:
# 属性
def __init__(self, xx, xx):
# 属性初始化
pass
# 方法
def xxx(self):
pass
__str__方法
def __str__(self):
return xxxx
这个方法自动执行,当直接输入这个类时,会输出return的内容
默认的__str__方法和我们重写之后是不一样的,如果重写此方法,以重写后的方法为准
私有方法
类方法前加有 “__” 代表私有方法
class xxx:
def __xxx(self):
pass
私有的方法不会被子类继承,子类也无法直接调用,通常条用父类公有的方法,通过这个公有方法去调用子类
__del__方法
当这个类创建的对象彻底被删除时会执行这个方法
class xxx:
def __del__(self):
pass
测量对象的引用个数
import sys # 导入所需要的模块
class xxx:
pass
a = xxx() # 创建对象
n = sys.getrefcount(a) # 返回的值n即为对象引用的计数,getrefcount方法会比实际数多1
继承
-
普通的继承
# 子类 class xxx(父类): pass
-
多继承
# 子类 class xxx(父类1, 父类2, ......): pass
__mro__方法
直接输出可以看到这个类检索方法的顺序
super()方法
super()函数是用于调用父类(超类)的一个方法。用这个方法调用被重写的方法
类方法和类属性、实例属性和静态方法
# 例子说明
class Game(object): # Python3建议没有父类都写上这个object类
num = 0 # 类属性
def __init__(self): # 实例方法
self.name = "laowang" # 实例属性
@classmethod
def add_num(cls): # 类方法,各个实例对象共享方法
cls.num = 100
@staticmethod
def print_menu(): # 静态方法,不可以传参数,与类对象和实例对象没太大关系
pass
game = Game()
Game.add_num() # 可用类名,实例名来
game.add_num() # 调用类方法
Game.print_menu() # 可用类名,实例名来
game.print_menu() # 调用静态方法
__new__方法
__new__方法用于构造出一个正确的实例对象,重写后的__new__方法不具有此功能,用return返回父类的__new__方法
class xxx(object):
def __new__(cls):
pass
return object.__new__(cls)
单例类的写法
只能创建一次,以后再创建会返回和上一次一样的对象
class xxx(object):
__instance = None
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
属性property
让外部对象可以像调用属性一样调用私有方法
- 第一种写法
class Temp(object):
def __init__(self):
self.__num = 100 # 私有属性
def setNum(self, n):
self.__num = n
def getNum(self):
return self.__num
num = property(getNum, setNum) # 注意参数不要写反了
- 另外一种写法
class Temp(object):
def __init__(self):
set.__num = 100
@property
def num(self):
return self.__num
@num.setter
def num(self, n):
self.__num = n
# 调用
t = Test()
t.num = 50
print(t.num)
异常处理
结构使用
try:
# 可能出现异常的代码
pass
except.异常名称:
# 出现异常后执行的程序
pass
except Exception:
# 和else类似,没有捕获到异常执行这部分程序
pass
except Exception as ret:
print(ret) # 打印出具体的异常
else:
# 没有异常才会执行的代码
pass
finally:
# 不管有没有异常都要执行的程序
pass
抛出自定义异常
如下例子:
捕获异常后抛出异常
# 例子:
try:
return 11/0
except ZeroDivisionError as result:
if xxx:
# 输出捕获的异常
print(result)
else:
# 重新抛出这个异常,此时不会被这个异常处理捕获到
# 从而出发默认的异常处理,可以记入log日志中
raise
模块
模块,简单的说就是一个后缀为py的文件
导入
导入方式 | 备注 |
---|---|
import xxx | 全部导入 |
from xxx import * | 通常是全部导入(看__all__) |
from xxx import yyy | 只导入xxx中的yyy |
__all__
写在模块文件的开头
__all__ = ['xxx', 'yyy', .......]
当用上面第二种方式导入的时候,只能运用__all__列表中东西
包
一个文件夹下包含__init__.py和多个模块文件,我把这个文件夹称为包
注:必须包含__init__文件,python解释器才能认为这不是一个普通的文件夹,是一个包
我们可以在__init__.py文件中写入__all__,在用from 包名 import * 时,只会导入列表中的内容。
导入包的时候执行__init__.py文件
打包发布
首先,建立一个文件夹,文件夹下放入包和setup.py文件,setup.py中写入如下内容:
from distutils.core import setup
setup(name = "模块名", version = "版本号", description = "模块描述", author = "作者", py_modules = ['包名.模块名', ......])
然后运行如下命令:
python3 setup.py build # 构建模块
python3 setup.py sdist # 生成发布的压缩包
如果别人想用这个代码,拿到压缩包后进行如下步骤:
解压
python3 setup.py install
我们用上面的demo包来做一个示范:
把包放入一个文件夹中,并写如setup.py文件
构建模块:
生成发布压缩包:
如图所示,生成了一些文件,我们来看看文件的内容
添加搜索路径
import sys # 导入这个模块
sys.path.append('包的路径') # sys.path是一个包含搜索路径的列表,用列表方法来添加路径
模块的重新导入
程序导入模块后,模块代码可被修改,重导入
# 这是在不结束程序的前提下
from imp import *
reload(xxx) # 直接更新代码模块
生成器
一边循环,一边计算的机制,称为生成器:generator
- 创建生成器的方法一:把列表生成式的[]改为()
- 创建生成器的方法二:用yield关键字
- 得到生成器下一个值的几种方法
next(生成器对象)
生成器对象.__next__()
生成器对象.send(None)
装饰器
Python语法糖——装饰器
- 用装饰器给函数添加额外功能
def x(func):
def inter():
func()
return inter
@x # 语法糖
def y():
print('hello')
可以参考一下例子,知道装饰器的执行顺序:
- 装饰带参数的函数
- 装饰有不定长参的函数
以上是我整理的Python基础学习笔记,如有错误,欢迎邮箱反馈,基本学习过程中常用的东西我都写了,当然,也有写得不完整的地方,同样,欢迎邮箱交流。如果对你有帮助的话,打赏一瓶可乐吧(.)。。。感谢支持