Python进阶技巧汇总01

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Python进阶技巧汇总01的主要内容,如果未能解决你的问题,请参考以下文章

Atom编辑器入门到精通 Atom使用进阶

Atom编辑器入门到精通 Atom使用进阶

恶意代码分析技巧-汇总

Atom编辑器入门到精通 Atom使用进阶

新手程序员进阶必学,Python常用模块及用法汇总(内容较干建议收藏)

1Python进阶强化训练之装饰器使用技巧进阶