Python Day02
一、模块初识
模块:库
分类:
- 标准库:不需要安装,直接导入的库
- 第三方库:需要下载安装
1、sys模块
# sys模块
import sys
print(sys.path) # 打印环境变量
print(sys.argv) # 打印路径
2、os模块
# os模块
import os
dir = os.system("pwd") # 调用shell
print(dir) # os.system()调用完直接输出,然后返回执行结果状态码(只执行不保存)
dir2 = os.popen("pwd").read() # 调用完不输出,返回结果地址,用read()方法读取结果
print(dir2)
os.mkdir("new dir") # 创建单级目录
os.makedirs("new dirs/dir") # 创建多级目录
二、*.pyc 文件
PyCodeObject和pyc文件:
PyCodeObject是Python编译器真正编译成的结果。
当python程序运行时,编译的结果保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
pyc文件是PyCodeObject的一种持久化保存方式。
三、数据类型
1、标准数据类型
Python 3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Sets(集合)
- Dictionary(字典)
数据类型查看: type()
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
输出:
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
数据类型判断:isinstance(变量, 数据类型)
a = 111
isinstance(a, int)
输出:
True
2、Number(数字)
- int
- float
- bool
- complex
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
3、String(字符串)
①表示:用单引号(‘)或双引号(“)括起来,同时使用反斜杠()转义特殊字符。
②截取:字符串的截取的语法格式如下:
变量[头下标:尾下标]
- 索引值以 0 为开始值,-1 为从末尾的开始位置。
- 加号 (+) 是字符串的连接符
- 星号 (*) 表示复制当前字符串,紧跟的数字为复制的次数。
例如:
str = 'Tianyaguxiang'
print (str) # 输出字符串
print (str[0:-1]) # 输出第一个到倒数第二个的所有字符
print (str[0]) # 输出字符串第一个字符
print (str[2:5]) # 输出从第三个开始到第五个的字符
print (str[2:]) # 输出从第三个开始的后的所有字符
print (str * 2) # 输出字符串两次
print (str + "TEST") # 连接字符串
运行结果:
③解码与编码
# 编码与解码
str = "我爱北京*"
print(str)
print(str.encode())
print(str.encode(encoding="utf-8"))
print(str.encode(encoding="gbk"))
print(str.encode(encoding="gbk").decode(encoding="gbk"))
四、列表
1、定义列表
- 使用“ [] ”定义
names = ["天涯","古巷","地角","新街"]
2、列表的操作
- 切片
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
names[1:4] #取下标1至下标4之间的数字,包括1,不包括4
['Tenglan', 'Eric', 'Rain']
>>> names[1:-1] #取下标1至-1的值,不包括-1
['Tenglan', 'Eric', 'Rain', 'Tom']
>>> names[0:3]
['Alex', 'Tenglan', 'Eric']
>>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
['Alex', 'Tenglan', 'Eric']
>>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写
['Rain', 'Tom', 'Amy']
>>> names[3:-1] #这样-1就不会被包含了
['Rain', 'Tom']
>>> names[0::2] #后面的2是代表,每隔一个元素,就取一个
['Alex', 'Eric', 'Tom']
>>> names[::2] #和上句效果一样
['Alex', 'Eric', 'Tom']
- 追加:使用append函数
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
>>> names.append("我是新来的")
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
- 插入:使用insert函数(插入的位置,插入的内容)
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(2,"强行从Eric前面插入")
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.insert(5,"从Eric后面插入试试新姿势")
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从Eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
- 修改:
>>> names
['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> names[2] = "该换人了"
>>> names
['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
- 删除
①使用 del 删除
②使用 remove 删除指定元素
③使用 pop 删除最后一个
④使用 clear 清空整个列表
>>> del names[2]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
>>> del names[4]
>>> names
['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
>>>
>>> names.remove("Eric") #删除指定元素
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的']
>>> names.pop() #删除列表最后一个值
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
>>> names.clear() #清空整个列表
>>> names
[]
- 扩展(列表合并):使用extend函数
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
>>> b = [1,2,3]
>>> names.extend(b)
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
- 拷贝:使用copy()函数
>>> names
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
>>> name_copy = names.copy()
>>> name_copy
['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
注意:该copy为浅copy,即在列表里面还有子列表的时候,修改子列表的内容,副本也随之变化。同理,改副本里子列表的内容,names也会发生改变。
原理:copy复制的地址,如:
names = ["天涯",["张三","李四"],"地角","新街"]
names2 = names.copy()
print(names)
print(names2)
names[0] = "古巷"
names[1][0] = "王五"
print(names)
print(names2)
输出结果为:
如果想要深拷贝,即副本与原身完全独立,则需要import copy使用copy包的deepcopy()
#深拷贝
import copy
names = ["天涯",["张三","李四"],"地角","新街"]
names2 = copy.deepcopy(names) #若调用copy.copy()则为浅copy
print(names)
print(names2)
names[0] = "古巷"
names[1][0] = "王五"
print(names)
print(names2)
输出结果为:
- 统计:使用count()函数
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.count("Amy")
2
- 排序:sort()
>>> names
['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
>>> names.sort() #排序
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str() #3.0里不同数据类型不能放在一起排序了,擦
>>> names[-3] = '1'
>>> names[-2] = '2'
>>> names[-1] = '3'
>>> names
['Alex', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3']
>>> names.sort()
>>> names
['1', '2', '3', 'Alex', 'Amy', 'Amy', 'Tenglan', 'Tom']
- 反转:reverse()
>>> names.reverse() #反转
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
- 获取下标:index()返回找到的第一个元素的下标
>>> names
['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
>>> names.index("Amy")
2 #只返回找到的第一个下标
3、浅拷贝与深拷贝
- 浅拷贝:对指针的拷贝,拷贝后两个指针指向同一个内存空间
# 浅拷贝的三种实现方式
person = ['name',['saving',2000]]
# 方式一:copy方法
p1 = copy.cpoy(person)
# 方式二:直接赋值
p2 = person[:] #注person[:]即person[0:-1]的简写
# 方式三:list()
p3 = list(person)
使用场景:夫妻有共同存款
person = ['name',['saving',2000]]
p1 = person[:]
p2 = person[:]
p1[0] = '张三'
p2[0] = '小花'
# 这样修改存款2000时,夫妻的共同存款都一起发生变化
p1[1][1]=2500
- 深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
五、元组
1、定义元组
- 使用“ () ”定义
names = ("天涯","古巷","地角","新街")
元组其实跟列表差不多,只是它一旦创建,便不能再修改,所以又叫只读列表
2、元组的操作(只有两个方法)
count()
index()
六、字符串操作
1、首字母转大写: capitalize()
name = "flavioy"
print(name.capitalize())
输出:
Flavioy
2、统计字符串出现个数:count()
print("Hello Hello Hello world".count('Hello'))
输出:
3
3、使用字符填充字符串,并将其居中:center()
print("flavioy".center(50,'*'))
输出:
****************flavioy*****************
4、判读是否以指定字符串结尾:endswith()
print("my name is flavioy".endswith('flavioy'))
输出:
True
5、更改tab键为指定长度的空格:expandtabs()
print('name \t class tel'.expandtabs(tabsize=30))
输出:
6、查找指定字符串所在的第一个位置:find(),rfind()
str = 'your system is crash'
#从左查找最左边第一个位置
print(str.find('s'))
#从左查找最右边第一个位置
print(str.rfind('s'))
输出:
5
18
7、格式化输出:format()
info = "my name is {name} and I'm {age} years old"
print(info.format(name='Yao',age=22))
print(info.format_map({'name':'Yao','age':'23'}))
输出:
my name is Yao and I’m 22 years old
my name is Yao and I’m 23 years old
8、判断是否只包含a-z,0-9:isalnum()
print('132sfa'.isalnum())
print('[email protected]'.isalnum())
输出:
True
False
9、判断是否只包含纯英文字符:isalpha()
print('Ajasbd2'.isalpha())
print('AjasbdM'.isalpha())
输出:
False
True
10、判断是否只包含十进制字符:isdecimal()
注意:定义一个十进制字符串,只需要在字符串前添加 ‘u’ 前缀即可。
str1 = u"this2018"
print(str1.isdecimal())
str2 = u"23443434"
print(str2.isdecimal())
输出:
False
True
11、判断是否为整数:isdigit()
print('8848'.isdigit())
输出:
True
12、判断是否为全小写:islower()
print('Python'.islower())
print('python'.islower())
输出:
False
True
13、判断是否只由数字组成:isnumeric()
print('3.14'.isnumeric())
输出:
False
14、判断是否是为标题格式(每个单词首字母是否都大写):istitle()
print('My name is Yao'.istitle())
print('My Name Is Yao'.istitle())
print('Book of Moon'.istitle())
输出:
False
True
False
15、判断是否为全大写:isupper()
print('ABc'.isupper())
输出:
False
16、列表转为字符串:join()
print('='.join(['hello','world']))
print(''.join(['hello','world']))
print(','.join(['hello','world']))
输出:
hello=world
helloworld
hello,world
17、使用指定字符补长字符串:ljust(),ljust()
str = 'hello world'
#往左填充
print(str.ljust(50,'*'))
#往右填充
print(str.rjust(50,'*'))
输出:
hello world***************************************
***************************************hello world
18、大小写转化:lower(),upper(),swapcase()
#大写转小写
print('ABhasdC'.lower())
#小写转大写
print('ABhasdC'.upper())
#大小写互相转化
print('ABhasdC'.swapcase())
输出:
abhasdc
ABHASDC
abHASDc
19、去除空格与回车:strip(),lstrip(),rstrip()
# strip去除两边
# lstrip去除左边
# rstrip去除右边
str = '\n Hello World \n'
print(str.strip())
print("-------")
print(str.lstrip())
print("-------")
print(str.rstrip())
print("-------")
输出:
Hello World
-------
Hello World
-------
Hello World
-------
20、翻译:maketrans(),translate()
grammar = str.maketrans('abcdef','123456')
print('ice is awesome'.translate(grammar))
输出:
i35 is 1w5som5
21、替换:replace()
str = "Hello Hello Hello world"
print(str.replace('Hello','hi'))
print(str.replace('Hello','hi',2))
输出:
hi hi hi world
hi hi Hello world
22、字符串转列表:split(),splitlines()
str = 'my name is Yao'
print(str.split())
print('1+2+3+4+5'.split('+'))
print('1+2\n3+4+5'.splitlines())
输出:
[‘my’, ‘name’, ‘is’, ‘Yao’]
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]
[‘1+2’, ‘3+4+5’]
23、转化为标题格式:title()
print('my name is Yao'.title())
输出:
My Name Is Yao
七、字典
1、定义
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
2、字典的特性:
- 字典是无序的
- key必须是唯一的,so 天生去重
3、增加
info["stu1104"] = "苍井空"
print(info)
输出:
{‘stu1102’: ‘LongZe Luola’, ‘stu1104’: ‘苍井空’, ‘stu1103’: ‘XiaoZe Maliya’, ‘stu1101’: ‘TengLan Wu’}
4、修改
info['stu1101'] = "武藤兰"
print(info)
输出:
{‘stu1102’: ‘LongZe Luola’, ‘stu1103’: ‘XiaoZe Maliya’, ‘stu1101’: ‘武藤兰’}
5、删除
info = {
'stu001': '苍井空',
'stu002': 'LongZe LuoLa',
'stu003': 'XiaoZe MaLiYa',
'stu004': '胡桃雏'
}
#方法一:标准删除 pop()
info.pop("stu001")
#方法二:del删除
del info['stu003']
#方法三:随机删除一个 popitem()
info.popitem()
print(info)
输出:
{‘stu002’: ‘LongZe LuoLa’}
6、查找
info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
#方法一:标准查找in(判断是否存在该key)
"stu1102" in info
#方法二:获取get()
info.get("stu1102")
info.get("stu1104")
#方法三:key直接获取
info["stu1102"]
info["stu1105"]
输出:
True
‘LongZe Luola’
None
‘LongZe Luola’
Traceback (most recent call last):
File “”, line 1, in
KeyError: ‘stu1105’
注意:如果一个key不存在,通过key做下标直接获取就会报错,而get不会,不存在只返回None
7、多级字典嵌套及操作
av_catalog = {
"欧美":{
"www.youporn.com": ["很多免费的,世界最大的","质量一般"],
"www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
print(av_catalog["大陆"]["1024"])
输出:
[‘全部免费,真好,好人一生平安’, ‘服务器在国外,慢,可以用爬虫爬下来’]
8、其他方法
- 打印字典所有的values:values()
info.values()
dict_values([‘LongZe Luola’, ‘XiaoZe Maliya’])
- 打印字典所有的keys:keys()
info.keys()
dict_keys([‘stu1102’, ‘stu1103’])
- 给字典的key设置默认值(若已有默认值则无变化,若无默认值则添加):setdefault()
info = {
'stu1102': 'LongZe Luola',
'stu1103': 'XiaoZe Maliya',
}
info.setdefault("stu1106","Cang JingKong")
info.setdefault("stu1102","龙泽萝拉")
print(info)
{‘stu1102’: ‘LongZe Luola’, ‘stu1103’: ‘XiaoZe Maliya’, ‘stu1106’: ‘Cang JingKong’}
- 按一个字典更新另一个字典:update()
info = {
'stu1102': 'LongZe Luola',
'stu1103': 'XiaoZe Maliya',
'stu1106': 'Cang JingKong'
}
b = {1:2,3:4, "stu1102":"龙泽萝拉"}
info.update(b)
print(info)
{‘stu1102’: ‘龙泽萝拉’, 1: 2, 3: 4, ‘stu1103’: ‘XiaoZe Maliya’, ‘stu1106’: ‘Cang JingKong’}
- 将字典转化为元组:items()
print(info.items())
dict_items([(‘stu1102’, ‘龙泽萝拉’), (1, 2), (3, 4), (‘stu1103’, ‘XiaoZe Maliya’), (‘stu1106’, ‘Alex’)])
9、字典遍历
#方法1
for key in info:
print(key,info[key])
#方法2
for k,v in info.items(): #会先把dict转成list,数据里大时莫用
print(k,v)