zoukankan      html  css  js  c++  java
  • Python进阶技巧汇总01

    总结自原创: Leoxin 菜鸟学Python

    原文地址:强烈推荐|麻烦刚关注2699名小伙伴一定要看,信息量太大

    1 字符串

    • 字符串的format格式一般有两种操作:

    (1)使用%操作符

    name = "zhang"
    age =20
    print("Your name is %s,age is %d %(name,age)")
    

    (2)使用.format

    name = "zhang"
    age =20
    print("Your name is {0},age is {1}.format(name,age)")
    # .format的用法比较灵活,参数的顺序和格式化的顺序不必完全相同,推荐使用
    
    • 常用的文本处理7招

    (1)字符串的连接和合并

    # 简单连接用+号
    new_str = str1 + str2
    # 合并用join方法
    url = ["www","python","org"]
    print(".".join(url))
    >>>www.python.org
    

    (2)字符串的切片和相乘

    # 相乘,类似数学计算
    line='*'*30
    print(line)
    >>>******************************
    # 切片,类似列表操作
    str = "Monday"
    str[0:3]
    >>>Mon
    

    (3)字符串的分割

    # 简单分割用split(),但不支持多个分割
    phone = 400-800-123
    print(phone.split("-"))
    >>>["400","800","123"]
    
    # 复杂分割用正则表达式和r表示不转义
    line = "hello world;  python,  I  ,like,     it"
    # 处理这种分隔符不一致的字符串,操作如下
    import re
    print(re.split(r'[;,s]s*',line))
    >>>["hello world","python","I","like","it"]
    

    (4)字符串的开头和结尾处理

    # 查一个文件的名字是以什么开头或者结尾的
    file_name = 'trace.h'
    print(file_name.endswith('h'))
    >>>True
    print(file_name.startswith('trace'))
    >>>True
    

    (5)字符串的查找和匹配

    # 一般查找,返回子字符串所在位置的索引,若找不到返回-1
    title = "what the fox say? ding ding ding~"
    print(title.find("fox"))
    >>>10
    
    # 复杂的匹配,又要用到正则表达式
    mydate = "19/12/2018"
    import re
    if re.match(r"d+/d+/d+",mydate):
        print("ok,match")
    else:
        print("ok,not match")
    >>>ok,match
    

    (6)字符串的替换

    # 普通替换用replace()
    text = "i like running"
    print(text.replace("running","swimming"))
    >>>i like swimming
    
    # 复杂的替换用re模块的sub函数
    student = "boy 103 , girl 105"
    print(re.sub(r'd+','100',student))
    >>>boy 100 ,girl 100
    

    (7)字符串中去掉一些字符

    # 去掉文本两侧的空格
    line = "  i like you   "
    print(line.strip())
    >>>i like you
    
    # 复杂的文本清理,用str.translate,先构建一个转换表,table是一个翻译表,表示把't''o'转成大写的'T' 'O',然后在old_str里面去掉'12345',然后剩下的字符串再经过table翻译
    import string
    instr = "to"
    outstr = "TO"
    table = string.maketrans(instr,outstr)
    old_str = "Hello world,welcome to use Python. 123456"
    new_str = old_str.translate(table,"12345")
    print(new_str)
    >>>Hello world,welcome to use Python. 6
    

    2 列表、字典

    • 列表

    (1)支持*,+操作

    list1 = [1,2,3]
    list2 = [10,20,30]
    list3 = list1 + list2
    print(list3)
    >>>[1, 2, 3, 10, 20, 30]
    
    list4 = ['a','b','c']
    list5 = list4 * 3
    print(list5)
    >>>['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
    

    (2)扩展,用内置函数extend()

    list = [1,2,3]
    b = [4,5,6]
    list.extend(b)
    print(list)
    >>>[1, 2, 3, 4, 5, 6]
    # extend()与+的区别在于,前者直接修改列表,后者返回一个新的列表
    

    (3)查找列表中某个元素的索引,用内置函数index()

    list = ["i","am","a","dog"]
    print(list.index('a'))
    >>>3
    

    (4)统计某个元素在列表的次数,用内置函数count()

    list=['to','do','or','not','to','do']
    print(list.count('to'))
    >>>2
    

    (5)让列表中的元素存在就返回,不存在就返回默认值

    def list_get(list,i,value=None):
        # 列表下标的负数范围是[-len,len)
        if -len(list) <= i <len(list):
            return list[i]
        else:
            return value
    print(list_get([1,2,3],5,10))
    >>>10
    

    (6)循环访问序列中的元素和索引

    # 将元素10改为3
    list = [1,2,10,4]
    for index ,item in enumerate(list): 
        # print(list(enumerate(list)))  >>>[(0, 1), (1, 2), (2, 10), (3, 4)]
        if item > 9:
            list[index] = 3
    
    • 字典

    (1)根据key或value排序,用内置函数sorted()

    my_dict={"cc":100,"aa":200,"bb":10}
    # 按照key排序
    print(sorted(my_dict.items(),key=lambda x:x[0]))
    >>>[('aa', 200), ('bb', 10), ('cc', 100)]
    # 表示按照value排序
    print(sorted(my_dict.items(),key=lambda x:x[1]))
    >>>[('bb', 10), ('cc', 100), ('aa', 200)]
    # 注意,my_dict本身顺序没有变,排序返回了一个新的字典
    

    (2)让字典一开始就按添加顺序进行有序排列(比如读取CSV文件),用collection模块的OrderedDict()函数

    from collections import OrderedDict
    orderDict = OrderedDict()
    orderDict['a'] = 1
    orderDict['b'] = 2
    orderDict['c'] = 3
    print(orderDict)
    >>>OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    # OrderedDict()虽然是好东西,但是它内部维护了一个双向链表,若数据量很大的话,会非常消耗内存
    

    (3)字典的取值

    # 一般取值用dict[key],但当取值不在时会引起异常,不符合代码健壮的要求
    dic = {"a":10,"b":20,"c":30}
    print(dic.get("d"))
    # 当键值不存在时,会返回None,而不是异常
    # 另外一个用法是dict.get(key,somethingelse)
    print(dic.get("d","Not found"))
    >>>Not found
    # 建议尽量用dict.get()来代替dict[key]
    

    (4)字典中提取部分子集、大写合并、键值互换,用字典推导式

    dic_01 = {"a":80,"b":91,"c":100,"d":70}
    # 提取分数超过90分的信息,形成一个新的字典
    good_score = {name:score for name,score in dic.items() if score>90}
    
    # 大小写key合并
    dic_02 = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    new_dic = {
        k.lower(): dic_02.get(k.lower(), 0) + dic_02.get(k.upper(), 0)
        for k in dic_02.keys()
        if k.lower() in ['a','b']
    }
    print(new_dic)
    # Output: {'a': 17, 'b': 34}
    
    # 以字符串为键,其索引为值,建立字典
    strings = ["jim","paul","peter","jessca"]
    dic_01 = {key:value for value,key in enumerate(strings)}
    # 以字符串为键,其长度为值,建立
    dic_02 = {k:len(k) for k in strings}
    print(dic_01)
    print(dic_02)
    
    # Output
    {'jim': 0, 'paul': 1, 'peter': 2, 'jessca': 3}
    {'jim': 3, 'paul': 4, 'peter': 5, 'jessca': 6}
    
    # 键值互换
    dict = {'a': 10, 'b': 34}
    new_dict = {v:k for k, v in dict.items()}
    print(new_dict)
    # Output: {10: 'a', 34: 'b'}
    
    # 或者,利用内置函数zip()进行翻转处理
    new_dict = zip(dict.values(),dict.keys())
    print(list(new_dict))
    # Output: [(25.6, 'a'), (32.3, 'b'), (299.5, 'c'), (18.6, 'd')]
    # 注意,此处的new_dict返回的是一个对象,不能直接打印
    
    # 最后,若碰到数据量较大的字典,最好用Python标准库里的itertools模块(非常实用)
    from itertools import izip
    new_dict = izip(dict.values(),dict.keys())
    print(invert_stocks2)
    

    (5)字典的计算

    # 假设字典中记录了股票价格,希望获得最高和最低股价的股票
    stocks = {'a':25.6,'b':32.3,'c':299.5,'d':18.6}
    print(min(stocks.values))
    print(max(stocks.values))
    

    (6)字典的缺省值

    aDict={}.fromkeys(('aa','bb','cc'),100)
    for k,v in aDict.items():
       print(k,v)
    >>>
    aa 100
    cc 100
    bb 100
    

    (7)字典的更新

    aInfo={'Wang':3000,'NiuYun':2000,'Lin':4500,'Tianqi':8000}
    bInfo={'Wang':4000,'NiuYun':8000,'Ming':3300}
    aInfo.update(bInfo)
    print(aInfo)
    >>>{'Wang': 4000, 'Tianqi': 8000, 'Lin': 4500, 'NiuYun': 8000, 'Ming': 3300}
    

    3、新手坑

    • Python3中==is的区别:is判断两个对象是否为同一对象,是通过id来判断的;当两个基本类型数据(或元组)内容相同时,id会相同,但并不代表a会随b的改变而改变,==判断两个对象的内容是否相同, 是通过调用eq()来判断的
    • 连接字符串特别是大规模的字符串,最好用join而不是+
    # 用+连接字符串:
    str1,str2,str3 = 'test','string','connection'
    print(str1+str2+str3)
    # 用join连接字符串
    str1,str2,str3 = 'test','string','connection'
    print(''.join([str1,str2,str3]))
    >>>teststringconnection
    # Python中的字符串与其他的语言有一点不同,它是不可变对象,一旦创建不能改变,而这个特性直接会影响到Python中字符串连接的效率。因为若要连接字符串:S1+S2+S3+....+SN,由于字符串是不可变的对象,执行一次就要申请一块新的内存,这样的话在N个字符串连接的过程中,会产生N-1个中间结果,每产生一个中间结果就要申请一次内存,这样会严重影响执行效率。而join不一样,它是一次性申请总的内存,然后把字符串里面的每一个元素复制到内存中去,所以join会快很多.
    
    • 不要在for和while循环后面写else块
    for i in range(3):
    	print('Loop %d'%i)
    else:
    	print('Else block')
    >>>Loop 0
    >>>Loop 1
    >>>Loop 2
    >>>Else block
    # 以上的else块会在整个循环执行完之后立刻运行。刚接触Python的程序员可能会把for/else结构中的else 块理解为:如果循环没有正常执行完,那就执行else块,实际上刚好相反。在循环里用break语句提前跳出,会导致程序不执行else块。
    

    参考文章:

    1、正则表达式 - 教程

    原文地址:http://www.runoob.com/regexp/regexp-tutorial.html

  • 相关阅读:
    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit. C#.net clr 2.0  4.0新特性
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit.通过null 参数 反射  动态反推方法调用
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit..net clr il指令集 以及指令分类  与指令详细说明
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
    Atitit.跨语言反射api 兼容性提升与增强 java c#。Net  php  js
  • 原文地址:https://www.cnblogs.com/luowei2018/p/10152643.html
Copyright © 2011-2022 走看看