模块sys和os
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import sys 5 6 sys.path #打印环境变量 7 print(sys.argv) 8 9 10 #输出 11 $ python test.py helo world 12 ['test.py', 'helo', 'world'] #把执行脚本时传递的参数获取到了 13 14 =============================== 15 #!/usr/bin/env python 16 # -*- coding: utf-8 -*- 17 18 import os 19 20 os.system("df -h") #调用系统命令 21 =============================== 22 import os,sys 23 24 os.system(''.join(sys.argv[1:])) #把用户的输入的参数当作一条命令交给os.system来执行
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
1 a = [1,2,3,4] 2 ys_i = type(a) is list #身份运算 3 print(ys_i)
一个二进制(bit)
8bit= 1byte(字节)
位运算:
1 #!/usr/bin/python 2 3 a = 60 # 60 = 0011 1100 4 b = 13 # 13 = 0000 1101 5 c = 0 6 7 c = a & b; # 12 = 0000 1100 8 print "Line 1 - Value of c is ", c 9 10 c = a | b; # 61 = 0011 1101 11 print "Line 2 - Value of c is ", c 12 13 c = a ^ b; # 49 = 0011 0001 #相同为0,不同为1 14 print "Line 3 - Value of c is ", c 15 16 c = ~a; # -61 = 1100 0011 17 print "Line 4 - Value of c is ", c 18 19 c = a << 2; # 240 = 1111 0000 20 print "Line 5 - Value of c is ", c 21 22 c = a >> 2; # 15 = 0000 1111 23 print "Line 6 - Value of c is ", c
列表操作:
1 #切片 2 name = ['zk','syf','cx',['kc','lo'],'tb'] 3 print(name[0]) #第一个zk 4 print(name[-1]) #倒数第一个tb 5 print(name[-2:]) #['cx', 'tb'] 6 print(name[:2]) #['zk', 'syf'] 7 name.append('kp') #最后插入 8 print(name) 9 name.insert(3,'kp') #要插入哪里就写几 10 name[1] = 'xd' #修改 11 name.remove('cx') #删除 12 del name[4] #删除 13 name.pop() #默认删除最后一个,写参数就删除对应位置的 14 print(name.index('zk')) #找到对应的位置 15 print(name[name.index('zk')]) 16 name.clear() #清空 17 print(name.count('kp')) #统计数量 18 name.reverse() #翻转 19 name.sort() #排序 20 print(name[0:-1:2]) #步长为2的切片 21 print(name[:-1:2]) 22 name2 = ['1','2','3'] 23 name.extend(name2) #合并
取多个元素
1 >>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] 2 >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 3 ['Tenglan', 'Eric', 'Rain'] 4 >>> names[1:-1] #取下标1至-1的值,不包括-1 5 ['Tenglan', 'Eric', 'Rain', 'Tom'] 6 >>> names[0:3] 7 ['Alex', 'Tenglan', 'Eric'] 8 >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 9 ['Alex', 'Tenglan', 'Eric'] 10 >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 11 ['Rain', 'Tom', 'Amy'] 12 >>> names[3:-1] #这样-1就不会被包含了 13 ['Rain', 'Tom'] 14 >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 15 ['Alex', 'Eric', 'Tom'] 16 >>> names[::2] #和上句效果一样 17 ['Alex', 'Eric', 'Tom']
追加
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 3 >>> names.append("我是新来的") 4 >>> names 5 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 3 >>> names.insert(2,"强行从Eric前面插入") 4 >>> names 5 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 6 7 >>> names.insert(5,"从eric后面插入试试新姿势") 8 >>> names 9 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
修改
1 >>> names 2 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 3 >>> names[2] = "该换人了" 4 >>> names 5 ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
删除
1 >>> del names[2] 2 >>> names 3 ['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 4 >>> del names[4] 5 >>> names 6 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 7 >>> 8 >>> names.remove("Eric") #删除指定元素 9 >>> names 10 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的'] 11 >>> names.pop() #删除列表最后一个值 12 '我是新来的' 13 >>> names 14 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
扩展
1 >>> names 2 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] 3 >>> b = [1,2,3] 4 >>> names.extend(b) 5 >>> names 6 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
拷贝
1 >>> names 2 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3] 3 4 >>> name_copy = names.copy() 5 >>> name_copy 6 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
统计
1 >>> names 2 ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3] 3 >>> names.count("Amy") 4 2
顺序翻转
1 >>> names 2 ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3] 3 >>> names.sort() #排序 4 Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 TypeError: unorderable types: int() < str() #3.0里不同数据类型不能放在一起排序了,擦 7 >>> names[-3] = '1' 8 >>> names[-2] = '2' 9 >>> names[-1] = '3' 10 >>> names 11 ['Alex', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3'] 12 >>> names.sort() 13 >>> names 14 ['1', '2', '3', 'Alex', 'Amy', 'Amy', 'Tenglan', 'Tom'] 15 16 >>> names.reverse() #反转 17 >>> names 18 ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
获取下标
1 >>> names 2 ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1'] 3 >>> names.index("Amy") 4 2 #只返回找到的第一个下标
浅copy和深copy
1 name = ['zk','syf','cx',['kc','lo'],'tb'] 2 print('name=',name) 3 name3 = name.copy() #复制 浅 4 name[1] = 'zz' 5 name[3][1] ='syf' 6 print('-----------') 7 print('name=',name) 8 print('name3=',name3) 9 import copy 10 name4 = copy.deepcopy(name) #深copy 11 print('-----------') 12 print('name=',name) 13 name[3][0] = 'zk' 14 name[4] = 'zz' 15 print('name4=',name4) 16 print('name=',name) 17 18 name= ['zk', 'syf', 'cx', ['kc', 'lo'], 'tb', '1', '2', '3'] 19 ----------- 20 name= ['zk', 'zz', 'cx', ['kc', 'syf'], 'tb', '1', '2', '3'] 21 name3= ['zk', 'syf', 'cx', ['kc', 'syf'], 'tb', '1', '2', '3'] 22 ----------- 23 name= ['zk', 'zz', 'cx', ['kc', 'syf'], 'tb', '1', '2', '3'] 24 name4= ['zk', 'zz', 'cx', ['kc', 'syf'], 'tb', '1', '2', '3'] 25 name= ['zk', 'zz', 'cx', ['zk', 'syf'], 'zz', '1', '2', '3']
字符串操作
1 name = 'my \tname is {name} and i am {year} old' 2 3 print(name.capitalize()) #首字母大写 4 print(name.count("k")) #统计计数 5 print(name.center(50,'=')) #补齐,并居中 6 print(name.endswith("o0")) #判断以什么结尾 7 print(name.expandtabs(tabsize=30)) #\t 转换为多少个空格 8 print(name.find("name")) #找位置 9 print(name[name.find("name"):]) #找位置切片 10 print(name.format(name='kiko0o0',year = '20')) #参数录入 11 name1 = name.format(name='kiko0o0',year = '20') 12 print(name1.center(50,"-")) 13 print(name.format_map({'name':'kiko0o0','year':'20'})) #参数录入 14 print(name.index("and")) #查找字符串所在位置,如果不包含就报错,包含就打印位置 15 print('123qw'.isalnum()) #包含数字和字母返回true 如果包含特殊字符返回 false 16 print('adsf'.isalpha()) #纯英文字符返回true 17 print('1'.isdecimal()) #判断是否为十进制 18 print('1'.isdigit()) #判断是否为整数 19 print('a'.isidentifier()) #判断是不是一个合法的变量名 20 print(name.isnumeric()) #判断是不是一个只有数字 21 print(' '.isspace()) #判断是不是空格 22 print('My Name Is'.istitle()) #判断是不是首字母大写 23 print('zk'.isprintable()) #判断是不是可以打印的,tty设备终端等就返回false 24 print('ZHAOKAI'.isupper()) #是否全部为大写 25 print('+'.join(['1','2','3'])) #字符串链接 26 print(name.ljust(50,'*')) #长度多少 剩余的补充 27 print(name.rjust(50,'*')) #同上 只是反向 28 print('KkKiIu'.lower()) #大写变小写 29 print('KkKiIu'.upper()) #小写变大写 30 print('\nKiKko0'.lstrip()) #去除左边的空格和回车 31 print('-----') 32 print('\nKiKko0\n'.rstrip()) #去除右边的空格和回车 33 print('\nKiKko0\n'.strip()) #去除左右的空格和回车 34 p = str.maketrans("kjhgzx","123456") #类似加密一定要保证左右数据一样多 35 print("kiko0o0 zk".translate(p)) #返回翻译后的字符串 36 print('kiko0o0'.replace('k','a',1)) #替换后面是替换的数量,不写默认替换全部 37 print('kiko0o0'.rfind('o')) #找到的最后边的数值的下标返回 38 print('1+2+3+4+5'.split('+')) #以什么为分隔符分成列表 39 print('1\n2\n3\n4\n'.splitlines()) #以换行\n为分隔符生成列表 40 print('kikIRUo0o0o'.swapcase()) #大写转换小写,小写转换大写 41 print('my name is kik'.title()) #第一个字母变大写 42 print('kik o0o0'.zfill(50)) #不够用0补充
1 My name is {name} and i am {year} old 2 0 3 ======my name is {name} and i am {year} old====== 4 False 5 my name is {name} and i am {year} old 6 4 7 name is {name} and i am {year} old 8 my name is kiko0o0 and i am 20 old 9 -------my name is kiko0o0 and i am 20 old-------- 10 my name is kiko0o0 and i am 20 old 11 19 12 True 13 True 14 True 15 True 16 True 17 False 18 True 19 True 20 True 21 True 22 1+2+3 23 my name is {name} and i am {year} old************ 24 ************my name is {name} and i am {year} old 25 kkkiiu 26 KKKIIU 27 KiKko0 28 ----- 29 30 KiKko0 31 KiKko0 32 1i1o0o0 51 33 aiko0o0 34 5 35 ['1', '2', '3', '4', '5'] 36 ['1', '2', '3', '4'] 37 KIKiruO0O0O 38 My Name Is Kik 39 000000000000000000000000000000000000000000kik o0o0
字典使用
1 av_catalog = { 2 "欧美":{ 3 "www.youporn.com": ["很多免费的,世界最大的","质量一般"], 4 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], 5 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], 6 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] 7 }, 8 "日韩":{ 9 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] 10 }, 11 "大陆":{ 12 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] 13 } 14 } 15 16 info = { 17 'stu1101':'TengLan Wu', 18 'stu1102':'LongZe LuoLa', 19 'stu1103':'XiaoZe MaLiYa', 20 } 21 print(info['stu1101']) #查询,但是如果不存在就返回异常了 22 info['stu1101'] = 'WuTeng Lan' #修改 23 print(info) 24 info['stu1104'] = 'Cang Jingkong' #添加 25 print(info) 26 # del info['stu1101'] #删除 27 # print(info) 28 # info.pop("stu1102") #删除 29 # print(info) 30 # info.popitem() #随机删除 31 # print(info) 32 print(info.get('stu1105')) #用这个查询最友好,有就返回,没有就返回None 33 print('stu1101' in info) #判断是否存在,不存在返回false,存在返回true(python3.x),在python2.x里 用info.has_key('1101') 34 print(av_catalog["欧美"]['www.youporn.com'][1]) 35 av_catalog["大陆"]["1024"][1] = "可以在国内做镜像" 36 print(av_catalog["大陆"]["1024"]) 37 print(info.values()) #打印字典里所有的值 38 print(info.keys()) #打印字典里所有的key 39 print(av_catalog.setdefault("大陆",{"www.baidu.com":[1,2]})) 40 print(av_catalog.setdefault("台湾",{"www.baidu.com":[1,2]})) #有就返回对应的值,如果没有就建立新的 41 b = { 42 'stu1101':'Alex', 43 1:3, 44 2:5 45 46 } 47 info.update(b) #更新2个字典,有重复的更新,没有重复的添加 48 print(info) 49 print(info.items()) # 把字典转换列表形式 50 c = dict.fromkeys([6,7,8,9],[1,{'name':'zk'},'kiko0o0']) #初始化一个字典,key如果是多层,呢么如果修改一个key就会修改全部 51 print(c) 52 c[6][1]['name'] = "syf" 53 print(c) 54 for i in av_catalog: #建议用这个,效率高 55 print(i,av_catalog[i]) 56 57 for k,v in av_catalog.items(): #不建议用这个,效率低 58 print(k,v)
购物车
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 product_list = [ 6 ('iphone',5800), 7 ('Mac Pro', 9800), 8 ('Bike', 800), 9 ('Watch', 10800), 10 ('Coffe', 31), 11 ('XX python', 120), 12 13 ] 14 shopping_list = [] 15 salary = input("input you salary:").strip() 16 if salary.isdigit(): 17 salary = int(salary) 18 while True: 19 for index,item in enumerate(product_list): 20 print(index,item[0],item[1]) 21 user_choice = input("选择要买的商品>>>:").strip() 22 if user_choice.isdigit(): 23 user_choice = int(user_choice) 24 if user_choice < len(product_list) and user_choice >=0: 25 p_item = product_list[user_choice] 26 if p_item[1] <= salary: 27 shopping_list.append(p_item) 28 salary -= p_item[1] 29 print("added \033[32;1m %s \033[0m info shopping cart,your current %s" % (p_item[0],salary)) 30 else: 31 print('余额不够了') 32 elif user_choice =='q': 33 print('shopping_list'.center(50,'-')) 34 for p in shopping_list: 35 print(p) 36 print('your current balance:',salary) 37 break 38 else: 39 print("请重新输入")
集合操作
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 list_1 = [1,2,3,4,5,6,4,3,2] 6 list_1 = set(list_1) #集合自动去除重复,且无序的 7 print(list_1,type(list_1)) 8 list_2 = [1,3,6,43,5,2,8,44,5,2] 9 list_2 = set(list_2) 10 list_3 = set([1,2,3]) 11 list_4 = set([11,33,66]) 12 13 #交集 14 print('交集'.center(50,'-')) 15 print(list_1.intersection(list_2)) 16 print(list_1 & list_2) 17 #并集 18 print('并集'.center(50,'-')) 19 print(list_1.union(list_2)) 20 print(list_1 | list_2) 21 #差集 22 print('差集'.center(50,'-')) 23 print(list_1.difference(list_2)) #in list_1 but not in list_2 24 print(list_1 - list_2) #in list_1 but not in list_2 25 print(list_2.difference(list_1)) #in list_2 but not in list_1 26 print(list_2 - list_1) 27 28 #对称差集 29 print('对称差集'.center(50,'-')) 30 print(list_1.symmetric_difference(list_2)) #把2个里面相互都没有的取出来 31 print(list_1 ^ list_2) #把2个里面相互都没有的取出来 32 33 #子集 34 print(list_1.issubset(list_3)) #是否为子集,返回False,True 35 #父集 36 print(list_1.issuperset(list_3)) #是否为父集,返回False,True 37 38 39 print(list_1.isdisjoint(list_4)) #没有交集返回为True 40 41 #添加 42 list_1.add(222) #添加一个 43 list_1.update([777,66666,5555]) #添加多个 44 print(list_1) 45 #删除 46 list_1.remove(777) #如果不存在会报错 47 print(list_1) 48 list_1.pop() #随机删除 49 list_1.discard(777) #不存在不会报错 50 #判断是否存在 51 print(4 in list_1) 52 #长度 53 print(len(list_1))
文件操作
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 # r 读 w 写 a 追加 r+,可读写文件。【可读;可写;可追加】 w+,写读 6 #"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) 7 #"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注) 8 f = open('yesterday','r',encoding='utf-8') #文件句柄 9 10 print('我是分隔符'.center(50,'=')) 11 print(f.read()) #打印所有 12 print(f.readline()) #打印一行 13 print(f.readlines()) #在一行中打印所有的 14 f.close() 15 d = open('yesterday2','a',encoding='utf-8') 16 d.write('我爱北京天安门,\n') 17 d.write('天安门上太阳升') 18 19 # 最简洁的读取,不占用过多内存 20 count = 0 21 for line in f: 22 if count == 9: 23 print('我是第9行'.center(50,'-')) 24 count +=1 25 continue 26 print(line.strip()) 27 count +=1 28 29 # 循环读取前几行 30 for i in range(5): 31 print(f.readline().strip()) 32 33 # 循环读取,但是某一行不读取(过多占用内存) 34 for index,line in enumerate(f.readlines()): 35 if index ==9: 36 continue 37 print(index,line.strip()) 38 39 print(f.tell()) #打印当前光标位置 40 f.seek(0) #指定光标位置 41 z = open('readme.txt','r',encoding='utf-8') 42 print(z.encoding) #打印文件编码 43 print(z.buffer) 44 print(z.fileno()) #打印文件内存编号 45 print(z.flush()) #内存立即刷新到文件里 46 print(z.readable()) #判断文件是否可读,不可返回False 47 print(z.writable()) #判断文件是否可写,不可返回False 48 print(z.closed) #判断文件是否关闭 49 f.truncate() #不写就是从0开始清空 50 f.truncate(10) #截断10个后清空 51 s = open('yesterday2','wb') #文件句柄 二进制文件 52 s.write('hello world\n'.encode()) #指定的编码格式编码字符串,不写就是默认的例如UTF-8
进度条
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:kiko0o0 4 5 import sys,time 6 for i in range(50): 7 sys.stdout.write('#') 8 sys.stdout.flush() 9 time.sleep(0.1)
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
上图仅适用于py2
1 #-*-coding:utf-8-*- 2 __author__ = 'Alex Li' 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 8 msg = "我爱北京天安门" 9 msg_gb2312 = msg.decode("utf-8").encode("gb2312") 10 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk") 11 12 print(msg) 13 print(msg_gb2312) 14 print(gb2312_to_gbk)
1 #-*-coding:gb2312 -*- #这个也可以去掉 2 __author__ = 'Alex Li' 3 4 import sys 5 print(sys.getdefaultencoding()) 6 7 8 msg = "我爱北京天安门" 9 #msg_gb2312 = msg.decode("utf-8").encode("gb2312") 10 msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔 11 gb2312_to_unicode = msg_gb2312.decode("gb2312") 12 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") 13 14 print(msg) 15 print(msg_gb2312) 16 print(gb2312_to_unicode) 17 print(gb2312_to_utf8)
#-*-coding:gb2312 -*- #这个也可以去掉 __author__ = 'Alex Li' import sys print(sys.getdefaultencoding()) msg = "我爱北京天安门" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8") print(msg) print(msg_gb2312) print(gb2312_to_unicode) print(gb2312_to_utf8)