值得收藏,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的Flask开发框架简单上手笔记
Nov 16 Python
Python装饰器基础详解
Mar 09 Python
学习python类方法与对象方法
Mar 15 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
python素数筛选法浅析
Mar 19 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
Python创建字典的八种方式
Feb 27 Python
详解python算法常用技巧与内置库
Oct 17 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 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中iconv函数使用方法
2008/05/24 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
python中pygame模块用法实例
2014/10/09 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
django项目中使用手机号登录的实例代码
2019/08/15 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
python实现画图工具
2020/08/27 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
美国糖果店:Sugarfina
2019/02/21 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
办加油卡单位介绍信
2014/01/09 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
农业项目建议书
2014/08/25 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
微信小程序实现轮播图指示器
2022/06/25 Javascript