标准库:不需要下载安装,import后就可以调用;
第三方库:需要下载安装才能import。
ctrl+B 导航到方法的定义
sys模块:
sys.path 以列表的形式返回环境变量
sys.argv 在pycharm返回绝对路径;在命令行模式下返回相对路径,可输入参数,输入的参数与相对路径组成新的列表。
os模块:
os.system("dir") 只执行命令,不能保存结果。输出当前文件夹内文件目录,并且存在乱码,不能用来赋值。
directory=os.system("dir") directory不会被赋值。
print(directory) 打印结果为“0”,表示执行成功。
可赋值的命令:
os.popen("dir") 返回对象地址,可赋值
directory=os.popen("dir").read() 返回当前文件夹内文件目录,无乱码。
print(directory) 打印出文件目录。
os.mkdir("new_dir") 在当前文件夹下新建名为“new_dir”的文件夹。
自己创建模块,调用模块时检索顺序为:当前文件夹-->环境变量,找不到的话报错。所以,当把模块放在当前文件夹的上级文件夹里时,报错。
解决办法:
1、将模块文件复制到环境变量下,venv\lib\site-packages文件夹下。
2、将模块所在文件夹加入环境变量中。
bytes和str(字节包和字符串):
python存储文件有两种方式:bytes和string,视频文件用bytes存储,文本文件两者都可以,在网络编程中,数据传输只可以用bytes方式,所以以string类型存储的文件需要编码成bytes类型。
python2中bytes和str相同,可以拼接,python3中明确区分开来,不能拼接。
str转换为bytes称为编码,使用encode()命令;
bytes转换为str称为解码,使用decode()命令,括号内填写str的编码类型,缺省时默认为utf-8。
string="四川成都"
print(string.encode(encoding="utf-8"))
print(string.encode("utf-8"))
print(string.encode())
输出相同: b'xe5x9bx9bxe5xb7x9dxe6x88x90xe9x83xbd'
列表list:
lis=['a','b','c','d','e']
print(lis[1])
print(lis[1:]) 顾头不顾尾,lis[i,j]表示列表中索引为i到索引为j的元素,不包括索引为j的元素。
输出结果:
b
['b', 'c', 'd', 'e']
for i in lis:
print(i) 打印lis的所有元素
二维列表: lis[i][j],不能用lis[i,j]表示
lis[0:-1] 表示所有元素
lis[0:-1:2] 表示步长为2的所有元素
lis[::2] 表示步长为2的所有元素,与lis[0:-1:2]功能相同
lis[-1]表示最后一个元素,lis[-2:]表示最后两个元素,lis[:2]表示前两个元素。
lis.append('aaa')将'aaa'插入到lis尾部。
lis.insert(2,'aaa')将'aaa'插入到lis的第三位,即索引为2的地方。
lis=['a','b','c','d','e','f']
lis.append('aaa')
lis.insert(2,'bbb')
print(lis)
输出为: ['a', 'b', 'bbb', 'c', 'd', 'e', 'f', 'aaa']
lis[1]="changed" 将lis第二个元素改为‘changed’。
lis.remove('a') 删除‘a’元素
del lis[i] 删除lis的索引为i的元素
del lis 删除lis变量
lis.pop(i) 删除lis的索引为i的元素,缺省时默认为最后一个元素。
lis.index('a') 返回'a'的索引值
lis.count('a') 返回lis中‘a’的个数
lis.reverse() 翻转lis的顺序
lis.sort() 将元素按照首字母排序:特殊字符>数字>大写>小写,ASCII码表里的顺序
lis.extend(lis2) 将lis2的元素添加到lis的尾部,lis2不变
lis.copy() 浅copy,只copy列表的第一层。由数据的存储原理决定,列表的第二层在第一层只是地址元素,相当于指针。
浅拷贝四种方法:
import copy
lis=['a','b',['a2','b2'],'c','d']
lis1=list(lis) 列表工厂
lis2=lis.copy()
lis3=copy.copy(lis)
lis4=lis[:] 切片
例如:
lis=['a','b',['a2','b2'],'c','d']
lis2=lis.copy() lis[2]位置上存储的是['a2','b2']的地址信息,copy方法只拷贝lis的第一层元素,所以当lis[2]改变时,lis2跟着改变,但是当lis的其他第一层元素改变时,lis2不变。
lis=['a','b',['a2','b2'],'c','d'] lis2=lis.copy() print(lis) print(lis2) lis[0]='AAA' print(lis) print(lis2) lis[2][0]='AAA' print(lis) print(lis2)
输出:
['a', 'b', ['a2', 'b2'], 'c', 'd'] ['a', 'b', ['a2', 'b2'], 'c', 'd'] ['AAA', 'b', ['a2', 'b2'], 'c', 'd'] ['a', 'b', ['a2', 'b2'], 'c', 'd'] ['AAA', 'b', ['AAA', 'b2'], 'c', 'd'] ['a', 'b', ['AAA', 'b2'], 'c', 'd']
如果想把一个列表赋值给另外一个列表,引用copy模块:这会增大内存消耗,谨慎使用。
深拷贝:
import copy
lis2=copy.deepcopy(lis)
lis2=lis 会造成lis2和lis指向同一块内存地址,两个变量完全相同,改变任一个变量时,两者一起改变。相当于c#中的引用类型。
lis=['a','b',['a2','b2'],'c','d'] lis2=lis print(lis) print(lis2) lis[0]='AAA' print(lis) print(lis2) lis[2][0]='AAA' print(lis) print(lis2)
输出:
['a', 'b', ['a2', 'b2'], 'c', 'd'] ['a', 'b', ['a2', 'b2'], 'c', 'd'] ['AAA', 'b', ['a2', 'b2'], 'c', 'd'] ['AAA', 'b', ['a2', 'b2'], 'c', 'd'] ['AAA', 'b', ['AAA', 'b2'], 'c', 'd'] ['AAA', 'b', ['AAA', 'b2'], 'c', 'd']
如果有两个值类型的变量a和b,a=b,改变b并不会使a改变。
例如:
b=5
a=b
print(a,b)
b=10
print(a,b)
输出:
5 5
5 10
元组tuple:只读列表。只有index和count两个方法
tup=('基哥','咪咪two','朱二娃','基佬强','毒炮')
print(tup.index('咪咪two'))
print(tup.count('基哥'))
输出:
1
1
练习:购物车
1 product_list=[('iphone', 6000), ('bike', 800), ('book', 50),('pen',100),('computer',3000)] 2 shopping_list=[] 3 salary=input('input your salary:') 4 if salary.isdigit(): 5 salary=int(salary) 6 while True: 7 8 '''for item in product: 9 print(product.index(item),item) 10 ''' 11 for index,item in enumerate(product_list): 12 print(index,item) 13 user_choice=input('选择商品:') 14 if user_choice.isdigit(): 15 user_choice=int(user_choice) 16 if user_choice<len(product_list) and user_choice>=0: 17 p_item=product_list[user_choice] 18 if p_item[1]<=salary: 19 shopping_list.append(p_item) 20 salary-=p_item[1] 21 print('added %s to your shopping cart,your balance is: 33[31;1m %d 33[0m'%(p_item[0],salary)) 22 else: 23 print('