我积极解决 发表于 2018-8-6 12:32:21

我的python学习--第三天

  第三天
  1:列表及Python基础回顾
  2:字典 列表字典生成式及应用场景
  3:字符串 字典字符串转换及应用场景
  4:文件操作 文件字典转换及应用场景
  5:总结基础数据结构的知识脑图 -- 增删查改
  1、列表的操作:
  help(list) 列表的帮助,列出所有列表的用法
  type(name) 判断数据类型是列表,元组或字典
  1.1、增
>>> shoplist = ['apple','mango','carrot','banana']  
>>> shoplist.append('rice')                            #方法1列表尾部追加元素
  
>>> shoplist.insert(1,'pear')                        #方法2列表第二个位置插入元素
  
>>> shoplist
  
['apple', 'pear', 'mango', 'carrot', 'banana', 'rice']
  1.2、删
>>> del shoplist                                    #方法1根据索引删除列表中元素  
>>> shoplist
  
['pear', 'mango', 'carrot', 'banana', 'rice']
  
>>> shoplist.remove('rice')                            #方法2根据内容删除元素
  
>>> shoplist
  
['pear', 'mango', 'carrot', 'banana']
  
>>> shoplist.pop()                                     #方法3弹出最后一个元素
  
'banana'
  
>>> shoplist
  
['pear', 'mango', 'carrot']
  1.3、改
>>> shoplist  
['pear', 'mango', 'carrot']
  
>>> shoplist = 'watermelon'                         #通过索引修改
  
>>> shoplist
  
['watermelon', 'mango', 'carrot']
  1.4、查
>>> num =   
>>> len(num)                                           #查看列表元素个数
  
6
  
>>> max(num)                                           #查看列表中元素最大值
  
5
  
>>> min(num)                                           #查看列表中元素最小值
  
1
  
>>> num.count(2)                                       #查看列表中某元素个数
  
2
  
>>> num.index(3)                                       #根据元素查找索引
  
2
  2、列表的遍历
>>> for i in shoplist:  
...   print i
  
...
  
pear
  
mango
  
carrot
  
banana
  
rice
  
>>> for i,j in enumerate(shoplist):
  
...   print i,j
  
...
  
0 pear
  
1 mango
  
2 carrot
  
3 banana
  
4 rice
  3、split()和join(),字符串和列表的转换
>>> ip = '192.168.1.1'  
>>> ip.split('.')
  
['192', '168', '1', '1']
  
>>> l = ['hello','world','!']
  
>>> ' '.join(l)
  
'hello world !'
  4、列表生成式
  格式:
  [ x for x in 内容]
  [ x for x in 内容 if 条件]
  1、把要生成的元素 x 放到前面,执行的时候,先执行后面的for循环
  2、后面跟上for循环,可以有多个for循环,也可以在for循环后面再加个if条件
  3、for循环后面可以是任何方式的迭代器(元组,列表,生成器..),只要可迭代对象的元素中至少有一个值.
>>>                               #单循环列表生成式  
['a', 'b', 'c', 'd']
  
>>> l = range(10,15)
  
>>> l
  

  
>>>                            #带if判断的单循环列表生成式
  

  
>>>                 #双循环列表生成式
  
['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
  
>>> A = ['HELLO','WORLD','APPLE']                      #大小写转换
  
>>>
  
['hello', 'world', 'apple']
  
>>> d = {'name':'Alice','age':20,'gender':'F'}         #迭代字典生成列表
  
>>> field =
  
>>> value =
  
>>> field,value
  
(['gender', 'age', 'name'], ['F', 20, 'Alice'])
  5、字典生成式
  格式:
  1、在python2.6或更早的版本,字典生成器可以接受迭代的键值对
  d = dict((k,v) for (k,v) in iterable)
  2、在python2.7或3以后,可以直接使用字典推导式语法
  d = {k:v for k,v in iterable}
  3、python2.7以上兼容两种写法,python2.6只能使用第一种
  4、可以用任何方式的迭代器(元组,列表,字典...),只要可迭代对象的元素中有两个值
>>> shoplist  
['pear', 'mango', 'carrot', 'banana']
  
>>> dict((k,v) for k,v in enumerate(shoplist))
  
{0: 'pear', 1: 'mango', 2: 'carrot', 3: 'banana'}
  
>>> {k:v for k,v in enumerate(shoplist)}
  
{0: 'pear', 1: 'mango', 2: 'carrot', 3: 'banana'}
  1、嵌套元组和嵌套类别可以直接通过dict命令转为字典(嵌套内部的元素只能是2个)
>>> a = [(1,'a'),(2,'b')]  
>>> dict(a)
  
{1: 'a', 2: 'b'}
  2、zip()函数可以将多个元组或列表合并,合并规则是每个元组元素个数一致
>>> zip(('name','age'),('Bob',20))  
[('name', 'Bob'), ('age', 20)]
  
>>> zip(['name','age'],['Bob',20])
  
[('name', 'Bob'), ('age', 20)]
  
>>> dict(zip(('name','age'),('Bob',20)))
  
{'age': 20, 'name': 'Bob'}
  
>>> zip(('name','age'),('Bob',20,'F'))                #元素个数不一致时,以最少的列表为准
  
[('name', 'Bob'), ('age', 20)]
  6、文件操作
  open():
  open('path'): 默认只读打开
  open('path','r+'): 读写打开,如果有内容,就会从头覆盖相应字符串的内容
  open('path','w'): 写入,先删除源文件,重新写入
  open('path','w+'): 读写,同上
  open('path','a'): 写入,在文件末尾追加新内容,文件不存在就先创建
  open('path','a+'): 读写,同上
  open('path','b'): 打开二进制文件,多用于读取图片
  open('path','U'): 支持所有换行符号值\r\n\r\n
  write():write(str)的参数是字符串
  writelines():writelines(sequence)的参数是序列,比如列表,它会帮你迭代写入
  read():每次读取整个文件,试用于小文件
  readline():每次读一行,逐行读取
  readlines():全部读取,自动将文件内容分析成一个行的列表,可以使用for...in...结构进行读取
  close(): 关闭打开的文件
  7、格式化
  7.1 字符串格式化
>>> print 'hello,%s'%'world'                                  # 方法1:C格式  
hello,world
  
>>> print 'hello,{}'.format('world')                        # 方法2:C#格式
  
hello,world
  
>>> print 'hello,{1}{0}'.format('!','world')                  # 方法3:C#格式
  
hello,world!
  C#格式的优点是可以使用{0},{1},...{n}来匹配对应的参数,如上面的方法3
  注:C#格式仅Python2.7以上版本可以使用
  7.2、列表格式化
>>> msg = ['name','Alice']  
>>> print '%s:%s'%(msg,msg)                           # 方法1:C格式
  
name:Alice
  
>>> print '%s'%':'.join(msg)                                  # 方法2:C格式(推荐使用)
  
name:Alice
  
>>> print '%s%s:%d'%('her ','age',20)                         # 方法3:C格式
  
>>> print '{} is {}'.format(*msg)                           # 方法4:C#格式
  
name is Alice
  
>>> print '{}{}{}'.format('hello ','world ','!')            # 方法5:C#格式
  
hello world !
  注:C#格式仅Python2.7以上版本可以使用
  7.3、字典格式化
>>> d = {'name':'Alice','age':18}  
>>> print 'I am %(name)s,my age is %(age)d'%d                  # 方法1
  
I am Alice,my age is 18
  
>>> print 'I am {name},my age is {age}'.format(**d)            # 方法2(推荐使用)
  
I am Alice,my age is 18
  
>>> print 'I am {name},my age is {age}'.format(name='Alice',age=18) # 方法3
  
I am Alice,my age is 18
  8、字符串处理常用方法:startswith()、endswith和strip()
  startswith():判断是否以指定子串开始
  endswith():判断是否以指定子串结束
>>> a = 'hello'  
>>> a.startswith('a')
  
False
  
>>> a.startswith('h')
  
True
  
>>> a.startswith('he')
  
True
  
>>> a.endswith('o')
  
True
  
>>> a.endswith('lo')
  
True
  
>>> a.endswith('l')
  
False
  strip():删除字符串开始和结尾处的指定的字符,默认为空格
  rstrip():删除字符串结尾处指定的字符
  lstrip():删除字符串开始处指定的字符
>>> string = 'aaabbcc   '  
>>> string.strip()
  
'aaabbcc'
  
>>> string.rstrip()
  
'aaabbcc'
  
>>> string.lstrip()
  
'aaabbcc   '
  
>>> string2 = 'aabbccd'
  
>>> string2.strip('a')
  
'bbccd'
  
>>> string2.strip('d')
  
'aabbcc'
  练习:
  1、将主机ip(192.168.1.1-254)存入列表
hostlist = []  
netip = '192.168.1.'
  
for hostip in range(1,255):
  
    ip = netip + str(hostip)
  
    hostlist.append(ip)
  
print hostlist
  2、将这个字典逐个显示{'name':'Alice','Bob':['male',20],'Tom':{'age':25,'gender':'M'}}
d = {'name':'Alice','Bob':['male',20],'Tom':{'age':25,'gender':'M'}}  
for k,v in d.items():
  
    print k+':'
  
#    if type(v) is list:
  
    if isinstance(v,list):
  
      for i in v:
  
            print i
  
#    elif type(v) is dict:
  
    elif isinstance(v,dict):
  
      for m,n in v.items():
  
            print m,n
  
    else:
  
      print v
  3、将一段文本拼接成num:word的字典格式
  content="who have touched their lives Love begins with a smile grows with a kiss and ends with a tear The brightest future will always be based on a forgotten past you can not go on well in life until you let go of your past failures and heartaches"
content="who have touched their lives Love begins with a smile grows with a kiss and ends with a tear The brightest future will always be based on a forgotten past you can not go on well in life until you let go of your past failures and heartaches"  

  
d = {}
  

  
for word in content.split():                           #将字符串转化为word:num格式
  
    if word in d.keys():
  
      d += 1
  
    else:
  
      d = 1
  
print d
  

  
d2 = {}                                                #将k,v互换,为num:list(word)格式
  
for word,count in d.items():
  
    d2.setdefault(count,[])
  
    d2.append(word)
  
print d2
  4、通过文本,构建一个注册,登陆系统
  4.1、注册系统
#!/usr/bin/python  
#-coding = utf-8-
  

  
fo = open('user.txt','a+')
  

  
while True:
  
    name = raw_input('Please Input your name: ').strip()
  
    passwd = raw_input('Please Input your password: ').strip()
  
    repasswd = raw_input('Please Input your password again: ').strip()
  

  
    if not name:
  
      print 'The name can not be null'             #用户名不能为空
  
      continue
  
    elif not passwd or passwd!=repasswd:             #密码不能为空,且与再次输入相同
  
      print 'Wrong password'
  
      continue
  
    else:
  
      print 'login successfully'
  
      break
  

  
fo.write('%s:%s\n'%(name,passwd))                  #写入文件
  
fo.close()
  4.2、登陆系统
#!/usr/bin/python  
#-coding=utf-8-
  

  
fo = open('user.txt')                              #读取文件
  
content = fo.readlines()
  
fo.close()
  

  
d = {}
  
for user in content:
  
    name = user.strip('\n').split(':')            #获取用户名和密码
  
    passwd = user.strip('\n').split(':')
  

  
    d = passwd
  
#print d
  

  
count = 0
  
while True:
  
    count += 1
  
    if count > 3:
  
      print 'Sorry,too many error you input,contact the administrator please'
  
      break                                       #输入出错超过3次,退出
  
    name = raw_input('Please input your name: ')
  
    passwd = raw_input('Please input your passwd: ')
  

  
    if not name:                                    #对输入的用户名,密码进行判断
  
      print 'Name can not be null'
  
      continue
  
    elif name not in d:
  
      print 'No such user'
  
      continue
  
    elif not passwd or passwd!=d:
  
      print 'Wrong password'
  
      continue
  
    else:
  
      print 'login successfully'
  
      break
  5、从一段nginx访问日志中,获取前十个访问次数最多的ip地址,生成html文件显示
#!/usr/bin/python  
#-coding:utf-8-
  

  
fo = open('access.log')
  
content = fo.readlines()
  
fo.close()
  

  
#从字符串转化为列表
  
l = []
  
d = {}
  
for msg in content:
  
      ipaddr = msg.split(' ')
  
      l.append(ipaddr)
  
#print l
  

  
#从列表转化为字典
  
for ipaddr in l:
  
    if ipaddr in d:
  
      d += 1
  
    else:
  
      d = 1
  

  
d2 = {}
  
for k,v in d.items():
  
    d2.setdefault(v,[])
  
    d2.append(k)
  
#print d2
  

  
#找出访问频率最高的前十个ip地址,保存为html格式
  
count = 0
  
f = open('access.html','a+')
  
f.write("<html><table style='border:solid 1px'>")
  
f.write("<th style='border:solid 1px'>访问次数</th><th style='border:solid 1px'>ip地址</th>")
  
while count < 10:
  
    key = max(d2.keys())
  
    for index in range(len(d2)):
  
      f.write('<tr><td style="border:solid 1px">%s</td><td style="border:solid 1px">%s</td></tr>' % (key,d2))
  
    num = len(d2)
  
    d2.pop(key)
  
    count = count + num
  
f.write("</table></html>")
  
f.close()
  html文件效果图:
页: [1]
查看完整版本: 我的python学习--第三天