值得收藏,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使用chardet判断字符串编码的方法
Mar 13 Python
详解Python装饰器由浅入深
Dec 09 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python设置环境变量的作用和实例
Jul 09 Python
python 数据提取及拆分的实现代码
Aug 26 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
python读取Excel表格文件的方法
Sep 02 Python
Python实现钉钉订阅消息功能
Jan 14 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
python包的导入方式总结
Mar 02 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/17 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jQuery对html元素取值与赋值的方法
2013/11/20 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python验证码识别处理实例
2015/12/28 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python语言的变量认识及操作方法
2018/02/11 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
简历的自荐信
2013/12/19 职场文书
关于安全的演讲稿
2014/05/09 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers