值得收藏,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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
Python标准库之循环器(itertools)介绍
Nov 25 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python发展史及网络爬虫
Jun 19 Python
python库matplotlib绘制坐标图
Oct 18 Python
Python pandas对excel的操作实现示例
Jul 21 Python
常用的10个Python实用小技巧
Aug 10 Python
python神经网络学习 使用Keras进行简单分类
May 04 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
js获取单选按钮的数据
2006/11/27 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
jQuery实现搜索页面关键字的功能
2017/02/16 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
Python多线程下载文件的方法
2015/07/10 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python如何计算语句执行时间
2019/11/22 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
python开发入门——set的使用
2020/09/03 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
自行车租赁公司创业计划书
2014/01/28 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Ajax实现三级联动效果
2021/10/05 Javascript