我的python学习--第三天

发布时间:2019-08-06 09:14:09编辑:auto阅读(1335)

    第三天

      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[0]                                    #方法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[0] = 'watermelon'                         #通过索引修改
    >>> shoplist
    ['watermelon', 'mango', 'carrot']

     1.4、查

    >>> num = [1,2,3,4,5,2]
    >>> 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循环后面可以是任何方式的迭代器(元组,列表,生成器..),只要可迭代对象的元素中至少有一个值.

    >>> [x for x in 'abcd']                                #单循环列表生成式
    ['a', 'b', 'c', 'd']
    >>> l = range(10,15)
    >>> l
    [10, 11, 12, 13, 14]
    >>> [x for x in l if x > 12]                           #带if判断的单循环列表生成式
    [13, 14]
    >>> [m+n for m in 'abc' for n in 'ABC']                #双循环列表生成式
    ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC'] 
    >>> A = ['HELLO','WORLD','APPLE']                      #大小写转换
    >>> [x.lower() for x in A]
    ['hello', 'world', 'apple']
    >>> d = {'name':'Alice','age':20,'gender':'F'}         #迭代字典生成列表
    >>> field = [k for k in d.keys()]
    >>> value = [v for v in d.values()]
    >>> 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[0],msg[1])                             # 方法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 = '  aaabb  cc   '
    >>> string.strip()
    'aaabb  cc'
    >>> string.rstrip()
    '  aaabb  cc'
    >>> string.lstrip()
    'aaabb  cc   '
    >>> 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[word] += 1
        else:
            d[word] = 1
    print d
    
    d2 = {}                                                #将k,v互换,为num:list(word)格式
    for word,count in d.items():
        d2.setdefault(count,[])
        d2[count].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(':')[0]            #获取用户名和密码
        passwd = user.strip('\n').split(':')[1]
    
        d[name] = 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[name]:
            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(' ')[0]
            l.append(ipaddr)
    #print l
    
    #从列表转化为字典
    for ipaddr in l:
        if ipaddr in d:
            d[ipaddr] += 1
        else:
            d[ipaddr] = 1
    
    d2 = {}        
    for k,v in d.items():
        d2.setdefault(v,[])
        d2[v].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[key])):
            f.write('<tr><td style="border:solid 1px">%s</td><td style="border:solid 1px">%s</td></tr>' % (key,d2[key][index]))
        num = len(d2[key])
        d2.pop(key)
        count = count + num
    f.write("</table></html>")
    f.close()


    html文件效果图:

    wKiom1eN3CnArgDsAAARhGZG63c964.png


关键字