值得收藏,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 20 Python
python实现壁纸批量下载代码实例
Jan 25 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
如何通过Python实现标签云算法
Jul 02 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
Django框架配置mysql数据库实现过程
Apr 22 Python
python从ftp获取文件并下载到本地
Dec 05 Python
Python字符串格式化方式
Apr 07 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/02 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
深入浅析python 中的self和cls的区别
2020/06/20 Python
python怎么判断素数
2020/07/01 Python
新闻记者实习自我鉴定
2013/09/19 职场文书
三万活动总结
2014/04/28 职场文书
社会实践活动总结报告
2014/04/29 职场文书
群众路线剖析材料
2014/09/30 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
心得体会格式及范文
2016/01/25 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python