从零开始学Python-day4
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学Python-day4相关的知识,希望对你有一定的参考价值。
Python--Day4
学习要有定位,明确目标地去学习。希望自己能坚持下去,并有所收获---leaves
大体上,开发的主要思想就是增、删、改、查四大部分。---Panda
python03-列表、字典和字符串进阶以及文件操作
一、列表的去重
列表去重的方法主要有set集合和函数两种方法去重。
方案一:set集合 >>> name_list = [‘haha‘, ‘heheh‘, ‘haha‘, ‘euw‘, ‘liwei.fu‘] >>> set(name_list) set([‘euw‘, ‘liwei.fu‘, ‘haha‘, ‘heheh‘]) 方案二:函数 >>> name_list = [‘haha‘, ‘heheh‘, ‘haha‘, ‘euw‘, ‘liwei.fu‘] set([‘euw‘, ‘liwei.fu‘, ‘haha‘, ‘heheh‘]) >>> new_list = [] >>> for i in name_list : ... if i not in new_list: ... new_list.append(i) >>> new_list
二、列表和字符串之间的转换
字符串 ====> 列表 split()
列表 ====> 字符串 join()
##join() ==》格式为 "连接符".join(name_list)
###join()和split()详解
##split()举例用法 In [51]: ip = "192.168.1.1" In [52]: ip.split(".") Out[52]: [‘192‘, ‘168‘, ‘1‘, ‘1‘] ##join()举例用法 In [53]: ‘!‘.join([‘192‘, ‘168‘, ‘1‘, ‘1‘]) Out[53]: ‘192!168!1!1‘ 小例子:将192.168.1.1-255的ip存入到列表中===>对应实例为公司将机房ip存入数据库 In [28]: ip_arr = [] In [29]: netip = "192.168.1." In [30]: for i in range(1,5): ...: ip = netip+"".join(str(i)) ...: ip_arr.append(ip) ...: print ip_arr ...: ...: ...: [‘192.168.1.1‘, ‘192.168.1.2‘, ‘192.168.1.3‘, ‘192.168.1.4‘]
三、列表的进阶
列表的高级用法:列表的遍历
3.1 普通的列表遍历
In [3]: shoplist = list(‘test‘) In [4]: for i in shoplist: ...: print i ...: t e s t
3.2 列表的高级遍历 && 列表生成式
列表的高级遍历主要需求是:希望列表中的元素对应其index索引值
In [5]: shoplist = [‘c‘,‘a‘,‘b‘,‘a‘] In [33]: for index,value in enumerate(shoplist): ...: print index , value ...: 0 c 1 a 2 b 3 a
列表生成式:主要将字典data的key,value分别取出来做成列表
格式:
[x for x in 内容]
[x for x in 内容 if 条件]
需求: 一、字符串拼成列表
二、列表本身拼接成列表
三、字典拼接成列表
##练习:将字符串生成列表===>需求一、字符串拼成列表
In [40]: [x for x in "abcx"]
Out[40]: [‘a‘, ‘b‘, ‘c‘, ‘x‘]
##练习,列表本身拼成列表===>需求二、列表拼成列表
In [41]: arr = [10,22,13,25]
In [42]: [i for i in arr if i> 20]
Out[42]: [22, 25]
##上述列表生成式的原生态写法
In [41]: arr = [10,22,13,25]
In [43]: new_a = []
In [44]: for i in arr:
...: if i > 20:
...: new_a.append(i)
...: print new_a
...:
[22, 25]
##练习:将字典生成列表===>需求三、字符串拼成列表
#方法一
In [34]: fields = [‘a‘,‘b‘,‘c‘]
In [35]: data = {‘a‘:‘abc‘,‘b‘:‘bac‘,‘c‘:‘cab‘}
In [36]: [data[x] for x in fields]
Out[36]: [‘abc‘, ‘bac‘, ‘cab‘]
##方法二
In [39]: [v for k ,v in data.items()]
Out[39]: [‘abc‘, ‘cab‘, ‘bac‘]
3.3 列表的高级用法
列表可以用来优雅的拼接mysql语句====>mysql语句的拼接
#传统SQL语句,死板,更改的话不方便
In [46]: sql = "select id,username,email,role from users"
In [47]: sql
Out[47]: ‘select id,username,email,role from users‘
#进阶拼接,更改fields列表就能拼接获取自己想要的数据
#通过列表动态拼接MySQL
fields = [‘id‘,‘username‘,‘email‘,‘role‘]
sql = "select %s from users" %",".join(fields)
In [48]: sql = ‘‘
In [49]: sql = ‘select %s from users‘ % ‘,‘.join(fields)
In [50]: sql
Out[50]: ‘select id,username,email,role from users‘
四、字典基础知识
4.1 字典可以嵌套任意数据类型 && 字典的增删改查
##字典可以嵌套任意数据类型(key值必须唯一) In [16]: content = {‘name‘:‘test‘,‘black‘:{‘phone‘:11111,‘age‘:22},‘colo‘:[ ‘22222‘,33]} In [17]: content Out[17]: {‘black‘: {‘age‘: 22, ‘phone‘: 11111}, ‘colo‘: [‘22222‘, 33], ‘name‘: ‘test‘} #查找key值 In [18]: content.keys() Out[18]: [‘colo‘, ‘black‘, ‘name‘] ##增加值 In [19]: content[‘aa‘]=‘ceshi‘ In [20]: content Out[20]: {‘aa‘: ‘ceshi‘, ‘black‘: {‘age‘: 22, ‘phone‘: 11111}, ‘colo‘: [‘22222‘, 33], ‘name‘: ‘test‘} ##删除字典值===>字典是无序的不能直接pop(),必须指定值 In [21]: content.pop(‘aa‘) ==>dict.pop(key) 指定key值 Out[21]: ‘ceshi‘ In [22]: content Out[22]: {‘black‘: {‘age‘: 22, ‘phone‘: 11111}, ‘colo‘: [‘22222‘, 33], ‘name‘: ‘test‘} ##修改值 In [23]: content Out[23]: {‘black‘: {‘age‘: 22, ‘phone‘: 11111}, ‘colo‘: [‘22222‘, 33], ‘name‘: ‘test‘} ##第一种 In [24]: content[‘name‘]=‘xiugai‘ #第二种,字典嵌套列表 In [25]: content[‘colo‘][1]= 60 #第三种,字典嵌套字典 In [26]: content[‘black‘][‘phone‘] = 99999 #修改完成后的结果 In [27]: content Out[27]: {‘black‘: {‘age‘: 22, ‘phone‘: 99999}, ‘colo‘: [‘22222‘, 60], ‘name‘: ‘xiugai‘} #字典的查==>属性的查找和内容的查找 ##len(dict)举例查找字典的长度 In [7]: d = {‘a‘:‘b‘,‘c‘:‘d‘} In [8]: len(d) Out[8]: 2 ###查字典的keys值 In [28]: content.keys() Out[28]: [‘colo‘, ‘black‘, ‘name‘]==>以列表的形式返回 ##查字典的values值 In [29]: content.values() Out[29]: [[‘22222‘, 60], {‘age‘: 22, ‘phone‘: 99999}, ‘xiugai‘]=>以列表的形式返回 ###查字典的键值对 In [30]: content.items() Out[30]: [(‘colo‘, [‘22222‘, 60]), (‘black‘, {‘age‘: 22, ‘phone‘: 99999}), (‘name‘, ‘xiugai‘)]===>以列表的形式返回
4.2 字典高阶查找介绍
4.2.1 查找key是否存在
In [48]: content
Out[48]: {‘black‘: {‘age‘: 22, ‘phone‘: 99999}, ‘colo‘: [‘22222‘, 60], ‘name‘: ‘xiugai‘}
In [46]: content.has_key(‘black‘)
Out[46]: True
In [47]: content.has_key(‘ssss‘)
Out[47]: False
4.2.2 高阶字典的取值dict.get()进阶
具体例子:若取字典中不存在的key的value值时,会报错并终止程序。
In [31]: content[‘sss‘]
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-31-f50c6b92c9f9> in <module>()
----> 1 content[‘sss‘]
KeyError: ‘sss‘ ===>在开发中如果key不存在的话会终止程序。改进
改进如下:
In [32]: content.get(‘asss‘,‘None‘)
Out[32]: ‘None‘
In [33]: content.get(‘name‘,‘None‘)
Out[33]: ‘xiugai‘
dict.get()进阶
In [35]: res = content.get(‘aaaaa‘,‘None‘)
In [36]: res
Out[36]: ‘None‘
In [37]: not res
Out[37]: False
In [38]: if res :
...: print “True”
...: else:
...: print "False"
...:
True
4.2.3 高阶字典的赋值dict.setdefault(‘KEY‘,‘VALUE‘)
####setdefault()函数小练习
In [7]: d = {‘a‘:‘b‘,‘c‘:‘d‘}
In [9]: d.setdefault(‘a‘,‘cc‘)
Out[9]: ‘b‘
In [10]: d.setdefault(‘f‘,‘cc‘)
Out[10]: ‘cc‘
In [11]: d
Out[11]: {‘a‘: ‘b‘, ‘c‘: ‘d‘, ‘f‘: ‘cc‘}
4.3 详细获取字典中value值中嵌套的数据:
**====>用isinstance([],list) 来判断是否为列表类型或者type([]) is list【is 结合type使用】
In [65]: content Out[65]: {‘black‘: {‘age‘: 22, ‘phone‘: 99999}, ‘colo‘: [‘22222‘, 60], ‘name‘: ‘xiugai‘} In [64]: for k ,v in content.items(): ...: print ‘%s : ----------‘ %k ...: if isinstance(v,dict): ...: for i ,j in v.items(): ...: print i ,j ...: elif type(v) is list : ...: for x in [x for x in v]: ...: print x ...: print v ...: colo : ---------- 22222 60 [‘22222‘, 60] black : ---------- phone 99999 age 22 {‘phone‘: 99999, ‘age‘: 22} name : ---------- xiugai ####判断是否为字符串str,生产中isinstence使用的多 In [70]: res = isinstance("hello",str) In [71]: res Out[71]: True
4.4 字典生成式:字典的高级用法(可以快速翻转字典)
格式:
dict( (v,k) for k ,v in d.iteritems())
dict( [(v,k) for k ,v in d.iteritems() ] )
###字典生成式小例子
In [37]: d = {1:2,3:4,5:6,7:8}
In [38]: print dict( (k ,v) for k ,v in d.iteritems())
{1: 2, 3: 4, 5: 6, 7: 8}
In [39]: print dict( (v ,k) for k ,v in d.iteritems())
{8: 7, 2: 1, 4: 3, 6: 5}
说明:
1.在Python2.6或更早的版本,字典生成器可以接受迭代的键/值对:
d = dict((key,value) for (key,value) in iterable) #第一个key,value的()必须写,第二个可以不写
2.从Python2.7或者3以后,可以直接用字典推导式语法:
d = { key:value for (key,value) in interable} #key,value的()可以不写
##python2.6版本
In [39]: print dict( (v ,k) for k ,v in d.iteritems())
{8: 7, 2: 1, 4: 3, 6: 5}
#python2.7及其以上版本
In [40]: {v : k for k ,v in d.items()}
Out[40]: {2: 1, 4: 3, 6: 5, 8: 7}
##拼接的高阶用法===>生产环境中查询多条数据返回的结果
In [41]: res = [{‘id‘:1,‘name‘:‘wd‘,‘age‘:18},{‘id‘:2,‘name‘:‘test‘,‘age‘:2
...: 8}]
In [44]: dict((str(x[‘id‘]),x[‘name‘]) for x in res)
Out[44]: {‘1‘: ‘wd‘, ‘2‘: ‘test‘}
4.5 字典小例子:
4.5.1 将字符串中每个出现的单子个数统计出来
The cafeteria was noisy , but silence hung between us . Valeri didn‘t seem to mind , but it drove me crazy . I searched my mind for things to say .
####具体代码如下: In [8]: sentence = "I am Bob ! I am a boy ." In [9]: arr = sentence.split(" ") In [10]: res_dict = {} In [11]: for i in arr: ...: res_dict[i] = res_dict.get(i,0) + 1 ===>高阶代码,可以省略四行代码 ###统计出来单词及其对应的个数 In [12]: res_dict Out[12]: {‘!‘: 1, ‘.‘: 1, ‘Bob‘: 1, ‘I‘: 2, ‘a‘: 1, ‘am‘: 2, ‘boy‘: 1}
4.5.2 字典的翻转:以个数为key,单词为value来转反成为新的字典(注意此时key重复的情况)
###具体代码如下: In [25]: new = {} In [26]: for k ,v in res_dict.items(): ...: if v not in new.keys(): ...: new[v] = [k] ...: else : ...: new[v].append(k) In [27]: print new {1: [‘!‘, ‘a‘, ‘boy‘, ‘.‘, ‘Bob‘], 2: [‘I‘, ‘am‘]} ###使用setdefault()函数优化代码 In [30]: for k ,v in res_dict.items(): ...: new.setdefault(v,[]) ...: new[v].append(k) ...: In [31]: new Out[31]: {1: [‘!‘, ‘a‘, ‘boy‘, ‘.‘, ‘Bob‘], 2: [‘I‘, ‘am‘]}
五、字符串的基础知识
In [45]: name = "hello"
In [46]: name.startswith(‘h‘)
Out[46]: True
In [47]: name.startswith(‘H‘)
Out[47]: False
##字符串的格式化 C的风格和 C#风格
In [48]: print "hello %s " % "xx" ##C风格
hello xx
In [49]: print "hello {}" .format("wd")###C#风格
hello wd
In [50]: print "hello {1} {0}" .format("How are you","wd")###C#风格的优势可以更改格式化的顺序
hello wd How are you
列表的格式化:
list = [‘hello‘, ‘1‘, ‘7‘]
‘%s %d-%d‘ % (‘hello‘, 1, 7)
‘%s %s-%s‘ % (list[0],list[1],list[2])
高逼格:推荐生产中使用
‘%s‘ %‘ ‘ .join(list)
字典的格式化:
In [60]: d = {‘name‘:‘aa‘ ,‘age‘:13}
In [61]: "i am %(name)s ,my age is %(age)s" %(d)
Out[61]: ‘i am aa ,my age is 13‘
In [63]: "i am {name} ,my age is {age}" .format(**d) ##字典两个*号,列表一个*
Out[63]: ‘i am aa ,my age is 13‘
####strip函数===>主要用于查找以.py等特定后缀结尾的文件名
In [64]: st = " aa "
In [65]: st.lstrip()
Out[65]: ‘aa ‘
In [66]: st.rstrip()
Out[66]: ‘ aa‘
In [67]: st.strip()
Out[67]: ‘aa‘
##查找以.py等特定后缀结尾的文件名
In [68]: a = ‘test.py‘
In [69]: a.rstrip(".py")
Out[69]: ‘test‘
5.1 小练习:##查找以.py等特定后缀结尾的文件名
In [79]: result = []
In [80]: for filename in os.listdir(‘/usr/local/src/python/03‘):
...: if filename.endswith(".py"):
...: result.append(filename.rstrip(‘.py‘))
...: print result
[‘dict_turn‘, ‘01‘]
六、文件的操作
文件打开分为三步: 打开文件==>读文件==>关闭文件
文件的主要内容也是增删改查
In [81]: f = open(‘/usr/local/src/python/03/01.py‘)
In [82]: f.read()
Out[82]: "l = [‘hello‘,1,3]\nprint ‘,‘.join(l)\n"
In [83]: f.close()
###运维的职责主要是读文件筛查日志
###增加 write 新增一行
###writelines 新增多行
##查 read readlines
###字符串、列表、字典文件的相互转换
6.1 文件打开的两种方式
方法一:f = open() 这种方法必须关闭文件,否则会报错
方法二:with open() as f: 这个方法代码简洁。会自行关闭文件
###代码举例
###方法一代码举例 In [2]: f = open("01.py") In [3]: print f.read() l = [‘hello‘,1,3] print ‘,‘.join(l) In [4]: f.close() ###方法二代码举例 In [5]: with open(‘01.py‘) as f1: ...: print f1.read() ...: l = [‘hello‘,1,3] print ‘,‘.join(l)
七、结合文件读写实现简单的用户注册登陆系统
7.1 ##用户注册:
代码如下:
f = open("users.txt","a+") #f.write("wd:123\n") #mes = ["kk:321\n","ss:456\n"] #f.writelines(mes) ###可以直接将列表中的元素写到文件中去 while True: name = raw_input("Please input you name :").rstrip() passwd = raw_input("Please input you password: ") repass = raw_input("Please confirm you password: ") if len(name) == 0: print "Name can‘t NULL,Input name again" continue if( passwd != repass) or (len(passwd) == 0) or (len(repass) == 0): print "Password Wrong" else : tmp = ["%s:%s\n" %(name,passwd)] f.writelines(tmp) #print "tmp is %s" %tmp print " OK " break f.close()
7.2 ####用户登陆
####登录代码:
#/usr/bin/python import sys f = open(‘users.txt‘,‘r‘) tlist = [] for i in f.readlines(): print i.strip(‘\n‘) t = i.strip(‘\n‘).split(":") tlist.append(t) print tlist res = dict((x[0],x[1]) for x in tlist) print res f.close() ####login Module while True : name = raw_input("Please input The username : ") if name not in res.keys(): print "The user is not exists" sys.exit(6) time = 1 while time < 4: pword = raw_input("Please input the password %s times :" %time) if ( len(pword) == 0 ) or pword != res[name]: print "The password is Wrong" else: print "login Sucess" sys.exit(0) if time == 3: sys.exit("三次密码输入错误,请联系管理员解锁") time += 1
八、简单的HTML表单制作
8.1 简单的HTML表单标签
HTML参考资料:http://www.w3school.com.cn/
##用途,将日志中访问量最大的ip最做成网页表格,以便boss观看更为直观。
标签 | 标签定义 | 用法 |
<html> | 定义html的网页 | <html></html> |
<table> | 定义HTML 表格 | <table></table> |
<tr> | 定义HTML 表格中的行。 | tr元素包含一个或多个th或td元素。 |
<th> | 定义HTML 表头。 | <th></th> |
<td> | 定义HTML 表格单元。 | <td></td> |
8.2 HTML表单小例子。
此项操作的目的:(如果是ip统计的话,一个简单的html表单绝对比命令行的awk、sort、uniq等命令筛选让boss看着更为直观)
统计单词后的结果为res_dict = {‘!‘: 1, ‘.‘: 1, ‘Bob‘: 1, ‘I‘: 2, ‘a‘: 1, ‘am‘: 2, ‘boy‘: 1}。将所有单词以及次数从大到小写入在网页文件中。
##代码如下
[[email protected] 03]# cat writef.py res = {‘!‘: 1, ‘.‘: 1, ‘Bob‘: 1, ‘I‘: 2, ‘a‘: 1, ‘am‘: 2, ‘boy‘: 1} ##实现字典的翻转,最终以次数为key,以单词组成的列表为value。 new = {} for k ,v in res.items(): new.setdefault(v,[])##高阶用法 new[v].append(k) print new #keys = max(new) #print "%s ----> %s" %(keys,new[keys]) ##HTML标签,<table>定义表格,<tr>定义表格中的一行,包含一个或者多个<th>或者<td>标签 f = open(‘tongji.html‘,"w+") str = "<table border=‘1px‘><tr><th>times</th><th>word</th></tr>" while True: keys = max(new) ##通过max()函数取得key中最大值,并遍历其value for i in new[keys]: str += "<tr><td>%s</td><td>%s</td></tr>" %(keys,i) new.pop(keys) ####遍历完key的最大值后去掉,以便下一次取得最大值仍未重复 if len(new) == 0 : break str += "</table>\n" f.write(str) f.close()
##最终tongji.html的效果图如下:
8.3 文件读取的扩展
如果10G以上的大文件日志分析,如果一次读取文件全部内容会导致电脑超负载的,此时正确的读取文件访问为偏移量的读取方式(仅为方案,等自己有空研究后在更新)。
f.read() ===>一次读取几个字符
f.seek() ===>一般使用f.seek(0)回到文档开始处
f.tell() ===>告知所处的游标
以上是关于从零开始学Python-day4的主要内容,如果未能解决你的问题,请参考以下文章