gaojinguan 发表于 2018-8-16 08:59:07

从零开始学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 : ip = "192.168.1.1"
  
In : ip.split(".")
  
Out: ['192', '168', '1', '1']
  

  

  
##join()举例用法
  
In : '!'.join(['192', '168', '1', '1'])
  
Out: '192!168!1!1'
  

  
小例子:将192.168.1.1-255的ip存入到列表中===>对应实例为公司将机房ip存入数据库
  
In : ip_arr = []
  
In : netip = "192.168.1."
  
In : 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 : shoplist = list('test')  

  
In : for i in shoplist:
  
   ...:   print i
  
   ...:
  
t
  
e
  
s
  
t
  3.2 列表的高级遍历 && 列表生成式
  列表的高级遍历主要需求是:希望列表中的元素对应其index索引值
In : shoplist = ['c','a','b','a']  

  
In : for index,value in enumerate(shoplist):
  
    ...:   print index , value
  
    ...:
  
0 c
  
1 a
  
2 b
  
3 a
  列表生成式:主要将字典data的key,value分别取出来做成列表
  格式:
  
  
  需求:一、字符串拼成列表
  二、列表本身拼接成列表
  三、字典拼接成列表
  ##练习:将字符串生成列表===>需求一、字符串拼成列表
  In :
  Out: ['a', 'b', 'c', 'x']
  ##练习,列表本身拼成列表===>需求二、列表拼成列表
  In : arr =
  In :
  Out:
  ##上述列表生成式的原生态写法
  In : arr =
  In : new_a = []
  In : for i in arr:
  ...:   if i > 20:
  ...:         new_a.append(i)
  ...: print new_a
  ...:
  
  ##练习:将字典生成列表===>需求三、字符串拼成列表
  #方法一
  In : fields = ['a','b','c']
  In : data = {'a':'abc','b':'bac','c':'cab'}
  In : for x in fields]
  Out: ['abc', 'bac', 'cab']
  ##方法二
  In :
  Out: ['abc', 'cab', 'bac']
  3.3 列表的高级用法
  列表可以用来优雅的拼接mysql语句====>mysql语句的拼接
  #传统SQL语句,死板,更改的话不方便

  In : sql = "select>  In : sql

  Out: 'select>  #进阶拼接,更改fields列表就能拼接获取自己想要的数据
  #通过列表动态拼接MySQL
  fields = ['id','username','email','role']
  sql = "select%s from users" %",".join(fields)
  In : sql = ''
  In : sql = 'select %s from users' % ','.join(fields)
  In : sql

  Out: 'select>  四、字典基础知识
  4.1 字典可以嵌套任意数据类型 && 字典的增删改查
##字典可以嵌套任意数据类型(key值必须唯一)  
In : content = {'name':'test','black':{'phone':11111,'age':22},'colo':[ '22222',33]}
  
In : content
  
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
  

  
#查找key值
  
In : content.keys()
  
Out: ['colo', 'black', 'name']
  

  
##增加值
  
In : content['aa']='ceshi'
  
In : content
  
Out:
  
{'aa': 'ceshi',
  
'black': {'age': 22, 'phone': 11111},
  
'colo': ['22222', 33],
  
'name': 'test'}
  

  
##删除字典值===>字典是无序的不能直接pop(),必须指定值
  
In : content.pop('aa')==>dict.pop(key) 指定key值
  
Out: 'ceshi'
  
In : content
  
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
  

  
##修改值
  
In : content
  
Out: {'black': {'age': 22, 'phone': 11111}, 'colo': ['22222', 33], 'name': 'test'}
  
##第一种
  
In : content['name']='xiugai'
  
#第二种,字典嵌套列表
  
In : content['colo']= 60
  
#第三种,字典嵌套字典
  
In : content['black']['phone'] = 99999
  
#修改完成后的结果
  
In : content
  
Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
  

  
#字典的查==>属性的查找和内容的查找
  
##len(dict)举例查找字典的长度
  
In : d = {'a':'b','c':'d'}
  
In : len(d)
  
Out: 2
  

  
###查字典的keys值
  
In : content.keys()
  
Out: ['colo', 'black', 'name']==>以列表的形式返回
  
##查字典的values值
  
In : content.values()
  
Out: [['22222', 60], {'age': 22, 'phone': 99999}, 'xiugai']=>以列表的形式返回
  
###查字典的键值对
  
In : content.items()
  
Out:
  
[('colo', ['22222', 60]),
  
('black', {'age': 22, 'phone': 99999}),
  
('name', 'xiugai')]===>以列表的形式返回
  4.2 字典高阶查找介绍
  4.2.1 查找key是否存在
  In : content
  Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
  In : content.has_key('black')
  Out: True
  In : content.has_key('ssss')
  Out: False
  4.2.2 高阶字典的取值dict.get()进阶
  具体例子:若取字典中不存在的key的value值时,会报错并终止程序。
  In : content['sss']
  ---------------------------------------------------------------------------
  KeyError                                  Traceback (most recent call last)
   in ()
  ----> 1 content['sss']
  KeyError: 'sss'===>在开发中如果key不存在的话会终止程序。改进
  改进如下:
  In : content.get('asss','None')
  Out: 'None'
  In : content.get('name','None')
  Out: 'xiugai'
  dict.get()进阶
  In : res = content.get('aaaaa','None')
  In : res
  Out: 'None'
  In : not res
  Out: False
  In : if res :
  ...:   print “True”
  ...: else:
  ...:   print "False"
  ...:
  True
  4.2.3 高阶字典的赋值dict.setdefault('KEY','VALUE')
  ####setdefault()函数小练习
  In : d = {'a':'b','c':'d'}
  In : d.setdefault('a','cc')
  Out: 'b'
  In : d.setdefault('f','cc')
  Out: 'cc'
  In : d
  Out: {'a': 'b', 'c': 'd', 'f': 'cc'}
  4.3 详细获取字典中value值中嵌套的数据:
  **====>用isinstance([],list) 来判断是否为列表类型或者type([]) is list【is 结合type使用】
In : content  
Out: {'black': {'age': 22, 'phone': 99999}, 'colo': ['22222', 60], 'name': 'xiugai'}
  
In : 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 :
  
    ...:             print x
  
    ...:   print v
  
    ...:
  
colo: ----------
  
22222
  
60
  
['22222', 60]
  
black: ----------
  
phone 99999
  
age 22
  
{'phone': 99999, 'age': 22}
  
name: ----------
  
xiugai
  

  

  
####判断是否为字符串str,生产中isinstence使用的多
  
In : res = isinstance("hello",str)
  
In : res
  
Out: True
  4.4 字典生成式:字典的高级用法(可以快速翻转字典)
  格式:
  dict( (v,k)for k ,v in d.iteritems())
  dict([(v,k)for k ,v in d.iteritems() ] )
  ###字典生成式小例子
  In : d = {1:2,3:4,5:6,7:8}
  In : print dict( (k ,v) for k ,v in d.iteritems())
  {1: 2, 3: 4, 5: 6, 7: 8}
  In : 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:valuefor (key,value) in interable} #key,value的()可以不写
  ##python2.6版本
  In : print dict( (v ,k) for k ,v in d.iteritems())
  {8: 7, 2: 1, 4: 3, 6: 5}
  #python2.7及其以上版本
  In : {v : k for k ,v in d.items()}
  Out: {2: 1, 4: 3, 6: 5, 8: 7}
  ##拼接的高阶用法===>生产环境中查询多条数据返回的结果
  In : res = [{'id':1,'name':'wd','age':18},{'id':2,'name':'test','age':2
  ...: 8}]
  In : dict((str(x['id']),x['name']) for x in res)
  Out: {'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 : sentence = "I am Bob ! I am a boy ."
  
In : arr = sentence.split(" ")
  
In : res_dict = {}
  
In : for i in arr:
  
    ...:   res_dict = res_dict.get(i,0) + 1===>高阶代码,可以省略四行代码
  
###统计出来单词及其对应的个数
  
In : res_dict
  
Out: {'!': 1, '.': 1, 'Bob': 1, 'I': 2, 'a': 1, 'am': 2, 'boy': 1}
  4.5.2 字典的翻转:以个数为key,单词为value来转反成为新的字典(注意此时key重复的情况)
###具体代码如下:  
In : new = {}
  
In : for k ,v in res_dict.items():
  
    ...:   if v not in new.keys():
  
    ...:         new =
  
    ...:   else :
  
    ...:         new.append(k)
  
In : print new
  
{1: ['!', 'a', 'boy', '.', 'Bob'], 2: ['I', 'am']}
  

  

  
###使用setdefault()函数优化代码
  
In : for k ,v in res_dict.items():
  
    ...:   new.setdefault(v,[])
  
    ...:   new.append(k)
  
    ...:
  
In : new
  
Out: {1: ['!', 'a', 'boy', '.', 'Bob'], 2: ['I', 'am']}
  五、字符串的基础知识
  In : name = "hello"
  In : name.startswith('h')
  Out: True
  In : name.startswith('H')
  Out: False
  ##字符串的格式化   C的风格和 C#风格
  In : print "hello %s " % "xx"##C风格
  hello xx
  In : print "hello {}" .format("wd")###C#风格
  hello wd
  In : 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,list,list)
  高逼格:推荐生产中使用
  '%s'%' ' .join(list)
  字典的格式化:
  In : d = {'name':'aa' ,'age':13}
  In : "i am %(name)s ,my age is %(age)s" %(d)
  Out: 'i am aa ,my age is 13'
  In : "i am {name} ,my age is {age}" .format(**d) ##字典两个*号,列表一个*
  Out: 'i am aa ,my age is 13'
  ####strip函数===>主要用于查找以.py等特定后缀结尾的文件名
  In : st = "   aa   "
  In : st.lstrip()
  Out: 'aa   '
  In : st.rstrip()
  Out: '   aa'
  In : st.strip()
  Out: 'aa'
  ##查找以.py等特定后缀结尾的文件名
  In : a = 'test.py'
  In : a.rstrip(".py")
  Out: 'test'
  5.1小练习:##查找以.py等特定后缀结尾的文件名
  In : result = []
  In : 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 : f = open('/usr/local/src/python/03/01.py')
  In : f.read()
  Out: "l = ['hello',1,3]\nprint ','.join(l)\n"
  In : f.close()
  ###运维的职责主要是读文件筛查日志
  ###增加 write新增一行
  ###writelines 新增多行
  ##查    readreadlines
  ###字符串、列表、字典文件的相互转换
  6.1 文件打开的两种方式
  方法一:f = open() 这种方法必须关闭文件,否则会报错
  方法二:with open() as f: 这个方法代码简洁。会自行关闭文件
  ###代码举例
###方法一代码举例  
In : f = open("01.py")
  
In : print f.read()
  
l = ['hello',1,3]
  
print ','.join(l)
  

  
In : f.close()
  

  
###方法二代码举例
  
In : 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,x) 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:
  
            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 表格中的行。
tr元素包含一个或多个th或td元素。定义HTML 表头。定义HTML 表格单元。  8.2 HTML表单小例子。
  此项操作的目的:(如果是ip统计的话,一个简单的html表单绝对比命令行的awk、sort、uniq等命令筛选让boss看着更为直观)
  统计单词后的结果为res_dict = {'!': 1, '.': 1, 'Bob': 1, 'I': 2, 'a': 1, 'am': 2, 'boy': 1}。将所有单词以及次数从大到小写入在网页文件中。
  ##代码如下
# 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.append(k)
  

  
print new
  
#keys = max(new)
  
#print "%s----> %s" %(keys,new)
  

  

  
##HTML标签,定义表格,定义表格中的一行,包含一个或者多个或者标签
  
f = open('tongji.html',"w+")
  
str = "timesword"
  
while True:
  keys = max(new)    ##通过max()函数取得key中最大值,并遍历其value
  for i in new:
  str += "%s%s" %(keys,i)
  new.pop(keys)      ####遍历完key的最大值后去掉,以便下一次取得最大值仍未重复
  if len(new) == 0 :
  break
  

  
str += "\n"
  

  
f.write(str)
  

  
f.close()
  ##最终tongji.html的效果图如下:

  8.3 文件读取的扩展
  如果10G以上的大文件日志分析,如果一次读取文件全部内容会导致电脑超负载的,此时正确的读取文件访问为偏移量的读取方式(仅为方案,等自己有空研究后在更新)。
  f.read()===>一次读取几个字符
  f.seek()===>一般使用f.seek(0)回到文档开始处
  f.tell()===>告知所处的游标


页: [1]
查看完整版本: 从零开始学Python-day4