符合语言习惯的 Python 优雅编程技巧

640?wx_fmt=gif


Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。

0. 程序必须先让人读懂,然后才能让计算机执行。

“Programs must be written for people to read, and only incidentally for machines to execute.”

1. 交换赋值

##不推荐
temp = a
a = b
b = a  

##推荐
a, b = b, a  #  先生成一个元组(tuple)对象,然后unpack

2. Unpacking

##不推荐
l = ['David''Pythonista''+1-514-555-1234']
first_name = l[0]
last_name = l[1]
phone_number = l[2]  

##推荐
l = ['David''Pythonista''+1-514-555-1234']
first_name, last_name, phone_number = l
# Python 3 Only
first, *middle, last = another_list

3. 使用操作符in

##不推荐
if fruit == "apple" or fruit == "orange" or fruit == "berry":
    # 多次判断  

##推荐
if fruit in ["apple""orange""berry"]:
    # 使用 in 更加简洁

4. 字符串操作

##不推荐
colors = ['red''blue''green''yellow']

result = ''
for s in colors:
    result += s  #  每次赋值都丢弃以前的字符串对象, 生成一个新对象  

##推荐
colors = ['red''blue''green''yellow']
result = ''.join(colors)  #  没有额外的内存分配

5. 字典键值列表

##不推荐
for key in my_dict.keys():
    #  my_dict[key] ...  

##推荐
for key in my_dict:
    #  my_dict[key] ...

# 只有当循环中需要更改key值的情况下,我们需要使用 my_dict.keys()
# 生成静态的键值列表。

6. 字典键值判断

##不推荐
if my_dict.has_key(key):
    # ...do something with d[key]  

##推荐
if key in my_dict:
    # ...do something with d[key]

7. 字典 get 和 setdefault 方法

##不推荐
navs = {}
for (portfolio, equity, position) in data:
    if portfolio not in navs:
            navs[portfolio] = 0
    navs[portfolio] += position * prices[equity]
##推荐
navs = {}
for (portfolio, equity, position) in data:
    # 使用 get 方法
    navs[portfolio] = navs.get(portfolio, 0) + position * prices[equity]
    # 或者使用 setdefault 方法
    navs.setdefault(portfolio, 0)
    navs[portfolio] += position * prices[equity]

8. 判断真伪

##不推荐
if x == True:
    # ....
if len(items) != 0:
    # ...
if items != []:
    # ...  

##推荐
if x:
    # ....
if items:
    # ...

9. 遍历列表以及索引

##不推荐
items = 'zero one two three'.split()
# method 1
i = 0
for item in items:
    print i, item
    i += 1
# method 2
for i in range(len(items)):
    print i, items[i]

##推荐
items = 'zero one two three'.split()
for i, item in enumerate(items):
    print i, item

10. 列表推导

##不推荐
new_list = []
for item in a_list:
    if condition(item):
        new_list.append(fn(item))  

##推荐
new_list = [fn(item) for item in a_list if condition(item)]

11. 列表推导-嵌套

##不推荐
for sub_list in nested_list:
    if list_condition(sub_list):
        for item in sub_list:
            if item_condition(item):
                # do something...  
##推荐
gen = (item for sl in nested_list if list_condition(sl) \
            for item in sl if item_condition(item))
for item in gen:
    # do something...

12. 循环嵌套

##不推荐
for x in x_list:
    for y in y_list:
        for z in z_list:
            # do something for x & y  

##推荐
from itertools import product
for x, y, z in product(x_list, y_list, z_list):
    # do something for x, y, z

13. 尽量使用生成器代替列表

##不推荐
def my_range(n):
    i = 0
    result = []
    while i < n:
        result.append(fn(i))
        i += 1
    return result  #  返回列表

##推荐
def my_range(n):
    i = 0
    result = []
    while i < n:
        yield fn(i)  #  使用生成器代替列表
        i += 1
*尽量用生成器代替列表,除非必须用到列表特有的函数。

14. 中间结果尽量使用imap/ifilter代替map/filter

##不推荐
reduce(rf, filter(ff, map(mf, a_list)))

##推荐
from itertools import ifilter, imap
reduce(rf, ifilter(ff, imap(mf, a_list)))
*lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候。

15. 使用any/all函数

##不推荐
found = False
for item in a_list:
    if condition(item):
        found = True
        break
if found:
    # do something if found...  

##推荐
if any(condition(item) for item in a_list):
    # do something if found...

16. 属性(property)

##不推荐
class Clock(object):
    def __init__(self):
        self.__hour = 1
    def setHour(self, hour):
        if 25 > hour > 0: self.__hour = hour
        elseraise BadHourException
    def getHour(self):
        return self.__hour

##推荐
class Clock(object):
    def __init__(self):
        self.__hour = 1
    def __setHour(self, hour):
        if 25 > hour > 0: self.__hour = hour
        elseraise BadHourException
    def __getHour(self):
        return self.__hour
    hour = property(__getHour, __setHour)

17. 使用 with 处理文件打开

##不推荐
f = open("some_file.txt")
try:
    data = f.read()
    # 其他文件操作..
finally:
    f.close()

##推荐
with open("some_file.txt"as f:
    data = f.read()
    # 其他文件操作...

18. 使用 with 忽视异常(仅限Python 3)

##不推荐
try:
    os.remove("somefile.txt")
except OSError:
    pass

##推荐
from contextlib import ignored  # Python 3 only

with ignored(OSError):
    os.remove("somefile.txt")

19. 使用 with 处理加锁

##不推荐
import threading
lock = threading.Lock()

lock.acquire()
try:
    # 互斥操作...
finally:
    lock.release()

##推荐
import threading
lock = threading.Lock()

with lock:
    # 互斥操作...

20. 参考

1) Idiomatic Python: 

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

2) PEP 8: Style Guide for Python Code: 

http://www.python.org/dev/peps/pep-0008/

(完)

来自:python那些事

作者:安生

链接:

http://lovesoo.org/pythonic-python-programming.html

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg


长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

compress后的bytearray再decode变大_笔记本电脑风扇噪音变大的原因及其解决办法

笔记本使用时间长了之后,风扇声音会变大,那么如何再把风扇声音变小呢?怎么减小笔记本风扇的噪音?是什么原因导致笔记本风扇声音变大?下面给大家介绍笔记本风扇声音变大的原因及其解决办法。原因:1、使用时间…

layui html模块化,终于搞懂了layui的模块化

这是index.js文件内容:layui.define([form,layer,element],function(exports){var $ layui.$;var form layui.form;var layer layui.layer;var element layui.element;var objList {ajax:function(filter,url){form.on(filter,function(data){$.ajax({url:url,…

ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例

ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法v1.5.0动态API最新端到端应用图像文件对象检测深度学习ONNX: Tiny YOLOv2 & Custom Vision问题对象检测是计算机视觉中的经典问题之一:识别给定图像中包含哪些对象以及它们在图像中的位置。对于…

关于jquery ajax发送以及php接受json数据的一点记录

今天认为构造json数据遇到的问题记录下: 1.发送对象{"k1":"v1","k2":"v2"}形式的数据,服务器用k1和k2获取 2.发送对象[{"k1":"v1"},{"k2":"v2"}],错误的…

120天的烧脑只为孩子设计一套教具~

小木研究了适合儿童学习计算机知识的书真的挺多,但是小木要推荐的这本真的是很接地气了,不管是热衷于研究技术的小机灵还是一说计算机逻辑就懵的小可爱们,看到这本萌萌哒电脑漫游记,都会忍不住对计算机越来越感兴趣。它深入浅出&a…

# 睡眠3秒_【for fun】睡眠排序算法

点击上方蓝字关注我,我们一起学编程有任何疑问或者想看的内容,欢迎私信前天我们一起看了猴子排序,今天我们再来看一个奇葩的排序方法:睡眠排序。所谓睡眠排序,就是为待排序数组的每一个元素 x 启动一个线程&#xff0c…

将U盘虚拟成软驱加载控制器驱动安装windows server 2003

转自: http://dengweihua1.blog.51cto.com/134932/293221仅支持9G,10G安装windows2003使用该软件后,U盘的数据会丢失!使用该软件后,U盘将无法被Windows系统使用,恢复U盘在最下边。u 安装前的准备: 1. 按F2进入BIOS&…

超级智能玩具《小小机器人》首发|全新50种玩法,创造力之源

致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分,因为它涉及到了多种学科:要搭建得稳固——这是工程学;要精准搭建——这是数学;…

.NET Core with 微服务 - 什么是微服务

微服务是这几年最流行的架构,说起架构不提微服务都不好意思跟人家打招呼。最近想要再梳理一下关于微服务的知识,并且结合本人的一些实践经验来做一些总结与分享。前面会分享一些概念性的东西,后面也会使用.net来实践,一步步完成一…

雨棚板弹性法计算简图_钢结构工程量计算4点注意事项,还不来看?

一图纸:根据图纸目录,清理核对图纸数量,检查是否有遗漏。二建筑施工图1. 设计总说明 1.1 建筑面积、结构形式、柱距、跨度、结构布置情况;1.2 工程量计算的范围:关于结构、屋面、墙面、门窗等,清楚投标报价…

html注释的爱情故事,爱情故事”为你的婚礼贴上专属标签

这不是一场婚礼,而是彩虹之上的梦每个年轻的女孩都有一个多彩的梦,这个梦绚丽斑斓,若有天梦想实现,年轻的女孩子们是否会欣喜地大叫起来?为你的婚礼注入你自己的梦,贴上只属于你自己的“标签婚礼”吧&#…

震惊整个世界的新发现,科学界的大骗局

全世界有3.14 % 的人已经关注了数据与算法之美布朗洛和N射线闹剧继伦琴发现X射线后,1903年,法国科学院院士、物理学家布朗洛宣布他发现了N射线。法国科学院公布了这一“惊人发现”之后,兴起了一股研究N射线热潮,仅法国科学院院刊在…

TI-89T 教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣

2019独角兽企业重金招聘Python工程师标准>>> 教你在C 程序里调用TI-BASIC程序,看看是否有人对这个感兴趣 昨天翻TIGCC的文档,先瞅了瞅FAQ,话说我看文档有个习惯,就是先看目录,再看FAQ,因为FAQ汇…

webgl坐标转换_OpenGL/WebGL顶点坐标变换过程简介

世界坐标是按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都建立在世界坐标的基础上。对象坐标系对象被应用于任何变换之前的初始位置和方向所在的坐标系,也就是当前绘图坐标系;该坐标系不固定且仅对该对象适用;默认情况…

利用计算机制作多媒体最后一步,福建省高中会考 多媒体技术应用 选择题专项练习十一(201206)(有答案)...

多媒体技术应用选择题专项练习十一(201206)1.下列都属于数字图像采集工具的是( )A.数码照相机、扫描仪B.麦克风、扫描仪C.打印机、数码照相机D.数码摄像机、打印机2.下列关于制作多媒体作品的叙述,不正确的是( )A.规划与设计是制作多媒体作品的重要步骤B.制作多媒体…

工程师和科学家有什么区别

全世界有3.14 % 的人已经关注了数据与算法之美科学家和工程师有什么不同?通常民众认为,工程师就是搞技术的,科学家就是搞科研的。对科学领域有一定认识的人群会说,工程师是应用科研成果的人,科学家是发现科学规律的人。…

CHANGE MASTER TO语法--MySql数据库

CHANGE MASTER TOmaster_def[,master_def] ... 可以更改从属服务器用于与主服务器进行连接和通讯的参数。 MASTER_USER,MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEY和MASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器…

聊一聊Jmeter与多接口测试

背景 前面两篇聊过了 JMeter 的 简单使用 和 参数化,主要都还是单接口的。很多时候,一个业务要走完,它会依赖多个接口,而且这些接口会有依赖性。好比说,我想查询一个订单信息,那么大前提肯定是我已经下单了…

评价的等级优良差_满意程度等级划分

满意程度等级划分分四级:优良中差模块满意度评价标准优:程序运行:完全符合需求的要求,调试运行无BUG并无内部错误,与其他模块可以完全耦合,内部模块紧凑,运行效率高。代码编写界面设计&#xff…

计算机在学前教育和美术绘画中的应用,幼儿园美术教学活动中信息技术的应用...

随着现代经济社会的快速发展和科技水平的进一步提升,信息技术在多个领域内逐步渗透并获得了较为广泛的推广和应用,幼儿园美术教育行业同样如此。在此过程中,信息技术有效融合图像、声音、文字等多种元素,并严格根据幼儿教师教学目…