值得收藏,Python 开发中的高级技巧


Posted in Python onNovember 23, 2018

Python 开发中有哪些高级技巧?这是知乎上一个问题,我总结了一些常见的技巧在这里,可能谈不上多高级,但掌握这些至少可以让你的代码看起来 Pythonic 一点。如果你还在按照类C语言的那套风格来写的话,在 code review 恐怕会要被吐槽了。

列表推导式

>>> chars = [ c for c in 'python' ]
>>> chars
['p', 'y', 't', 'h', 'o', 'n']

字典推导式

>>> dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> double_dict1 = {k:v*2 for (k,v) in dict1.items()}
>>> double_dict1
{'a': 2, 'b': 4, 'c': 6, 'd': 8, 'e': 10}

集合推导式

>>> set1 = {1,2,3,4}
>>> double_set = {i*2 for i in set1}
>>> double_set
{8, 2, 4, 6}

合并字典

>>> x = {'a':1,'b':2}
>>> y = {'c':3, 'd':4}
>>> z = {**x, **y}
>>> z
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

复制列表

>>> nums = [1,2,3]
>>> nums[::]
[1, 2, 3]
>>> copy_nums = nums[::]
>>> copy_nums
[1, 2, 3]

反转列表

>>> reverse_nums = nums[::-1]
>>> reverse_nums
[3, 2, 1]
 PACKING / UNPACKING

变量交换

>>> a,b = 1, 2
>>> a ,b = b,a
>>> a
2
>>> b
1

高级拆包

>>> a, *b = 1,2,3
>>> a
1
>>> b
[2, 3]

或者

>>> a, *b, c = 1,2,3,4,5
>>> a
1
>>> b
[2, 3, 4]
>>> c
5

函数返回多个值(其实是自动packing成元组)然后unpacking赋值给4个变量

>>> def f():
...   return 1, 2, 3, 4
...
>>> a, b, c, d = f()
>>> a
1
>>> d
4

列表合并成字符串

>>> " ".join(["I", "Love", "Python"])
'I Love Python'

链式比较

>>> if a > 2 and a < 5:
...   pass
...
>>> if 2<a<5:
...   pass
yield from
# 没有使用 field from
def dup(n):
  for i in range(n):
    yield i
    yield i
# 使用yield from
def dup(n):
  for i in range(n):
  yield from [i, i]
for i in dup(3):
  print(i)
>>>
0
0
1
1
2
2

in 代替 or

>>> if x == 1 or x == 2 or x == 3:
...   pass
...
>>> if x in (1,2,3):
...   pass

字典代替多个if else

def fun(x):
  if x == 'a':
    return 1
  elif x == 'b':
    return 2
  else:
    return None
def fun(x):
  return {"a": 1, "b": 2}.get(x)

有下标索引的枚举

>>> for i, e in enumerate(["a","b","c"]):
...   print(i, e)
...
0 a
1 b
2 c

生成器

注意区分列表推导式,生成器效率更高

>>> g = (i**2 for i in range(5))
>>> g
<generator object <genexpr> at 0x10881e518>
>>> for i in g:
...   print(i)
...
0
1
4
9
16

默认字典 defaultdict

>>> d = dict()
>>> d['nums']
KeyError: 'nums'
>>>
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d["nums"]
[]

字符串格式化

>>> lang = 'python'
>>> f'{lang} is most popular language in the world'
'python is most popular language in the world'

列表中出现次数最多的元素

>>> nums = [1,2,3,3]
>>> max(set(nums), key=nums.count)
3

或者

from collections import Counter
>>> Counter(nums).most_common()[0][0]
3

读写文件

>>> with open("test.txt", "w") as f:
...   f.writelines("hello")

判断对象类型,可指定多个类型

>>> isinstance(a, (int, str))
True

类似的还有字符串的 startswith,endswith

>>> "http://foofish.net".startswith(('http','https'))
True
>>> "https://foofish.net".startswith(('http','https'))
True
__str__ 与 __repr__ 区别
>>> str(datetime.now())
'2018-11-20 00:31:54.839605'
>>> repr(datetime.now())
'datetime.datetime(2018, 11, 20, 0, 32, 0, 579521)'

前者对人友好,可读性更强,后者对计算机友好,支持 obj == eval(repr(obj))

使用装饰器

def makebold(f):
return lambda: "<b>" + f() + "</b>"
def makeitalic(f):
return lambda: "<i>" + f() + "</i>"
@makebold
@makeitalic
def say():
return "Hello"
>>> say()
<b><i>Hello</i></b>

不使用装饰器,可读性非常差

def say():
return "Hello"
>>> makebold(makeitalic(say))()
<b><i>Hello</i></b>

总结

以上所述是小编给大家介绍的Python 开发中的高级技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python中p-value的实现方式
Dec 16 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
Pytorch实验常用代码段汇总
Nov 19 Python
matlab xlabel位置的设置方式
May 21 Python
python 常见字符串与函数的用法详解
Nov 23 #Python
django+mysql的使用示例
Nov 23 #Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 #Python
Windows下Python3.6安装第三方模块的方法
Nov 22 #Python
Python第三方Window模块文件的几种安装方法
Nov 22 #Python
python实现归并排序算法
Nov 22 #Python
Python的iOS自动化打包实例代码
Nov 22 #Python
You might like
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
PHP分享图片的生成方法
2018/04/25 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
Python列表生成器的循环技巧分享
2015/03/06 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
Python iter()函数用法实例分析
2018/03/17 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
2015年人事工作总结范文
2015/04/09 职场文书
整改通知书
2015/04/20 职场文书
校友会致辞
2015/07/30 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
python使用BeautifulSoup 解析HTML
2022/04/24 Python