• 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

  • 相关阅读:
    通过actionlib控制jaco机械臂
    actionlib学习
    配置 jaco机械臂 ros环境
    ubuntu14.04标题栏显示上下网速
    linux下alsa架构音频驱动播放wav格式文件
    ros语音交互(五)移植科大讯飞语音识别到ros
    ubuntu14.04 wifi驱动
    Ubuntu14.04使用apt-fast来加快apt-get下载的教程
    ROS语音交互(四)接入图灵语义理解
    相比传统游戏,区块链游戏的价值在哪里?
  • 原文地址:https://www.cnblogs.com/luowei2018/p/10152643.html
Copyright © 2020-2023  润新知