Python学习week2
标准库:不需要下载安装,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'\xe5\x9b\x9b\xe5\xb7\x9d\xe6\x88\x90\xe9\x83\xbd'
列表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:\033[31;1m %d\033[0m'%(p_item[0],salary)) 22 else: 23 print('\033[41;1m余额不足,只有%s\033[0m'%salary) 24 else: 25 print('没有此商品') 26 elif user_choice=='q': 27 print('----shopping list----') 28 for p in shopping_list: 29 print(p) 30 print('your current balance is:\033[31;1m%s\033[1m'%salary) 31 exit() 32 else: 33 print('invalid option')
改变输出颜色:
lis=['a','b','c','d'] print('\033[31;1m%s\033[1m'%lis) print('\033[32;1m%s\033[1m'%lis) print('\033[41;1m%s\033[1m'%lis) print('\033[42;1m%s\033[1m'%lis)
输出结果为:
字符串操作:
字符串和列表一样有索引,可以切片操作。
1 name='zhang haiyang' 2 name2='zhang\thaiyang' 3 name3='my name is {my_name},i am {age} years old' 4 print(name.capitalize()) #首字母大写 5 print(name.lower()) 6 print(name.upper()) 7 print('gang tian wu'.split()) #以空格为界限把字符串分割成列表 8 print('1+2+3+4+5'.split('+')) #以‘+’为界限 9 print(name.count('a')) 10 print(name.center(50,'-')) #把name变量居中打印,两边用-补充,总共50个字符 11 print(name.endswith('ang')) #判断name变量是否以'ang'结尾 12 print(name2.expandtabs(20)) #把name2变量中的\t(Tab键)变成20个空格 13 print(name.find('hai')) #find方法返回‘hai’首次出现的索引值 14 print(name[name.find('hai'):]) #打印name变量从‘hai’到最后一个字符,相当于列表的切片 15 print(name3.format(my_name='zhhy',age=20)) #格式化输出 16 print(name3.format_map({'my_name':'zhhy','age':20})) #用字典为格式化输出传值 17 print('zhhy236400'.isalnum()) #是否只包含英文字母和数字 18 print('Zhhy'.isalpha()) #是否只包含字母 19 print('10'.isdecimal()) #是否是十进制数 20 print('010'.isdigit()) #是否是整数 21 print('aaa'.isidentifier()) #是否是合法标识符(变量名) 22 print('Aa'.islower()) #是否是小写 23 print('+'.join(['a','b','c'])) #将列表元素变成字符串,常用 24 print(name.ljust(50,'-')) 25 print(name.rjust(50,'*')) 26 print(' \nzhang'.lstrip()) 27 print('zhang \n '.rstrip(),'haiyang') 28 print(' \nzhang\n '.strip()) 29 p=str.maketrans('abcde','A2345') #转换对应位置的字符 30 print('apple'.translate(p)) 31 print('zhanghai'.replace('a','A',1)) #‘a’替换成‘A’,替换1个,缺省默认全部替换 32 print('ZHang'.swapcase()) #大小写转换 33 print('my name is gangtianwu'.title()) #字符串改变为标题形式
字典:无序,key唯一,可嵌套
key:value
1 dict_216={'weijf':'mimitwo', 2 'liuzhq':'gangtianwu', 3 'zhuhy':'zhuerwa'} 4 print(dict_216) 5 print(dict_216['weijf'])
输出:
{'zhuhy': 'zhuerwa', 'liuzhq': 'gangtianwu', 'weijf': 'mimitwo'} #无序输出,和输入顺序不同
mimitwo
1 dict_216={'weijf':'咪咪two', 2 'liuzhq':'刚田武', 3 'zhuhy':'朱二娃'} 4 print(dict_216) 5 print(dict_216.keys()) #打印字典所有key 6 print(dict_216.values()) #打印字典所有value 7 #print(dict_216['tanglh']) #查找元素,key时返回对应的value,不存在时报错,程序中断,只有在肯定存在此key时才可以使用 8 print(dict_216.get('tanglh')) #查找元素,如果key不存在,返回none,不会报错,程序继续执行 9 print('tanglh' in dict_216) #查找元素,返回true或者false。python2中语法:dict_216.has_key('tanglh'),python3中不再使用 10 dict_216['weijf']='猪骑士' #改变字典元素 11 dict_216['chenjq']='鸡鸡' #增加字典元素 12 del dict_216['weijf'] #删除元素,del方法是python内置方法。 13 dict_216.pop('liuzhq') #删除元素 14 dict_216.setdefault('tanglh','毒炮') #key存在时,不改变任何元素,不存在时,创建新的key-value 15 dict_216.setdefault('zhuhy','猪逼') 16 print(dict_216) 17 dict_new={'zhuhy':'潮流富贵猪逼', 18 1:2, 19 3:4} 20 dict_216.update(dict_new) #合并更新dict_216 21 print(dict_216) 22 print(dict_216.items()) #字典转为列表
遍历字典:
dict_216 = {'weijf': '咪咪two', 'liuzhq': '刚田武', 'zhuhy': '朱二娃'} for i in dict_216: #高效,推荐使用 print(i,dict_216[i]) print('-----') for i,j in dict_216.items(): #dict_216.items()先把dict_216转换成列表再遍历,效率低,不推荐使用 print(i,j) print('-----') for i in dict_216: #只遍历key,不打印value print(i)