值得收藏,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 ZipFile模块详解
Nov 01 Python
Python中的getopt函数使用详解
Jul 28 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
用python处理MS Word的实例讲解
May 08 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python post请求实现代码实例
Feb 28 Python
python中time tzset()函数实例用法
Feb 18 Python
Python3 如何开启自带http服务
May 18 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
详解vue后台系统登录态管理
2019/04/02 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Python实现基于POS算法的区块链
2018/08/07 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
对python中的高效迭代器函数详解
2018/10/18 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
人力资源主管职责范本
2014/03/05 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2014财务年终工作总结
2014/12/08 职场文书
三下乡个人总结
2015/03/04 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL