本文分享一些 Python 技巧,它可以让你的代码更简洁、更高效。
1.列表推导式
li = [x for x in range(10) if x % 2 == 0] print(li) # [0, 2, 4, 6, 8] li = [i*2 if i%2==0 else i*3 for i in range(10)] print(li) # [0, 3, 4, 9, 8, 15, 12, 21, 16, 27] # 应用:将字典{'x': 'A', 'y': 'B', 'z': 'C'}通过推导式转换为:['x=A', 'y=B', 'z=C'] dic = {'x': 'A', 'y': 'B', 'z': 'C'} res4 = ["{}={}".format(k, v) for k, v in dic.items()] print(res4)
2.字典推导式
# 将{'py': "python09", 'java': "java09"}转换为: {'python09': "py", 'java09': "java"} dic = {'py': "python09", 'java': "java09"} res = {v: k for k, v in dic.items()} print(res) # {'python09': 'py', 'java09': 'java'}
3.集合推导式
set = {x for x in 'abcdefg'} print(set) # {'f', 'g', 'd', 'b', 'c', 'e', 'a'}
4.生成器(注意没有元组推导式)
g = (x for x in range(100)) print(g) # <generator object <genexpr> at 0x00000185B0D94E40>
5.翻转
a = 'abcdefg' 方法1: "".join(reversed(list(a))) 或者 b= list(a) b.reverse() "".join(b) 方法2: s='' for i in a: s = i+s 方法3: a[::-1] 方法4: def func(x): if len(x)<=1: return x return func(x[1:]) + x[0] 方法5: a = [1, 2, 4, 6, 8] lenth = len(a) for i in range(len(a)//2): a[i], a[lenth-1-i] = a[lenth-1-i], a[i]
6.排序
一、内建函数sorted,返回None sorted(data) 二、sort()方法 data.sort(key=lambda element: (-element['price'], element['id']) # 先按price倒序排,再按id排
7.列表转字典
mydict = ["John", "Peter", "Mathew", "Tom"] mydict = dict(enumerate(mydict)) print(mydict) # {0: 'John', 1: 'Peter', 2: 'Mathew', 3: 'Tom'}
8.合并字典
# 在一行中合并字典 d1 = { 'A': 1, 'B': 2 } d2 = { 'C': 3, 'D': 4 } #方法 1 d1.update(d2) print(d1) # {'A': 1, 'B': 2, 'C': 3, 'D': 4} #方法 2 d3 = {**d1, **d2} print(d3) # {'A': 1, 'B': 2, 'C': 3, 'D': 4}
9.一行函数
fun = lambda x : x % 2 == 0 print(fun(2)) # True print(fun(3)) # False
10.可迭代对象(Iterable)
分类:
1.str,list,tuple,range
2.open的文件对象
3.实现了序列语义的对象,__getitem__()
4.实现了迭代协议的对象,__iter__()
简言之,就是可以for循环的对象
class MyList: def __init__(self, seq=()): self.items = seq def __getitem__(self, index): return self.items[index] def __iter__(self): for item in self.items: yield item s = MyList((1, 2, 3)) for i in s: print(i)
11.迭代器
实现了迭代器协议(__iter__(),__next__())的对象
class MyList: def __init__(self, seq=()): self.items = seq self.num=0 def __getitem__(self, index): return self.items[index] def __iter__(self): return self def __next__(self): if self.num<len(self.items): ret = self.items[self.num] self.num +=1 return ret else: raise StopIteration s = MyList((1, 2, 3)) print(next(s)) print(next(s)) print(next(s))
12.生成器
一个特殊的迭代器,实际中常用
分类: 1.生成器表达式 2.含有yield的函数(yield可以在函数内任意位置,执行到它即返回一个值,并暂停程序,下次取值从这继续) 优点:节省内存(因为存的是地址,使用的时候才真正计算出值)
13.使用集合从两个列表中获得差异
list1 = [1,2,3,4,5] list2 = [3,4,5] print(list(set(list1) — set(list2))) # [1,2] {1,2} print(set(lista1).difference(set(lista2))) # [1,2] {1,2}
14.counter计数
from collections import Counter nums = [1, 2, 3, 4, 5, 4, 5, 7, 4, 5, 4, 2] count = Counter(nums) # Counter({4: 4, 5: 3, 2: 2, 1: 1, 3: 1, 7: 1}) print(count) res = count.most_common(2) # 返回出现次数最多的两个数及其出现的次数 print(res) # [(4, 4), (5, 3)]
15.循环嵌套的简写
list1 = range(1, 3) list2 = range(4, 6) list3 = range(7, 9) for item1 in list1: for item2 in list2: for item3 in list3: print(item1 + item2 + item3) # 简写方式 from itertools import product for item1,item2,item3 in product(list1, list2, list3): print(item1+item2+item3)
16.赋值
# 值互换 a = 1 b = 2 a, b = b, a print(a, b) # 2,1 x, y, z = [1, 2, 3] print(x, y, z) # 1,2,3 x, y, z = 1, 2, 3 print(x, y, z) # 1,2,3
17.比较运算符的连接
n = 10 result = 1 < n < 20 print(result) # True result = 1 > n <= 9 print(result) # False
18.条件语句的各种写法
m=1 print(any([m==1 ,m==3 ,m==5 ,m==7])) print(m==1 or m==3 or m==5 or m==7) print(m in [1,3,5,7])
19.上下文管理器
上下文管理器:举例:使用with打开文件后不用额外手动关闭文件
正常情况下,连接mysql使用完毕后需要手动close断连,以下代码中MyMysql实现了上下文管理器协议(__enter__(),__exit__()),使用with打开后不要手动close了。
import pymysql class MyMysql: def __init__(self): self.cursor = None def __enter__(self): conn = pymysql.connect(host='46.90.70.100', # host属性 port=3306, # 端口号 user='root', # 用户名 password='xxxxx', # 此处填登录数据库的密码 db='gao', # 数据库名 charset="utf8") self.cursor = conn.cursor() return self.cursor def __exit__(self, exc_type, exc_val, exc_tb): self.cursor.close() with MyMysql() as m: m.execute('select * from Persons') res = m.fetchall() print(res) m.execute('select * from Persons')
20.检查两个字符串是不是由相同字母不同顺序组成
from collections import Counter print(Counter(s1) == Counter(s2))