Python基础入门
2.1 环境的安装
- 解释器:py2 / py3(环境变量的配置)
- 开发工具:pycharm
2.2 编码相关
2.2.1 编码基础
- ascii:一个英文占一个字节,二进制序列,一共有八位,最大值255(2**8)
- unicode(万国码):一个英文两个字节,有32 位,现在用到了21位。
- utf-8:对万国码的压缩,一个英文一个字节,一个中文三个字节。
- gbk:两个字节表示一个中文
- gb2312
2.2.2 python编码相关
对于Python默认解释器编码
- py2:ascii
- py3:utf-8
如果想要修改默认编码,则可以使用:
# -*- coding:utf-8 -*-
注意:对于操作文件时,要按照:以什么编码写入就用什么编码去读取。
2.3 变量
变量命名的规则
- 变量名只能包含字母、数字、下划线
- 不能以数字开头
- 不能是python里的关键字
变量命名的要求
- 见名知意
- 一个单词不能表示变量的意思,可以用多个单词+下划线表示
为什么要有变量?
答:为某个值创建一个‘外号’,方便以后在使用这个值的时候使用。
2.3 数据类型
2.3.1 整型(int)
-
整型的长度
- py2中有:int、long
- py3中有:int
-
整除
- py2中,整除结果会自动将小数点后面的数省略
- py3中,整除结果不会省略小数点后面的数
2.3.2 布尔(bool)
布尔值就是用于表示真假的。True / False
布尔值与其他数据类型之间的转换
- None、“”、0、{}、[]等空值 -------》False
- 其余的值全部是True
2.3.3 字符串(str)
字符串是写代码中最常见的,python内存中的字符串是按照:unicode 编码存储。对于字符串是不可变。
字符串自己有很多方法,如:
-
upper():大写
v = 'ALEX' v1 = v.upper() print(v1) v2 = v.isupper() # 判断是否全部是大写 print(v2)
-
lower():小写
v = 'alex' v1 = v.lower() print(v1) v2 = v.islower() # 判断是否全部是小写 print(v2) ############ 了解即可 v = 'ß' # 将字符串变小写(更牛逼) v1 = v.casefold() print(v1) # ss v2 = v.lower() print(v2)
-
isdecimal():判断是否是数字
v = '1' # v = '二' # v = '②' v1 = v.isdigit() # '1'-> True; '二'-> False; '②' --> True v2 = v.isdecimal() # '1'-> True; '二'-> False; '②' --> False v3 = v.isnumeric() # '1'-> True; '二'-> True; '②' --> True print(v1,v2,v3) # 以后推荐用 isdecimal 判断是否是 10进制的数。 # ############## 应用 ############## v = ['alex','eric','tony'] for i in v: print(i) num = input('请输入序号:') if num.isdecimal(): num = int(num) print(v[num]) else: print('你输入的不是数字')
-
strip():去除前后的空白、制表符、指定字符
v1 = "alex " print(v1.strip()) v2 = "alex\t" print(v2.strip()) v3 = "alex\n" print(v3.strip()) v1 = "alexa" print(v1.strip('al'))
-
replace():替换
v = 'alex' v1 = v.replace('a','l') print(v1)
-
startswith() / endswith():以什么开头 / 结尾。返回True & False
a = 'knight' if a.startswith('k'): #前几位也可以 print(a) #endswith用法相同
-
encode():编码,将字符串转换成指定类型的编码格式
v = open(文件路径,mode= 'wb') date = 'baibai' count = date.encode('utf-8') #将字符串转二进制按照utf-8输 v.write(count) f.close()
-
format():字符串格式化
name = '我叫:{0},年龄:{1}'.format('bigox',24) print(name)
-
join():将字符串(列表、元组)按照某种格式连接起来
name = 'alex' # a_l_e_x result = "**".join(name) # 循环每个元素,并在元素和元素之间加入连接符。 print(result)#中间加result输入的东西
-
split():字符串切割
message = "看见一个大傻子,因为不看路,摔死了,他叫塞子." # result = message.split(',') # result = message.split(',',1) 从左往右切割 # result = message.rsplit(',') result = message.rsplit(',',1) 从右往左切割 print(result)
2.3.4 列表(list)
-
append(字符串):向列表中添加某个元素
users = [] users.append('Tina') print(users)
-
insert(字符串):在列表的某个位置添加某个元素
v = ['tina','大哥','xiaoxin'] v.insert(2,'lulu') print(v) #['tina', '大哥', 'lulu', 'xiaoxin']
-
remove(列表中的元素):删除列表中的元素
v = ['tina','大哥','xiaoxin'] v.remove('tina') print(v) #['大哥','xiaoxin']
-
pop(元素索引):删除列表中的元素
v = ['tina','大哥','xiaoxin'] v.pop(0) print(v)#['大哥','xiaoxin']
-
clear():将列表中的全部元素清除
v = ['tina','大哥','xiaoxin'] v = v.clear() print(v)#[]
-
reverse():翻转
v1 = [1,2,3111,32,13] print(v1)#[1, 2, 3111, 32, 13] v1.reverse() print(v1)#[13, 32, 3111, 2, 1]
-
sort():排序
v1 = [11,22,3111,32,13] print(v1) v1.sort(reverse=False) # 从小到大(默认)[11, 13, 22, 32, 3111] v1.sort(reverse=True) # 从大到小[3111, 32, 22, 13, 11] print(v1)
-
del(按索引删除,可以切片删除)
a = ['kngiht','kevin','qaz',1,2,3] del a[2:4] print(a) #['kngiht', 'kevin', 2, 3] 按索引切片删除
-
extend(拼接)
a = ['kngiht','kevin','qaz',1,2,3] a.extend(['wsx','edc']) print(a) #extend一般完成列表与列表的拼接, 如果目标是字符串,则会将字符串拆解拼接
2.3.5 元组(tuple)
- 元组不可变,没有什么特殊功能
2.3.6 字典(dict)
-
info / info.keys():获取字典的键
info = {1: 'henry', 2: 'echo', 3: 'eliane'} for k in info.keys(): print(k) ---------------------- for k in info: print(k) # 两种方式输出的结果是一样的
-
info.values():获取字典的值
info = {1: 'henry', 2: 'echo', 3: 'eliane'} for v in info.values(): print(v)
-
info.items():获取字典的键和值,以元组格式输出
info = {1: 'henry', 2: 'echo', 3: 'eliane'} for pair in info.items(): print(pair) #键值对的类型是元组 ------------------------ for k,v in info.items(): prinnt(k,v) # 可以用两个变量去接受
-
info.get(key):按照键取值
info = {1: 'henry', 2: 'echo', 3: 'eliane'} print(info.get(1, 666)) print(info.get(4, 666)) # 有key则取出, 没有则返回指定 值 # 如果没有指定值,则返回 None
-
info.pop(key):按照键删除元素(有返回值)
info = {1: 'henry', 2: 'echo', 3: 'eliane'} print(info.pop(1)) # henry print(info.pop(4)) # None
-
info.update(info1):更新字典
info = {} info1 = {1: 'henry', 2: 'echo', 3: 'eliane'} info.update(info1) # 将info1中的值更新到info中 print(info)
-
info.setdefalut(ke,value):
# 查询key,有则取出,没有则添加 info = {1: 'henry', 2: 'echo', 3: 'eliane'} info.setdefault(4, 'hello') print(info) # 取出需要赋值给其他变量 val = info.setdefault(4, 'i hate you') print(val) # i hate you
-
info.popitem()
# 不能加参数,删除最后一个key值对 info = {1: 'henry', 2: 'echo', 3: 'eliane'} v = info.popitem() print(v,info) # v是tuple
-
info.clear():清除字典中所有的元素
# 清空所有元素 info = {1: 'henry', 2: 'echo', 3: 'eliane'} info.clear() print(info)
-
{}.fromkeys([1,2,3],’uu’)
#制造新的字典,注意当第二个参数是可变类型的时候,所有的键引用的同一个内存地址 dic = {} dic1 = dic.fromkeys(['a','b','c'],['你好']) print(dic1) # 结果 {'a': ['你好'], 'b': ['你好'], 'c': ['你好']} ''' fromkeys里第一个参数是可迭代的对象,里边的每个元素就是字典中的健,第二个参数就是值 现在创建的字典中后边的值用的是同一个 ''' dic1['a'].append('我好') print(dic1) # 结果 {'a': ['你好', '我好'], 'b': ['你好', '我好'], 'c': ['你好', '我好']}
2.3.7 集合(set)
特性:无序性、可变性、互异性
空集合表示方法:v = set()
方法:
-
add():添加(已有的不再添加)
v = {1,2,3} v.add(4) #添加4 v.add(3) #3是已有的,不再添加 print(v) #{1,2,3,4}
-
discard(元素):删除
v = {1,2,3} v.discard(2) #删除2 print(v) #{1,3}
-
update():批量添加
# 有一样的元素就不再添加 v = {1,2,3} v.update({4,5,6}) #添加4,5,6 print(v) #{1,2,3,4,5,6}
-
interxectiom():交集
v = {1,2,3} date = v.intersection({1,3,4}) #取v和{1,3,4}的交集 print(date) #{1,3}
-
union():并集
v = {1,2,3} date = v.union({1,3,4}) #取v和{1,3,4}的并集 print(date) #{1,2,3,4}
-
difference():差集
v1 = {1,2,3} v2 = {1,3,4} date1 = v1.difference(v2) #取v1和v2的差集,v1中有v2中没有的 print(date1) #{2} date2 = v2.difference(v1) #取v2和v1的差集,v2中有v1中没有的 print(date2) #{4}
-
symmetric_difference():对称差集
v = {1,2,3} date = v.symmetric_difference({1,3,4}) #取v和{1,3,4}的对称差集 print(date) #{2,4}
2.3.8 None
- None就是python中的空
- None转换成布尔值为False
- None无任何功能,python中用于提供空值的
2.3.9 数据类型的公共功能
-
长度:len()
v = {1,2,'lulu'} print(len(v))#3
-
索引
v = 'alex' print(v[2]) # v中的第三位元素 print(v[-1]) # v中的最后一个元素
-
切片
v = 'abcdefg' print(v[1:3]) # 取第二位到第三位前面的元素
-
步长
#笔试题:请将字符串反转 name = 'alex' val = name[::-1] print(val) #xela
-
for循环
v = 'abcdefg' for item in v: print(item) # 遍历打印v中的每个元素
-
删除:del :可以以切片的方式删除
#remove,pop和del的区别 #remove #根据值删除,不存在则报错 # deleted = li.pop(2) #删除列表中指定的一个,另将被删除的数据赋值给deleted # del li[2] #仅仅是删除 # del li[2:4] #del还可以删除列表中指定的一段
# 请删除列表中的第2至第4个元素,并输出删除元素后的列表 li = ["alex", "WuSir", "ritian", "barry", "wenzhou"] del li[1:4] print(li)
注意:集合无索引,无步长,无切片,无删除,无修改
int | bool | str | list | tuple | dict | set | |
---|---|---|---|---|---|---|---|
len | × | × | √ | √ | √ | √ | √ |
index | × | × | √ | √ | √ | √ | × |
切片 | × | × | √ | √ | √ | × | × |
step | × | × | √ | √ | √ | × | × |
for循环/iterable | × | × | √ | √ | √ | √ | √ |
修改 | × | × | × | √ | × | √ | √ |
删除 | × | × | × | √ | × | √ | √ |
2.3.10 嵌套
-
列表嵌套
#示例: users = ['alex',0,True,[11,22,33,'老男孩']] users[3] #[11,22,33,'老男孩'] users[3][-1] #'老男孩' users[3][-1][2] #'男'
-
列表和元组嵌套
#例1 v2 = [11,22,33,(11,22,33)] v2[-1][1] = 99 #错误 v2[-1] = 99 #正确 #例2 v3 = (11,[1,2,3],22,33) v3[1] = 99 #错误 v3[1][2] = 99 #正确 #总结:列表中元素可以被修改和删除,元组中元素不可被修改和删除
-
所有的容器类例如:list,tuple, dict,set 都可以嵌套,但set(), 只能嵌套可hash(int, bool, str, tuple 4种)的数据类型。
2.3.11 数据类型总结
-
列表(list) / 字典(dict) / 集合(set)
- 不能放在集合中
- 不能作为字典的键(key)
-
hash(哈希)
- 因为在内部会将值进行哈希算法,并得到一个数值(对应内存地址),以后用于快速查找
-
注意:
# 第1点: info = {0,1,2,False,'你好',None,(1,2,3)} print(info) #{0,1,2,'你好',None,(1,2,3)} #因为False相当于0,所以False不输出
# 第2点: info = { 1:'alex', #因为True相当于1,所以把1对应的值修改了 True:'oldboy' } print(info) #{1:'oldboy'}
2.3.12 内存相关(修改还是赋值)
-
列表(list) / 字典(dict) / 集合(set)
-
情况一:在修改内存中的与安娜苏,所指向的那个内存的值都会改变
v1 = [1,2,3] v2 = v1 v1.append(4) #增加 print(v2) #[1,2,3,4] #在v1里面修改(增加/删除),v2也跟着改变
-
情况二:重新赋值不修改内存中原元素,只改变值得指向
v1 = [1,2,3] v2 = v1 v1 = [3,4,5] #重新赋值 print(v2) #[1,2,3] #重新赋值v1,v2不改变
-
-
字符串(str) / 元组(tuple)
- 重新赋值不会修改内存中的元素,只改变值的指向
-
总结
-
在python中,为了提高性能,值若是一下以下情况(python小数据池),就不重新开辟内存
- 常用数字:5~256
- 简单字符串:
-
== 比较的是值是否相等,is比较的是内存地址是否一致(python小数据池除外)
#例1: v1 = [1,2] v2 = [1,2] v1 == v2 #True v1 is v2 #False #例2: v1 = [1,2] v2 = v1 v1 == v2 #True v1 is v2 #True
-
2.4 深浅拷贝
-
基本格式
v1 = [1,2,3] import copy v2 = copy.copy(v1) #浅拷贝 v3 = copy.deepcopy(v1) #深拷贝
-
整型int / 布尔bool / 字符串str(不可变类型)
- 深拷贝和浅拷贝的结果都是一样的
- 无法重新开辟一块内存地址,就使用同一块地址
-
列表list / 字典dict / 集合set(可变类型)
- 对于其中的元素都是不可变类型时,深拷贝和浅拷贝的结果都是一样的,只拷贝第一层
- 对于其中元素存在可变类型时,浅拷贝只拷贝所有的可变类型
-
特殊类型
- 如果元组中不含有可变类型,同理字符串的深浅拷贝
- 如果元组中可能含有可变类型,同理列表的深浅拷贝
-
小数据池
-
== 判断值是否相等
-
is判断内存地址是否一致
-
python中默认会对int bool str进行缓存
-
缓存规则:
- int型:-5~256之间会被缓存
- str:空和单个字符默缓存;只包含字母,数字,下划线;乘数大于1时,str只包含Num 、 ALp、时缓存(长度不能超过20位)
-
-
总结
-
浅拷贝:只拷贝第一层
-
深拷贝:拷贝嵌套层次中的可变类型类型
-
深拷贝之所以不拷贝不可变类型,是由于python小数据池的缘故
-
注意:
- 拷贝只针对可变类型:再创造份
- 不可变类型:不会拷贝(不再创造出一份,都是用的同一份地址)
-
2.5 文件操作
2.5.1 文件基本操作
-
打开:obj = open(‘路径’,mode=’模式‘,encoding=’编码’)
-
写入:obj.write()
-
读取:obj.read()
-
关闭:obj.close()
# 打开文件 f = open('要打开的文件路径',mode='r/w/a',encoding='文件原来写入时定义的编码') # 操作 # f.write() # f.read() data = f.read() # 读取文件的内容到内存(全部) f.write('要写入的内容') # 关闭文件 f.close()
# 示例一 : 一般用于文字写入。 f = open('a.txt',mode='w',encoding='utf-8') # a. 将 “你好” 根据encoding指定的编码转换成: # “你好” --> 10001000 10001000 10001000 10001000 10001000 10001000 # b. 将二进制写入到文件中。 f.write('你好') # w打开文件,则write传入字符串 f.close() # 示例二:一般用于图片/音频/视频/未知编码 f = open('a.txt',mode='wb') # 1. 把要写入的字符串转换成二进制 data = "我好困" content = data.encode('utf-8') # 将字符串按照utf-8编码转换成二进制 # 2. 再将二进制写到文件中 f.write(content) # wb打开文件,则write传入的是 二进制 f.close()
2.5.2 打开方式
打开模式
-
r / w / a:只读只写字符串
-
r+ / w+ / a+:可读可写字符串
-
rb / wb / ab:只读只写二进制
-
字符串转换成二进制:
v = 字符串 date = v.encode('utf-8')
-
二进制转换成字符串:
v = 二进制 date = v.decode('utf-8')
-
-
r+b / w+b / a+b :可读可写二进制
2.5.3 操作方法函数
-
read(),将文件的内容全部读取到内存中
-
read(1),编码方式不同,代表含义不同。
-
1表示一个字符:
obj = open('a.txt',mode='r',encoding='utf-8') data = obj.read(1) # 1个字符 obj.close() print(data)
-
1表示一个字节
obj = open('a.txt',mode='rb') data = obj.read(3) # 1个字节 obj.close()
-
-
-
readlines(),将所有文件全部读取到内存中,并且按照\n进行切分添加到列表中,需要打印给强制转换一下或者用for循环遍历
obj = open('a.txt',mode='r',encoding='utf-8') data = obj.readlines() print(list(data)) ------------------------- for item in data: print(item)
-
readline(),仅读取文件的一行数据
obj = open('a.txt',mode='r',encoding='utf-8') data = obj.readline() print(data)
-
write(字符串)
obj = open('a.txt',mode='w',encoding='utf-8') obj.write('中午你') obj.close()
-
write(二进制)
obj = open('a.txt',mode='wb') # obj.write('中午你'.encode('utf-8')) v = '中午你'.encode('utf-8') obj.write(v) obj.close()
-
seek(光标字节位置),无论模式是否带b,都是按按照字节进行处理
obj = open('a.txt',mode='r',encoding='utf-8') obj.seek(3) # 跳转到指定字节位置 data = obj.read() obj.close() print(data) obj = open('a.txt',mode='rb') obj.seek(3) # 跳转到指定字节位置 data = obj.read() obj.close() print(data)
-
tell()获取光标当前所在的字节位置
obj = open('a.txt',mode='rb') # obj.seek(3) # 跳转到指定字节位置 obj.read() data = obj.tell() print(data) obj.close()
-
flush(),强制将内存中的数据写入硬盘
v = open('a.txt',mode='a',encoding='utf-8') while True: val = input('请输入:') v.write(val) v.flush() v.close()
2.5.4 文件关闭
-
基本方式(文艺青年)
v = open('a.txt',mode='a',encoding='utf-8') v.close()
-
便捷方式(流氓)
with open('a.txt',mode='a',encoding='utf-8') as v: data = v.read() # 缩进中的代码执行完毕后,自动关闭文件
2.5.6 文件内容的修改
2.5.6.1 小文件修改
with open('a.txt',mode='r',encoding='utf-8') as f1:
data = f1.read()
new_data = data.replace('飞洒','666')
with open('b.txt',mode='w',encoding='utf-8') as f1:
data = f1.write(new_data)
2.5.6.2 大文件修改
f1 = open('a.txt',mode='r',encoding='utf-8')
f2 = open('b.txt',mode='w',encoding='utf-8')
for line in f1:
new_line = line.replace('阿斯','死啊')
f2.write(new_line)
f1.close()
f2.close()
with open('a.txt',mode='r',encoding='utf-8') as f1, open('c.txt',mode='w',encoding='utf-8') as f2:
for line in f1:
new_line = line.replace('阿斯', '死啊')
f2.write(new_line)