值得收藏,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之不要红头文件(1)
Sep 28 Python
使用Python下的XSLT API进行web开发的简单教程
Apr 15 Python
解析Python中while true的使用
Oct 13 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
对python中的logger模块全面讲解
Apr 28 Python
深入浅析python 中的匿名函数
May 21 Python
Python Pandas数据结构简单介绍
Jul 03 Python
python保存字典和读取字典的实例代码
Jul 07 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
python实现邮件循环自动发件功能
Sep 11 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 discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
javascript 写类方式之七
2009/07/05 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
D3.js实现雷达图的方法详解
2016/09/22 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
详解Python如何获取列表(List)的中位数
2016/08/12 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
Python 从相对路径下import的方法
2018/12/04 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
python实现列表的排序方法分享
2019/07/01 Python
python3获取当前目录的实现方法
2019/07/29 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python中的整除和取模实例
2020/06/03 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
24岁生日感言
2014/01/13 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2016银行招聘自荐信
2016/01/28 职场文书