值得收藏,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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
python 实现在Excel末尾增加新行
May 02 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
浅谈pytorch和Numpy的区别以及相互转换方法
Jul 26 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
我就是这样学习Python中的列表
Jun 02 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
python写一个随机点名软件的实例
Nov 28 Python
Python中关于logging模块的学习笔记
Jun 03 Python
详解pandas apply 并行处理的几种方法
Feb 24 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
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
javascript string字符串优化问题
2011/07/31 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
Puppet的一些技巧
2018/09/17 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
深入理解Python中的元类(metaclass)
2015/02/14 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
django中静态文件配置static的方法
2018/05/20 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Django操作session 的方法
2020/03/09 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
大学军训感想
2014/02/12 职场文书
525心理活动总结
2014/07/04 职场文书
基层党员对照检查材料
2014/08/25 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
法院个人总结
2015/03/03 职场文书
求职简历自我评价范文
2015/03/10 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL