设为首页 收藏本站
查看: 1188|回复: 0

[经验分享] 从零开始学Python-day4

[复制链接]

尚未签到

发表于 2018-8-16 08:59:07 | 显示全部楼层 |阅读模式
  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>  In [47]: sql

  Out[47]: 'select>  #进阶拼接,更改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>  四、字典基础知识
  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)
   in ()
  ----> 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 = 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 表格中的行。
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}。将所有单词以及次数从大到小写入在网页文件中。
  ##代码如下
[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标签,定义表格,定义表格中的一行,包含一个或者多个或者标签
  
f = open('tongji.html',"w+")
  
str = "timesword"
  
while True:
  keys = max(new)    ##通过max()函数取得key中最大值,并遍历其value
  for i in new[keys]:
  str += "%s%s" %(keys,i)
  new.pop(keys)        ####遍历完key的最大值后去掉,以便下一次取得最大值仍未重复
  if len(new) == 0 :
  break
  

  
str += "\n"
  

  
f.write(str)
  

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

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-552455-1-1.html 上篇帖子: Python学习day3作业 下篇帖子: python小实战之分配ip-11931192
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表