一 、pyhton2与python3的区别
在pyhton2中,其中编码默认使用的是ascii编码,输出格式为print"xxx",输入为raw_input(“请输入”),在整型中有int和long两种,计算除法的时候只能保留整数,还有range生成列表和xrange生成迭代器两种,在创建模块的包时需要在包中创建一个__init__.py文件,字符串在电脑中的编码分为Unicode和str,深度优先。
在python3中,其中编码默认使用的是utf-8编码,输出格式为print("xxx"),输入为input("请输入"),在整型中只有int型,除法会保留全部结果,并且只有一种range生成的为迭代器,在电脑里编码为str和byte,在创建模块的包时可以只用,广度优先。
二、数据类型
1. int整型
整数称为整型,并且可以利用int()将可以变为整型的其他类型变为整型。
2.str 字符串不可变类型
2.1 表示方法
可以用单引号''双引号""表示
‘’和""表示空字符串
2.2 字符串方法
变大写:字符串.upper()
变小写:字符串.lower()
将字符串居中两边用*代替每边有6个:字符串.center(6,'*')
判断是否可转换成数字:字符串.isdecimal()
去除空格、换行符(\n)、Tab(\t):字符串.strip()
把字符串的z替换成x:字符串.replace('z','x')
把字符串根据x切割成列表(其中不包含x):字符串.spilt('x')
判断是否已x开头或者结尾(返回布尔值):字符串.startswith/endwith(x)
字符串格式化:%s为字符串、%d为数字 例:'%s在教室‘(name,)
循环每个元素并在每个元素之间加入指定的连接符:连接符.join(字符串)
3 bool 布尔值
布尔值只有True和False两种
对于bool类型来说:整数0为Flase,其余为True
字符串空‘’为Flase,其余为True
列表[]为Flase,其余为True
元组空()为False,其余为True。
4 list 列表
4.1 概念和表示方法
当想要表示多个事物的时候可以用列表,用[]表示,每个元素用逗号隔开
4.2 列表的方法
在列表后追加元素:列表.append(元素)
在指定索引位置进行插入元素:列表.insert(1,'xxx')
删除从左到右的第一个匹配元素:列表.remove('xxx')
删除匹配到的索引位置的元素(默认删除最后一个):列表.pop(2)
清空列表:列表.clear()
在原有的列表中加入另外一个列表:列表1.extend(列表2)
列表的排序从小到大:列表.sort(reverse=False)
列表的排序从大到小:列表.sort(reverse=True)
4.3 强制转换
字符串强制转换成列表:v1 = list("dskjfd")
元祖强制转换成列表:v2 = list((11,22,33,44))
4.4 嵌套
列表中可以互相嵌套:[1,[11,22],2]
5 tuple元组
5.1 元组的书写规范和概念
书写规范:user=(11,22,33,'如果')
元组没有方法,且元组中的数据不可改变
5.2 嵌套
元组嵌套元组:(11,22,(1,2)) #数据不可改
元组嵌套列表:(11,22,[1,2]) #列表中的数据可以改,但是不能改元组的元素包括列表
列表嵌套元组:[1,2,(11,22)] #列表中的数据可以改包括元组,但是不能改元组的元素
5.3 强制转换
列表转成元组:v1 = tuple([1,2,3])
6 dict 字典
6.1 字典的书写规范
dict = {'键':'值','键’,‘值’},冒号前后称为一个键值对
例:dict1 = {'name':'如果','age':'20'}
6.2 字典的方法
获取字典中所有的键:info.keys() #不可用可变类型当做字典的键
获取字典中所有的值:info.values()
获取字典中所有的键值对:info.items()
查找字典中是否有指定的键:字典.get('键') #不存在返回None
给字典添加键值对:字典['键']=‘值’
更新字典的值,存在则更新,不存在则添加:字典.update({'键‘:'值'})
7 set 集合
7.1 集合的书写规范
书写规范:v = {1,2,3,4}
空集合:v = set()
注:集合中的元素不能存在重复,且集合元素无序
7.2 集合的方法
集合添加元素:集合.add(元素) #集合中若存在则不添加
集合删除元素:集合.disable(元素) #无序不重复,不能用索引
集合的更新:集合.update(元素) #批量添加
集合的交集:new_set = set1.intersection(set2) #在set1和set2的交集
集合的并集:new_set = set1.union(set2)
集合的差集:new_set = set1.difference(set2)
8 数据类型公共方法
索引:获取第一个位置的元素(从0开始):x[0](排除:int/bool/set) #x[-1] 复数从后向前
切片:获取一部分元素(取前不取后)(排除:int/bool/set)
例题:v = '现实没有如果'
v1 = v[2:4] 获取到位置为2到3的字符串 #没有
v2 = v[3:] 获取到位置为3到最后的字符串 #有如果
v3 = v[:-1] 获取从开始到-2位置的字符串 #现实没有如
步长:获取其中某字符(排除:int/bool/set)
例题:name = ’alexalex‘
val = name[1:-1:2] 获取从1到-1每间隔为2的所有字符 #lxl
val = name[1::2] 获取从1到最后每间隔为2的所有字符 #lxlx
val = name[::2] 获取从开始到最后每间隔为2的所有字符 #aeae
val = name[-1:0:-2] 获取从-1到0每间隔为-2的所有字符 #xlxl
val =name [::-1] 将字符串反转 #xelaxela
删除(排除:str/int/bool/set)
for循环(排除:int/bool)
len:计算长度,判断有多少元素(排除:int/bool)
9 条件判断
9.1 if 条件:
内容
9.2 if 条件:
内容
else:
内容
9.3 if 条件:
内容
elif 条件:
内容
else:
内容
9.4 三元运算(三目运算)
简单的if条件时使用:v = 前面 if 条件 else 后面 #条件为True,则v = 前面 条件为False,则v = 后面
10 循环
10.1 while 循环
基本条件:while + 条件 例:while True:(永久成立)
关键字:break 例:while True:
break #终止循环
关键字:continue while num <10:
continue #循环如果遇到continue则直接执行下一次循环,不执行下面
关键字:else #不满足while后的条件时触发
10.2 for 循环
基本条件:for 变量 in 被循环数据: 例:for i in 'alex':
关键字:break 例:for i in 'alex':
break #终止循环
关键字:continue for i in 'alex':
continue #循环如果遇到continue则直接执行下一次循环,不执行下面
关键字:else #不满足for后的条件时触发
11 运算符
11.1 普通运算符
加:+ 减:- 乘:* 除:/ 取余数:% 次方:** 取商的整数://
11.2 比较运算
等于:== 不等于:!= 大于:> 小于:< 大于等于:>= 小于等于:<=
11.3 赋值运算
c=a+b:将a+b的结果赋值给c
c+=a,等效于c=c+a
c-=a,等效于c=c-a
c*=a,等效于c=ca
c/=a,等效于c=c/a
c%=a,等效于c=c%a #取余数
c**=a,等效于c=c**a
c//=a,等效于c=c//a #取整数
11.4 逻辑运算
与:and 例:x and y 如果X为False,取X否则取Y
或:or 例:x or y 如果x为False,取y否则取x
非:not 例:如果x为Flase,则取True,否则为Flase
11.5 成员运算符
判断某字符串中是否含有某字符:in
判断某字符串中是否不含有某字符:not in
11.6 运算符优先级
三 内存相关
查看内存地址:print(id(v1))
python常用地址:-5~256
==和is的区别:==只是比较值是否相等,is比较内存地址是否一致
例一 v1 = [1,2,3] v2 = [1,2,3] #数据一致但是存储磁盘内位置不一致
例二 v1 = [1,2,3] v2 =v1 v1.append(666) print(v2)#[1,2,3,666] #v2把自己指向v1数据的地址,当v1添加时,v2也存在
例三 v1 = [1,2,3] v2 =v1 v1 = [11,22,33] print(v2)#[1,2,3] #v1被重新赋值,v2指向原内存地址,v1已开辟新内存地址
例四 v1 = [1,2,3] v2 = [11,v1]
v1.append(9) print(v2)#[11,[1,2,3,9]
v2[1].append(999) print(v1)#[1,2,3,999]
v1 = 999 print(v2)#[11,22,[1,2,3]]
v2[1] = 999 print(v1)#[1,2,3]
四 深浅拷贝
格式前提:import copy #copy属于新建内存地址
浅拷贝只会拷贝可变类中的第一层可变类,深拷贝会拷贝所有的可变数据。
#str/int/bool都是按照此方法深浅拷贝
a=“dlkfjsdlk”
b = cogy.copy(a)###浅拷贝
c = copy.deepcopy(a)###深拷贝
#list/set/dict无嵌套深浅拷贝无区别
v1 = [1,2,3]
v2 = copy(v1)###复制之后的地址指向原来
v3 = deepcopy(v1)###找到所有可变类型进行拷贝
#list/set/dict有嵌套深浅拷贝的区别
v1 = [1,2,[33,99]]
v2 = copy(v1)###复制第一层内存地址,如有嵌套,只指向内存地址,不复制
v3 = (v1)###复制所有可变类型,不拷贝数据
#因为元组属于不可变类型所以深浅拷贝地址都不变
v1 = (1,2,3,4)
import copy
v2 = copy.copy(v1)###地址不变
v3 = copy.deepcopy(v1)###地址不变
#特殊:存在元组嵌套列表时
v1 = (1,2,3,[1,2,3],4)
v2 = copy.copy(v1)###地址不变
v3 = copy.deepcopy(v1)###如果元组中存在可变的列表,则地址要变
五 文件操作
打开文件
f = open('要打开的文件',mode='r/w/a',encoding='文件原来写入时的编码') 注:当要打开的文件是在windows中创建的时候,编码后要加-sig
mode有很多种:r 只读,文件不存在则报错 w只写,打开文件的孙坚文件内容全部清空,文件不存在则新建 a 追加,打开文件并在末尾追加需要输入的但不能读
r+可读可写,默认光标在最前 w+可读可写,打开时文件会被勤工,默认光标在最后,读取时需要把光标移动到最前 a+打开文件,默认追加,光标在最后
rb 读出为字节 wb 写入字节 ab 追加字节(当读、写、追加为字节时,不需要添加encoding)
同时打开两个文件的方式: make open ('文件路径',mode='r/w/a',encode='utf-8') as f,open ('另一个文件路径',mode='r/w/a',encode='utf-8') as f2;
操作文件
读:content = f.read(X) #表示每次往内存中读X个字符不填默认全部读取 当文件比较大时,利用循环将文件内容一部分一部分读取出来
content = f.readlines() #表示每次往内存中读一行,使用循环可以读出所有的文件,需要使用strip去除换行符
#例题:文件读操作,每次读10行,并且不占用文件
while True:
f = open('db','r',encoding = 'utf-8')
data_list = []
for i in range(10):
line = f.readline()
if not line:
return
data_list.append(line)
cursor = f.tell() #游标位置
f.close()
for row in data_list:
yield row #生成器
View Code
写:f.write(X) #在X处替换你要写的内容
关闭:f.close() #必须关闭,否则读写都在内存中,无法保存
注:使用with open()格式打开的文件,当代码写到文件缩进外时,自动关闭
修改文件内容:只能同时打开两个文件,一个读,把读出的需要改的内容改完后,逐条写进新文件中
make open ('文件路径',mode='r/w/a',encode='utf-8') as f,open ('另一个文件路径',mode='r/w/a',encode='utf-8') as f2;
date1 = f1.read()
date2 = date1.replace('xxx','yyy') #把date1中的xxx改成yyy
f2.write(date2)