Day02:我的Python学习之路

2022-11-17,,,

1、初识模块

Python的强大之处在于他有非常丰富和强大的标准库和第三方库,现在简单的学习2个常见的标准库——sys和os。

(1)系统的标准库sys

 # Author:GCL

 # 系统的标准库sys
import sys # 打印环境变量
print(sys.path)
# 打印相对路径
print(sys.argv)

标准库sys

['F:\\Python\\code\\Day02', 'F:\\Python\\code\\Day02', 'E:\\PythonAnZhuang\\python36.zip', 'E:\\PythonAnZhuang\\DLLs', 'E:\\PythonAnZhuang\\lib', 'E:\\PythonAnZhuang', 'E:\\PythonAnZhuang\\lib\\site-packages']
['F:/Python/code/Day02/MySys_Os.py']

输出

(2)系统的标准库os

 # Author:GCL

 # 系统的标准库os
import os # 执行系统命令,不保存结果,返回执行的状态,成功返回0
statue=os.system("dir")
print(statue)
# 得到返回的结果
ret=os.popen("dir").read()
print(ret)
# 新建文件夹的命令如下
#os.mkdir("newDir")

标准库os

 ������ F �еľ��� ѧϰ
������к��� 0000-0C4A F:\Python\code\Day02 ��Ŀ¼ 2018/05/05 17:04 <DIR> .
2018/05/05 17:04 <DIR> ..
2018/05/05 20:22 <DIR> .idea
2018/05/04 17:14 181 BytesAndStr.py
2018/05/05 11:45 772 ListCopy.py
2018/05/05 11:22 1,884 MyList.py
2018/05/04 01:38 443 MySys_Os.py
2018/05/05 17:04 1,561 ShoppingCart.py
5 ���ļ� 4,841 �ֽ�
3 ��Ŀ¼ 30,338,977,792 �����ֽ�
0
驱动器 F 中的卷是 学习
卷的序列号是 0000-0C4A F:\Python\code\Day02 的目录 2018/05/05 17:04 <DIR> .
2018/05/05 17:04 <DIR> ..
2018/05/05 20:22 <DIR> .idea
2018/05/04 17:14 181 BytesAndStr.py
2018/05/05 11:45 772 ListCopy.py
2018/05/05 11:22 1,884 MyList.py
2018/05/04 01:38 443 MySys_Os.py
2018/05/05 17:04 1,561 ShoppingCart.py
5 个文件 4,841 字节
3 个目录 30,338,977,792 可用字节

输出

2、pyc文件是什么

经常说Python是一门解释性语言,其实不够准确,想要弄清楚pyc文件到底是什么,就必须清楚Python的运行过程。
Python的运行过程其实类似于Java,先编译后解释,即:Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器解释成机器文件。所以说Python应该是一门先编译后解释的语言。
在说Python的运行过程之前,我们先来说两个概念,PyCodeObject和pyc文件。我们在硬盘上看到的pyc文件自然不必多说,而其实PyCodeObject则是Python编译器真正编译出的结果。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。所以pyc文件其实是PyCodeObject的一种持久化保存方式。

3、Python3的数据类型bytes

在Python3中,文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python3不会以任意隐式的方式混用str和bytes,所以两者的区分特别清晰。
但是,字符串可以编码成字节包,而字节包可以解码成字符串。

 # Author:GCL

 nameStr="我是Chinese"
# 编码
nameBytes=nameStr.encode('utf-8')
print(nameBytes)
# 解码
nameStr=nameBytes.decode('utf-8')
print(nameStr)

编码与解码

b'\xe6\x88\x91\xe6\x98\xafChinese'
我是Chinese

输出

4、列表

列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作。

(1)定义列表与访问单个元素

 # Author:GCL

 print("========定义列表与访问单个元素========")
# 定义列表
names=["Jack","Tom","Mary","Alex"]
print(names)
# 通过下标访问列表中的元素,下标从0开始计数
print(names[0],names[1],names[2],names[3])
# 倒着取的下标
print(names[-4],names[-3],names[-2],names[-1])

定义列表与访问单个元素

========定义列表与访问单个元素========
['Jack', 'Tom', 'Mary', 'Alex']
Jack Tom Mary Alex
Jack Tom Mary Alex

输出

(2)切片——取多个元素

 print("========切片========")
# 切片——取多个元素
# 取下标1至下标3之间的数字,包括1,不包括3
print(names[1:3])
# 与上句等价
print(names[1:-1])
# 当从头开始取的时候,下标0可以忽略
print(names[:2])
# 与上句等价
print(names[0:2])
# 如果想取到最后一个元素,应该像如下这么写
print(names[2:])
# 间隔着取元素
print(names[0:-1:2])
print(names[:-1:3])
print(names[::2])

切片——取多个元素

========切片========
['Tom', 'Mary']
['Tom', 'Mary']
['Jack', 'Tom']
['Jack', 'Tom']
['Mary', 'Alex']
['Jack', 'Mary']
['Jack']
['Jack', 'Mary']

输出

(3)追加

 print("========追加========")
names.append("追加新成员0")
print(names)

追加

========追加========
['Jack', 'Tom', 'Mary', 'Alex', '追加新成员0']

输出

(4)插入

 print("========插入========")
names.insert(1,"插入新成员0")
print(names)

插入

========插入========
['Jack', '插入新成员0', 'Tom', 'Mary', 'Alex', '追加新成员0']

输出

(5)修改

 print("========修改========")
names[2]="Tom_Mod"
print(names)

修改

========修改========
['Jack', '插入新成员0', 'Tom_Mod', 'Mary', 'Alex', '追加新成员0']

输出

(6)删除

 print("========删除========")
del names[1]
print(names)
# 删除指定元素
names.remove("Tom_Mod")
print(names)
# 删除列表的一个元素,默认是最后一个
names.pop()
print(names)
# names.pop(1)
names.pop(-2)
print(names)

删除

========删除========
['Jack', 'Tom_Mod', 'Mary', 'Alex', '追加新成员0']
['Jack', 'Mary', 'Alex', '追加新成员0']
['Jack', 'Mary', 'Alex']
['Jack', 'Alex']

输出

(7)扩展

 print("========扩展========")
ex=[1,2,3,2]
names.extend(ex)
del ex
print(names)

扩展

========扩展========
['Jack', 'Alex', 1, 2, 3, 2]

输出

(8)统计

 print("========统计========")
# 统计列表中元素为2的个数
num=names.count(2)
print(num)

统计

========统计========
2

输出

(9)排序与翻转

 print("========排序与翻转========")
# Python3中不同数据类型不能放在一起排序
names[2]=""
names[3]=""
names[-2]=""
names[-1]=""
print(names)
# 按照ASCII码的顺序排列
names.sort()
print(names)
# 翻转
names.reverse()
print(names)

排序与翻转

========排序与翻转========
['Jack', 'Alex', '', '', '', '']
['', '', '', '', 'Alex', 'Jack']
['Jack', 'Alex', '', '', '', '']

输出

(10)获取下标

 print("========获取下标========")
# 只返回找到的第一个下标
index=names.index("")
print(index)

获取下标

========获取下标========
3

输出

(11)清空列表

 print("========清空列表========")
names.clear()
print(names)

清空列表

========清空列表========
[]

输出

(12)拷贝

①.第一种浅拷贝

 # Author:GCL

 names1=["Jack","Tom","Mary",["",""],"Alex"]
# 浅拷贝
# names2=names1.copy()
# 等价于上句
# names2=names1[:]
# 等价于上句
names2=list(names1)
print(names1)
print(names2)
names1[1]="Tom_Mod"
names1[3][0]="One"
print(names1)
print(names2)

源码

['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom_Mod', 'Mary', ['One', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['One', ''], 'Alex']

结果

②.第二种浅拷贝

 # Author:GCL

 import copy
names3=["Jack","Tom","Mary",["",""],"Alex"]
# 浅拷贝
names4=copy.copy(names3)
print(names3)
print(names4)
names3[1]="Tom_Mod"
names3[3][0]="One"
print(names3)
print(names4)

源码

['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom_Mod', 'Mary', ['One', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['One', ''], 'Alex']

输出

③.深拷贝

 # Author:GCL

 import copy
# 深拷贝
names5=["Jack","Tom","Mary",["",""],"Alex"]
names6=copy.deepcopy(names5)
print(names5)
print(names6)
names5[1]="Tom_Mod"
names5[3][0]="One"
print(names5)
print(names6)

源码

['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['', ''], 'Alex']
['Jack', 'Tom_Mod', 'Mary', ['One', ''], 'Alex']
['Jack', 'Tom', 'Mary', ['', ''], 'Alex']

输出

5、元组

元组其实跟列表差不多,也是存一组数,只不过它一旦创建,便不能再修改,所以又叫只读列表。

6、购物车小程序

需求:

(1)启动程序后,让用户输入工资,然后打印商品列表;

(2)允许用户根据商品编号购买商品;

(3)用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒;

(4)可随时退出,退出时,打印已购买商品和余额。

 # Author:GCL

 # 商品列表
product_list=[("苹果",12),("香蕉",20),("西瓜",15),("橘子",10)]
# 购物列表,存放用户购买的商品
shopping_list=[]
# 工资
salary=input("请输入您的工资:")
# 工资是否为数字
if salary.isdigit():
salary=int(salary)
while True:
print("==========商品列表==========")
# index保存索引,item保存具体的值
for index,item in enumerate(product_list):
print(index,item)
user_choice=input("请选择需要购买的商品的编号:")
if user_choice.isdigit():
user_choice=int(user_choice)
# len(product_list)表示的是列表的元素个数
if user_choice<len(product_list) and user_choice>=0:
tmp_item=product_list[user_choice]
if tmp_item[1]<=salary:
shopping_list.append(tmp_item)
salary-=tmp_item[1]
print("商品:%s添加成功,还剩余额:\033[31;1m%d\033[0m"%(tmp_item,salary))
else:
print("\033[41;1m您的余额不够,只剩下:%d\033[0m"%(salary))
else:
print("您所输入的编号:%d不存在!"%(user_choice))
elif user_choice=="q":
print("正常退出!")
print("您所购买的商品如下:")
for index,item in enumerate(shopping_list):
print(index,item)
print("您的余额为:\033[31;1m%d\033[0m"%(salary))
exit()
else:
print("您的选择非法,无法识别!")
else:
print("您输入的工资有误!")

源码

请输入您的工资:50
==========商品列表==========
0 ('苹果', 12)
1 ('香蕉', 20)
2 ('西瓜', 15)
3 ('橘子', 10)
请选择需要购买的商品的编号:1
商品:('香蕉', 20)添加成功,还剩余额:30
==========商品列表==========
0 ('苹果', 12)
1 ('香蕉', 20)
2 ('西瓜', 15)
3 ('橘子', 10)
请选择需要购买的商品的编号:2
商品:('西瓜', 15)添加成功,还剩余额:15
==========商品列表==========
0 ('苹果', 12)
1 ('香蕉', 20)
2 ('西瓜', 15)
3 ('橘子', 10)
请选择需要购买的商品的编号:1
您的余额不够,只剩下:15
==========商品列表==========
0 ('苹果', 12)
1 ('香蕉', 20)
2 ('西瓜', 15)
3 ('橘子', 10)
请选择需要购买的商品的编号:q
正常退出!
您所购买的商品如下:
0 ('香蕉', 20)
1 ('西瓜', 15)
您的余额为:15

输出

7、字符串操作

关于对字符串的一系列操作,都在下面的源码中进行了详细的说明:

 # Author:GCL

 # 首字母大写,后续字母全部变为小写
print("toM gooD".capitalize()) # 统计给定字符串出现的次数
print("abc fdh aha".count("a")) # 将字符串填充到15位,用*号前后填充,如果指定的位数小于字符串的长度,将没有效果
print("".center(15,"*")) # 对字符串进行编码,得到对应的字节包
print("我爱中国".encode("utf-8")) # 判断字符串是否以gcl结尾
print("Qggh hjgcl".endswith("gcl")) # 将Tab键的距离扩展到16
print("I love\tYou".expandtabs(16)) # 格式化字符串
print("My name is {name},I am {year}".format(name="gcl",year=22))
print("My name is {name},I am {year}".format_map({"name":"gcl","year":22})) # 在字符串中查找name,找到的话返回首次找到的索引,否则返回-1
print("My name is {name},I am {year}".find("name")) # 在字符串中查找name,找到的话返回首次找到的索引,否则报错
print("My name is {name},I am {year}".index("name")) # 判断字符串是否为整数
print("".isdigit()) # 判断字符串是否只由数字和字母组成
print("ak15".isalnum()) # 判断字符串是否只由字母组成
print("aaA".isalpha()) # 判断字符串是否为十进制
print("".isdecimal()) # 判读字符串是否为一个合法的标识符
print("jk2_".isidentifier()) # 判读字符串中字母是否全为小写
print("abc 36".islower()) # 判断字符串是否只由数字组成
print("".isnumeric()) # 判断字符串是否可以打印
print("MyNameIs".isprintable()) # 判断字符串是否为空格
print(" ".isspace()) # 判断字符串是否为标题
print("My Name is".istitle())
print("My Name Is".istitle()) # 判读字符串中字母是否全为大写
print("AS11".isupper()) # join的示例用法
print("+".join(["","",""]))
print("->".join(["a","b","c"])) # 从左到右(左对齐),不够的位数用*来填充
print("".ljust(10,"*")) # 从右到左(右对齐),不够的位数用*来填充
print("".rjust(10,"*")) # 转换成小写
print("KLHasgUK".lower()) # 转换成大写
print("KLHasgUK".upper()) # 去除左边的空格或换行
print(" \nabc".lstrip()) # 去除右边的空格或换行
print("abc\n".rstrip()) # 去除两端的空格或换行
print(" \nabc\n".strip()) # maketrans用法示例
p=str.maketrans("abcde","")
print("hajbkcldqe".translate(p)) # 从左到右拆分字符串
print("My name is {name},I am {year}".partition(" ")) # 替换指定的字符串
print("gcl love li".replace("l","L",2)) # 从右到左首次找到的索引
print("gcl love li".rfind("l")) # 从右到左拆分字符串
print("My name is {name},I am {year}".rpartition(" ")) # 分割字符串
print("1+2+3+4".split("+")) # 大小写互换
print("aBcDeFgHi".swapcase()) # 转换成标题
print("i love you".title()) # 填充字符串
print("123abc".zfill(10))

源码

其对应的输出如下:

Tom good
3
****1234567****
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xb8\xad\xe5\x9b\xbd'
True
I love You
My name is gcl,I am 22
My name is gcl,I am 22
3
3
True
True
True
True
True
True
True
True
True
False
True
True
1+2+3
a->b->c
12345*****
*****12345
klhasguk
KLHASGUK
abc
abc
abc
h1j2k3l4q5
('My', ' ', 'name is {name},I am {year}')
gcL Love li
9
('My name is {name},I am', ' ', '{year}')
['', '', '', '']
AbCdEfGhI
I Love You
0000123abc

输出

8、字典操作

(1)字典是一种----->key:value 的数据类型,其语法如下:

 info={
"stu001":"gcl","stu002":"lmy","stu003":"xx"
}
print(info)

定义

{'stu001': 'gcl', 'stu002': 'lmy', 'stu003': 'xx'}

输出

(2)字典的特性:

①.字典是无序的;

②.字典的key值必须是唯一的。

(3)字典的常见操作

①.增加

 # 增加
info["stu004"]="yxm"
info["stu005"]="tl"
print(info)

增加

{'stu001': 'gcl', 'stu002': 'lmy', 'stu003': 'xx', 'stu004': 'yxm', 'stu005': 'tl'}

输出

②.修改

 # 修改
info["stu001"]="gcl2.0"
print(info)

修改

{'stu001': 'gcl2.0', 'stu002': 'lmy', 'stu003': 'xx', 'stu004': 'yxm', 'stu005': 'tl'}

输出

③.删除

 # 删除
# 指定删除
info.pop("stu004")
print(info)
del info["stu005"]
print(info)
# 随机删除
info.popitem()
print(info)

删除

{'stu001': 'gcl2.0', 'stu002': 'lmy', 'stu003': 'xx', 'stu005': 'tl'}
{'stu001': 'gcl2.0', 'stu002': 'lmy', 'stu003': 'xx'}
{'stu001': 'gcl2.0', 'stu002': 'lmy'}

输出

④.查找

 # 查找
# 如果Key值不存在就会报错
print(info["stu001"])
# 最好的方法是get,如果不存在会返回None
print(info.get("stu002"))
print(info.get("stu003"))
# 判断Key值是否存在
print(("stu001" in info))

查找

gcl2.0
lmy
None
True

输出

⑤.Keys值与values值

 # Keys值
print(info.keys()) # values值
print(info.values())

Keys值与values值

dict_keys(['stu001', 'stu002'])
dict_values(['gcl2.0', 'lmy'])

输出

⑥.setdefault、update、items

 # setdefault
info.setdefault("stu003","xx")
print(info)
info.setdefault("stu001","gcl")
print(info) # update
ex={11:22,33:44,"stu001":"gcl"}
info.update(ex)
print(info) # items
print(info.items())

setdefault、update、items

{'stu001': 'gcl2.0', 'stu002': 'lmy', 'stu003': 'xx'}
{'stu001': 'gcl2.0', 'stu002': 'lmy', 'stu003': 'xx'}
{'stu001': 'gcl', 'stu002': 'lmy', 'stu003': 'xx', 11: 22, 33: 44}
dict_items([('stu001', 'gcl'), ('stu002', 'lmy'), ('stu003', 'xx'), (11, 22), (33, 44)])

输出

⑦.循环打印

 # 循环打印字典
# 比较常用
for key in info:
print(key,info[key])
#会先把dict转成list,数据量大时莫用
for k,v in info.items():
print(k,v)

循环打印字典

stu001 gcl
stu002 lmy
stu003 xx
11 22
33 44
stu001 gcl
stu002 lmy
stu003 xx
11 22
33 44

输出

9、程序:三级菜单

要求:

(1)可返回上一级;

(2)可随时退出程序。

 # Author:GCL

 # 整体的字典数据
data={
"A1":{
"A11":{
"A111":["",""],
"A112":["",""]
},
"A12":{
"A121":["",""],
"A122":["",""]
},
"A13":{
"A131":["",""],
"A132":["",""]
}
},
"A2":{
"A21":{
"A211":["",""],
"A212":["",""]
},
"A22":{
"A221":["",""],
"A222":["",""]
},
"A23":{
"A231":["",""],
"A232":["",""]
}
},
"A3":{
"A31":{
"A311": ["", ""],
"A312": ["", ""]
},
"A32":{
"A321": ["", ""],
"A322": ["", ""]
},
"A33":{
"A331": ["", ""],
"A332": ["", ""]
}
},
"A4":{
"A41":{
"A411": ["", ""],
"A412": ["", ""]
},
"A42":{
"A421": ["", ""],
"A422": ["", ""]
},
"A43":{
"A431": ["", ""],
"A432": ["", ""]
}
}
} # 退出的标志位,默认为真
exit_flag=True
while exit_flag:
# 打印第一级的keys值
for k in data:
print(k)
choice1=input("您的选择(第一级):")
if (choice1 in data):
while exit_flag:
# 打印第二级的keys值
for k in data[choice1]:
print(k)
choice2=input("您的选择(第二级):")
if (choice2 in data[choice1]):
while exit_flag:
# 打印第三级的keys值
for k in data[choice1][choice2]:
print(k)
choice3=input("您的选择(第三级):")
if (choice3 in data[choice1][choice2]):
print(data[choice1][choice2][choice3])
elif choice3=="b":
break
elif choice3=="q":
exit_flag=False
else:
print("您的选择有误,无法识别!")
elif choice2=="b":
break;
elif choice2=="q":
exit_flag=False
else:
print("您的选择有误,无法识别!")
elif choice1=="b":
print("已经是第一级了,无法返回上一级!")
elif choice1=="q":
exit_flag=False
else:
print("您的选择有误,无法识别!")

源码

A1
A2
A3
A4
您的选择(第一级):A2
A21
A22
A23
您的选择(第二级):A21
A211
A212
您的选择(第三级):A212
['', '']
A211
A212
您的选择(第三级):A211
['', '']
A211
A212
您的选择(第三级):B
您的选择有误,无法识别!
A211
A212
您的选择(第三级):b
A21
A22
A23
您的选择(第二级):b
A1
A2
A3
A4
您的选择(第一级):b
已经是第一级了,无法返回上一级!
A1
A2
A3
A4
您的选择(第一级):A4
A41
A42
A43
您的选择(第二级):q Process finished with exit code 0

输出

后记:欢迎各路大神批评与指正!

2018.5.6

Day02:我的Python学习之路的相关教程结束。

《Day02:我的Python学习之路.doc》

下载本文的Word格式文档,以方便收藏与打印。