值得收藏,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获得两个数组交集、并集、差集的方法
Mar 27 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
在windows系统中实现python3安装lxml
Mar 23 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python自定义一个异常类的方法
Jun 27 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
Django密码系统实现过程详解
Jul 19 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
Python程序暂停的正常处理方法
Nov 07 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
Python通过Schema实现数据验证方式
Nov 12 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
杏林同学录(三)
2006/10/09 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
php多文件上传实现代码
2014/02/20 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
营销主管自我评价怎么写
2013/09/19 职场文书
高三自我鉴定
2013/10/23 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
化工专业自荐书
2014/06/16 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
公司周年庆寄语
2019/06/21 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书