首页 > 技术文章 > day2-心得

kiko0o0 2017-12-26 15:12 原文

模块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来执行
View Code

我们在硬盘上看到的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)
View Code

 

一个二进制(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
View Code

 

列表操作:

 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)      #合并
View Code

 

 取多个元素

 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']
View Code

追加

1 >>> names
2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy']
3 >>> names.append("我是新来的")
4 >>> names
5 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
View Code

插入

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', '我是新来的']
View Code

修改

1 >>> names
2 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
3 >>> names[2] = "该换人了"
4 >>> names
5 ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
View Code

删除

 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']
View Code

扩展

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]
View Code

拷贝

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]
View Code

统计

1 >>> names
2 ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3]
3 >>> names.count("Amy")
4 2
View Code

顺序翻转

 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']
View Code

获取下标

1 >>> names
2 ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
3 >>> names.index("Amy")
4 2 #只返回找到的第一个下标
View Code

 

浅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']
View Code

 字符串操作

 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补充
View Code
 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
View Code

 字典使用

 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)
View Code

 购物车

 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("请重新输入")
View Code

 集合操作

 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))
View Code

 文件操作

 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
View Code

 进度条

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)
View Code

 

需知:

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)
View Code
 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)
View Code

 

复制代码
#-*-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)
复制代码

推荐阅读