首页 > 代码库 > 从零开始学Python-day4

从零开始学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 = http://www.mamicode.com/{‘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}。将所有单词以及次数从大到小写入在网页文件中。


##代码如下

[root@xiaowei 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