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块。