python是面向对象语言,在python中,万物皆对象。
变量:变量是用来临时保存数据的,程序是用来处理数据的。
切片(截取):
语法:[起始下标:结束下标:步长] 步长可省略,默认为1。 左闭右开,不包含结束下标。
若从头部开始,0可以省略,即[:结束下标]。
[::-1] 将字符串反转,从右往左读,步长为1
列表list:可变类型 []。基本操作与字符串相同
创建列表五种方式:
List.append()
List.insert()
List+[] 列表相加
List=[x for x in range(10)]
list=list(range(10))
元组tuple:不可变类型 () 。
如果元组中只有一个元素时,后面必须加逗号,否则将视为加了括号的int型,如tuple=(1,)。
元组不可以修改或删除元素,只能查看或遍历元素。
字典的常用操作:
修改元素:mydict[key] =value 通过key修改对应的value。
添加元素:mydict[key] =value 若key存在,则覆盖原来的值,若不存在则创建新的元素。
删除元素:del mydict[key]
mydict.clear() 清空字典,相当于初始化
list(mydict.keys()) 返回字典中所有的key的列表
list(mydict.values()) 返回字典中所有的value的列表
mydict.items() 返回一个包含所有(键,值)元祖的列表。返回[(key1,value1),(key2,value2)…]
for key,value in mydict.items() key和value都是临时别量,分别代表字典中的key值和value值。
标识符:由字母、数字和下划线组成,且不能以数字开头
关键字:一些具有特殊功能的标识符。
查看所有的关键字:
import keyword
print(keyword.kwlist)
input() 在python3中输入之后得到的结果是字符串类型,与python2中raw_input()的结果一样,但是python2中的input()得到的结果取决于用户自己输入的类型
如:name = input(“请输入您的名字”)
print()默认自动换行,即print(‘’,end=’\n’)。可以指定结尾输出,如print(‘’,end=’’)指定不换行
格式化输出:
一个变量格式化输出:
age =18
print(“小明的年龄%d岁” % age)
多个变量格式化输出:
print(“名字%s 年龄%d岁” % (name,age))
常用格式化输出符号:
%d int型(%2d 显示两位输出,如果只有1位,使用空格占位,默认右对齐,若想左对齐,则用%-2d);
%s 字符串;
%f float型,默认保留小数点后6位(%.2f 保留两位小数);
对于bool型,若想输出True或False,则用%s;若想输出0或1,则用%d
加+ 减- 乘* 除/ 取整除//(9.0//2.0=4.0) 取余% 指数 **
and: x and y 若x是False,则返回False,否则返回y的值
or: x or y 若x是True,则返回True,否则返回y的值
not:not x
条件语句 If…else…与elif :
Python 中没有if…if else嵌套: 需要用if…elif…
循环语句while与for:
for 临时变量 in 列表或字符串等可迭代对象:
循环执行语句
for ...else.. 和while ...else...:for循环或者while循环结束后,会执行else中的语句,但是若for循环或while循环中执行了break,else的语句将不会执行。
break 和continue:
配合循环使用。
执行break,则停止循环,直接跳出当前循环,且break后面的语句都不执行。
执行continue,则提前结束本次循环,直接进入当前循环中的下一次循环,continue后的代码不执行。
数据类型转换:
如:int(x) 将x转为int型,int(3.5)=3 直接去掉小数部分 、 float() 、str()、eval() 常与input()一起用
查看变量名或数值的数据类型:type(变量名或数值)
范围标识:range
range(1,5) 左闭右开(范围是1,2,3,4)
range(x) 范围是0-x 可以用来单纯表示x次循环
计算字符串中字符个数(计算长度):len(str)
将序列中的元素以指定字符x连接生成一个新的字符串:’x’.join(sequence)
注:此处的x可以是单个字符,也可以是字符串
for i,value in enumerate(mylist) i和value都是临时别量,分别代表列表的下标和其对应的值。
mytuple.index(x) 查找元组中元素x的索引下标
mytuple.count(x) 获取元素x在元组中出现的次数
list(mydict.keys()) 返回字典中所有的key的列表
list(mydict.values()) 返回字典中所有的value的列表
mydict.items() 返回一个包含所有(键,值)元祖的列表。返回[(key1,value1),(key2,value2)…]
for key,value in mydict.items()
key和value都是临时别量,分别代表字典中的key值和value值。
位置参数必须一一对应:def test(a,b) test(1,2) 则a=1 b=2
关键字参数没有顺序要求:def test(a,b) test(b=1,a=2) 则a=2 b=1
注:当位置参数与关键字参数混合使用时,位置参数必须放在前面,关键字参数放在后面;如果某个参数使用了关键字参数,则其后面的所有参数都需要使用关键字参数。
缺省参数:给形参定义一个默认值,若调用函数时提供了实参,那就使用实参,若没有提供就使用默认值(缺省参数);在定义函数时,若某个形参使用了缺省参数,那其后面的形参都需要使用缺省参数。
拆包: 如:a,b,c=[1,2,3] 即a=1 b=2 c=3
拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
除了对元组拆包之外,还可以对列表、字典等拆包,其中对字典拆包时,取出的值是key。
交换变量的值:
a,b =4,5 赋值 a=4 b=5
a,b=b,a 同时给a,b重新赋值a=b b=a,即交换a,b 的值 即a=5 b=4
全局变量: global a
args 可变的参数列表,接收的参数用元组存储
**kwargs 键值对参数列表,接收的参数类型是键值对,用字典存储。
**kwargs对应的参数必须放在args对应的参数后面
列表和元组的区别:
列表可变,元组不可变。
元组无法复制。 原因是元组是不可变的。 如果运行tuple(tuple_name)将返回自己。
列表和set集合的区别:
列表是有序的,元素可以重复;
集合无序,会自动过滤重复的数据
lambda表达式
如对字典进行排序,依据key值排序:
方法一,用sort():
d = {1:3,5:2,4:4}
d = list(d.items()) #转为list类型,才可以用sort
d.sort(key=lambda x:x[0]) #如果要用value排序,则为x[1],若要降序排列, 则使用sort(key=xxx ,reverse=True)
print(d)
方法二,用sorted()
d = {1:3,5:2,4:4}
sorted(d.items(),key=lambda x:x[0])
print(d)
注:不管是sort还是sorted中的key都是一个匿名函数,参数为前面的列表,遍历列表取值,返回给sorted作为排序依据。d.items()将原来的字典中的键值对,分别搜存入到一个元组中–>(key,value),生成一个元组列表,即[(key1,value1),(key2,value2),(key3,value3)]
open(文件名,访问模式)
访问模式:r只读 w只写(会把原来数据清空,再写) a追加写
打开文件:f = open(‘a.txt’,’r’) 返回一个文件对象
关闭文件:f.close()
写数据:以只写模式打开文件
f = open(‘a.txt’,’w’) f.write(‘aaaaa’) 文件不存在时就创建该文件
写入中文: window的电脑中保存中文编码格式为gbk,字符是utf-8,所以写中文时需要指定格式为utf-8,即f = open(‘a.txt’,’w’,encoding=’utf-8’)
读数据: 以只读模式打开文件
f = open(‘a.txt’,’r’) f.read(n) 若指定n则从文件开始读n个字符
f = open(‘a.txt’,’r’) f.readlines() 一次性读文件中的每行数据,并保存到列表中,每一行的数据为一个元素
f = open(‘a.txt’,’r’) f.readline() 读一行
文件备份:
1、打开原文件f=open(‘a.txt’,‘r’)
2、读取数据result=f.read()
3、创建备份文件f2=open(‘a2.txt’,’w’)
4、将读取的内容写入进备份文件f2.write(result)
5、关闭两个文件
注:通过此方法打开文件不需要关闭:with open(…) as f:
# 导入模块import xlsxwriter
# 打开student.xlsx文件 若没有则自动创建
workbook = xlsxwriter.Workbook("student.xlsx")
# 创建一张工作表
worksheet = workbook.add_worksheet()
# 设置第一行信息
worksheet.write(0, 0, "学号") 第一列
worksheet.write(0, 1, "姓名") 第二列
worksheet.write(0, 2, "年龄") 第三列
# 学生信息列表
student_list = [{"name": "小明", "age": 20, "no": "20170901001"},
{"name": "小红", "age": 21, "no": "20170901002"},
{"name": "小刚", "age": 20, "no": "20170901003"},
{"name": "小海", "age": 23, "no": "20170901004"},
{"name": "小阳", "age": 25, "no": "20170901005"}]
# 遍历列表for i, info in enumerate(student_list):
# 写入数据
# write(第x行, 第x列, 写入的数据)
worksheet.write(i + 1, 0, info["no"])
worksheet.write(i + 1, 1, info["name"])
worksheet.write(i + 1, 2, info["age"])
# 关闭文件
workbook.close()
# 导入模块import xlrd
# 读取到excel文件
data = xlrd.open_workbook("student.xlsx")
# 获取列表 第一张表
table = data.sheet_by_index(0)
# 获取所有的行数
nrows = table.nrows
# 获取所有的列数
ncols = table.ncols
# 获取第一行的数据
first_row_name_list = table.row_values(0)
print(first_row_name_list)
# 定义一个列表保存所有行的数据
info_list = []
# 遍历所有行
for rownum in range(1, nrows):
# 获取
row = table.row_values(rownum)
# 如果row有数据
if row:
info_list.append(row)
print(info_list)
# 导入模块import json
# 将json对象转成字典 -> 进行解码
with open("hm.json", "r", encoding="utf-8") as f:
# 获取文件中数据 -> 字典
new_dict = json.load(f)
print(new_dict["name"]) # 获取名字
print(new_dict["age"]) # 获取年龄
print(new_dict["no"]) # 获取学号
# 导入模块import json
# 定义一个字典
my_dict = {"name": "老王", "age": 30, "no": "007"}
# 将字典转成json -> 进行编码
json_str = json.dumps(my_dict)
# 把json数据写入到文件中
with open("hm.json", "w", encoding="utf-8") as f:
f.write(json_str)
xml文件读取:
将xml文件转为json文件读取更方便,使用XmlToJson
注:如果一个模块中使用了__all__ ,则只有在__all__的列表中的字符串才可以在其它模块中使用,而其它模块必须是通过from 模块名 import * 方式导入该模块的。
随机模块(函数):random 生成随机数。如random.randint(0,2) 此处是闭区间,随机生成大于等于0小于等于2的整数。
os模块:
重命名: os.rename(需要修改的文件名,新的文件名)
删除文件:os.remove(待删除的文件)
创建文件夹:os.mkdir(文件夹名)
删除文件夹:os.rmdir(文件夹名) 文件夹必须是空的
获取当前目录:result=os.getcwd() 获取当前路径
改变默认目录:os.chdir(路径) 将当前目录修改为指定目录路径(进入指定目录)
获取目录列表:r = os.listdir()
获取文件夹下的所有文件:for root,dirs,file in os.walk("目录"):
root 表示正在遍历的文件夹的名字(根/子)
dirs 记录正在遍历的文件夹下的子文件夹集合
files 记录正在遍历的文件夹中的文件集合
re模块:
re.search(str1,str2) 扫描整个字符串查找匹配str2在str1中的开始位置
re.match(str1,str2)只在字符串str1的开始位置匹配,若开始位置不匹配返回None。
re.search().group()、re.match().group() 返回匹配到的字符串。
类是创建对象的模板,是多个对象的集合,对象是类的实例化。
class 类名:
方法列表:
如:class Hero:
class Hero():
class Hero(object): 建议写这种
注:object是所有类的父类;
以上三种都是python2中产生,前两种没有父类,第三种的父类是object。在python3中,以上三种写法的父类都是object类。
class Hero(object):
def move(self): 哪个对象调用了方法,那么self就是哪个对象
pass
def info(self):
print(self.name)
Wukong = Hero() 通过类来创建对象
Wukong.move() 使用对象调用类中的方法
Wukong.name =’悟空’ 为对象添加属性
print(Wukong.name) 获取对象身上的属性
print(Wukong.info()) 通过调用对象方法来获取属性
在python重中 ,以__开头,并以__结尾的方法。
__init __ (self)方法:初始化方法,对象创建时自动调用。
有参数的__init__()方法:
def __init__(self,new_name,参数2,...) self不能去掉。
self.name = new_name
在类内部获取 属性 和 实例方法,通过self获取;
在类外部获取 属性 和 实例方法,通过对象名获取。
子类重写父类的同名属性和方法:若重写了就会默认使用子类的方法和属性
子类调用父类同名属性和方法:语法:父类名.对象方法名(self)
通过 supper(子类类名,self).父类方法() 或者简写(supper().父类方法)调用父类的方法,默认调用第一个父类的方法,适用于单继承或者只想使用第一个父类的方法。 适用于第三种创建类的写法。
私有属性:如果一个属性的名字开头是两个下划线,就代表这个属性私有。如self.__money=1000。
如果属性私有,那么就不能使用对象调用这个属性,只能在类的里面使用。
私有方法:形如私有属性,对象不能调用私有方法,只能在类里面使用。
注:子类不能继承父类的私有方法和私有属性
获取、修改私有属性的值:
在类中定义一个方法,在方法中获取私有属性的值并返回(一般方法名中使用get),然后再用对象调用该方法。
在类中定义一个方法,在方法中给私有属性赋值(一般方法名中使用set),然后再用对象调用该方法,并传入一个实参赋值,最后再调用获取属性值的方法。
多态:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
同一个事件发生在不同对象上,产生不一样的结果。
注:多个对象调用类属性,类属性只占一个内存,但是多个对象调用同一个实例属性占多个内存
类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数,能够通过实例对象和类对象去访问。
静态方法: 需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
class Person(object): # 自定义类
__country = "中国" # 私有的类属性(国籍)
# 构造方法
def __init__(self):
self.name = "小明"
# 私有属性
self.__age = 20
# 实例方法(对象方法)获取私有属性
def get_age(self):
return self.__age
# 实例方法(对象方法)修改私有属性
def set_age(self, new_age):
self.__age = new_age
# 类方法 获取私有类属性
@classmethod
def get_country(cls):
return cls.__country
# 类方法 修改私有类属性
@classmethod
def set_country(cls, new_country):
cls.__country = new_country
# 静态方法
@staticmethod
def hello():
print("今天天气不错")
# 使用静态方法# 01: 类名.静态方法名
Person.hello()
# 02: 对象名.静态方法名
xiaoming = Person()
xiaoming.hello()
# 实例方法
xiaoming.get_country()
Person.get_age(Person())
python中类中的方法总结:
实例方法(对象方法) -> 场景很多
类方法-> 对私有类属性取值或者赋值
静态方法 -> 一般不用
在程序中这个类创建出来的对象只有一个,也就是占用一份内存。单例模式时,只执行一次__init __
实例化一个单例
class Singleton(object):
__instance = None
def __new__(cls, age, name):
#如果类属性__instance的值为None,
#那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
#能够知道之前已经创建过对象了,这样就保证了只有1个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
a = Singleton(18, "dongGe")
b = Singleton(8, "dongGe")
print(id(a))
print(id(b)) 返回结果是一样的
语法:
try:
执行可能发生异常的代码
except 异常类型:
如果发生异常执行的代码
语法:
try:
执行可能发生异常的代码1(1和2是不同的异常类型)
执行可能发生异常的代码2
except (异常类型1,异常类型2):
如果发生异常执行的代码
语法:
try:
执行可能发生异常的代码
except 异常类型 as e: (注:as 临时变量 使用临时变量保存异常的信息描述)
print(e)
语法:
try:
执行可能发生异常的代码
except Exception: 可以直接去掉Exception,仅使用except
如果发生异常执行的代码
注:捕获所有异常的描述信息跟捕获异常信息一样的使用临时变量即可。
try:
执行可能发生异常的代码
except:
如果发生异常执行的代码
else:
如果没有发生异常执行的代码
finally:
无论try中异常是否发生都会执行的代码
如果finally中有return,会覆盖try和excep中的return。
1、引用计数,python内置有一个计数器,程序中的变量若进行引用,计数就加1,若为0,就由魔法函数__del__自动回收。
2、垃圾回收,使用del进行回收。
3、内存池,用于对小块内存的申请和释放管理。创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够了之后再申请新的内存,能够减少内存碎片,提升效率。
http://t.zoukankan.com/youhongliang-p-12194163.html
互斥锁:多线程时,保证修改共享数据时不会产生数据混乱
内存管理机制
https://blog.51cto.com/u_15127604/3852086
常用模块
Python常用的模块 - 知乎 (zhihu.com)
Python(十三)- 常用内置模块与第三方库_Alfred_|_derflA的博客-CSDN博客_python的内置库和第三方库