让代码更Pythonic

当然不要过分追求简洁,不然阅读的人就遭殃了,

部分逻辑复杂的情况还应按照清晰的逻辑脉络去写方便阅读,

毕竟我们是用代码实现功能然后维护,而不是单单的炫技。

##############

这里博主收集了一些比较常见的 Pythonic 写法,帮助你养成写优秀代码的习惯

1. 交换两个变量的值,正常都会想利用一个中间临时变量来过渡。

能用一行代码解决的(并且不影响可读性的),决不用三行代码

1 tmp = a
2 a = b
3 b = tmp
4
5 ##############
6 a,b = b,a

2.在一个 for 循环中,如果逻辑比较简单,不如试用一下列表的列表推导式,虽然只有一行代码,但也逻辑清晰

1 my_list = []
2 for i in range(10):
3 my_list.append(i*2)
4
5 ##################
6 my_list = [i*2 for i in range(10)]

3.带索引遍历,更好的做法是利用 enumerate 这个内置函数

1 for i in range(len(my_list)):
2 print(i, "-->", my_list[i])
3
4 ###############
5 for i,item in enumerate(my_list):
6 print(i, "-->",item)

4.序列解包,使用 * 可以对一个列表解包

1 a, *rest = [1, 2, 3]
2 # a = 1, rest = [2, 3]
3
4 #################
5 a, *middle, c = [1, 2, 3, 4]
6 # a = 1, middle = [2, 3], c = 4

5.字符串拼接,一个列表(或者可迭代对象)中的所有元素都是字符串对象,想要将他们连接起来,更推荐的做法是使用 join 函数

1 letters = ['s', 'p', 'a', 'm']
2 s=""
3 for let in letters:
4 s += let
5
6 ###############
7 letters = ['s', 'p', 'a', 'm']
8 word = ''.join(letters)

6.判断一个变量是否为真(假),新手习惯直接使用 == 与 True、False、None 进行对比,实际上,""、[]、{} 这些没有任何元素的容器都是假值,可直接使用 if not xx 来判断。

 1 if attr == True:
2 print('True!')
3
4 if attr == None:
5 print('attr is None!')
6
7
8 #################
9 if attr:
10 print('attr is truthy!')
11
12 if not attr:
13 print('attr is falsey!')

7.当直接使用 [] 来访问字典里的元素时,若key不存在,是会抛异常的,所以新会可能会先判断一下是否有这个 key,有再取,

更推荐的做法是使用 get 来取,如果没有该 key 会默认返回 None(当然你也可以设置默认返回值)

 1 d = {'hello': 'world'}
2 if d.has_key('hello'):
3 print(d['hello']) # prints 'world'
4 else:
5 print('default_value')
6
7 ######################
8 d = {'hello': 'world'}
9
10 print(d.get('hello', 'default_value')) # prints 'world'
11 print(d.get('thingy', 'default_value')) # prints 'default_value'

8.可以使用列表推导或者高阶函数 filter 来实现过滤列表元素,除了 filter 之外,还有 map、reduce 这两个函数也很好用

 1 a = [3, 4, 5]
2 b = []
3 for i in a:
4 if i > 4:
5 b.append(i)
6 ##############
7 a = [3, 4, 5]
8 b = [i for i in a if i > 4]
9 # Or:
10 b = filter(lambda x: x > 4, a)
11
12 a = [3, 4, 5]
13 b = map(lambda i: i + 3, a)
14 # b: [6,7,8]

9.文件读取是非常常用的操作,在使用完句柄后,是需要手动调用 close 函数来关闭句柄的,

如果代码写得太长,即使你知道需要手动关闭句柄,却也会经常会漏掉。因此推荐养成习惯使用 with open 来读写文件,上下文管理器会自动执行关闭句柄的操作

1 fp = open('file.txt')
2 print(fp.read())
3 fp.close()
4
5 #############
6 with open('file.txt') as fp:
7 for line in fp.readlines():
8 print(line)

10.代码续航,将一个长度较长的字符串放在一行中,是很影响代码可读性的(下面代码可向左滑动),

稍等注重代码可读性的人,会使用三个引号 \来续写,也可以使用括号,导包的时候亦是如此

 1 long_string = 'For a long time I used to go to bed early. Sometimes, when I had put out my candle, my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'
2
3 ####################################
4 long_string = 'For a long time I used to go to bed early. ' \
5 'Sometimes, when I had put out my candle, ' \
6 'my eyes would close so quickly that I had not even time to say “I’m going to sleep.”'
7
8 #or
9 long_string = (
10 "For a long time I used to go to bed early. Sometimes, "
11 "when I had put out my candle, my eyes would close so quickly "
12 "that I had not even time to say “I’m going to sleep.”"
13 )
14 ###############################
15 from some.deep.module.inside.a.module import (
16 a_nice_function, another_nice_function, yet_another_nice_function)

11.有时候出于需要,我们会使用一些特殊的魔法来使代码适应更多的场景不确定性,

但若非必要,请不要那么做。无端增加代码的不确定性,会让原先本就动态的语言写出更加动态的代码

1 def make_complex(*args):
2 x, y = args
3 return dict(**locals())
4
5 ################
6 def make_complex(x, y):
7 return {'x': x, 'y': y}

12.对于暂不需要,却又不得不接收的的变量,请使用占位符

1 filename = 'foobar.txt' 2 basename, _, ext = filename.rpartition('.')

13.对于简单的判断并赋值,其实是可以使用三目运算,一行搞定

1 age = 20
2 if age > 18:
3 type = "adult"
4 else:
5 type = "teenager"
6
7 ###############
8 age = 20 b = "adult" if age > 18 else "teenager"

Python代码简化的更多相关文章

  1. python多行代码简化

    python中,可以把多行代码简化为一行,把for循环和if条件判断都集中到一行里来写,示例如下: >>> from nltk.corpus import stopwords > ...

  2. Python 代码风格

    1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...

  3. Convex Hull 实现理论+自制Python代码

    Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...

  4. 深入理解 GIL:如何写出高性能及线程安全的 Python 代码

    深入理解 GIL:如何写出高性能及线程安全的 Python 代码 本文由 伯乐在线 - 郑芸 翻译.未经许可,禁止转载!英文出处:A. Jesse.欢迎加入翻译组. GIL对多线程的影响:http:/ ...

  5. Golang 调用 Python 代码

    go 中的 cgo 模块可以让 go 无缝调用 c 或者 c++ 的代码,而 python 本身就是个 c 库,自然也可以由 cgo 直接调用,前提是指定正确的编译条件,如 Python.h 头文件( ...

  6. 命令行下设置 PYTHONPATH 来正确运行Python代码

    写Python程序,总要使用一些自己使用的库:在运行此类程序的时候,就需要先配置好 PYTHONPATH 环境变量:否则会导致找不到库错误. Windows下,可以写一个bat来简化配置: @ECHO ...

  7. 机器学习完整过程案例分布解析,python代码解析

    所谓学习问题,是指观察由n个样本组成的集合,并依据这些数据来预測未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.如果如今有一个O2O领域的 ...

  8. Python代码规范问题及解决

    Python代码规范问题及解决 为了养成使用Python编程好习惯,尽量保证自己写的代码符合PEP8代码规范,下面是过程中报出的警告及解决方法,英文有些翻译不太准确见谅,会不断更新: PEP 8 只是 ...

  9. 如何写出优雅的Python代码?

    有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写.其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一 ...

随机推荐

  1. learning all in one

    learning learning all in one https://github.com/xgqfrms/learning/tree/gh-pages/GraphQL https://githu ...

  2. yarn & macOS & upgrade

    yarn & macOS https://yarnpkg.com/zh-Hans/docs/install#mac-stable $ brew install yarn $ brew upgr ...

  3. Echarts制作一张全球疫情图

    一.获取全球疫情数据 1)获取API 使用用友提供的新冠肺炎实时数据,登录注册之后可以免费使用. 2)点击用户信息 这里的AIPCODE,复制并保存,用于后续的使用. 3)API的使用 用友有提供一个 ...

  4. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  5. 五大自动化测试的Python框架

    1.Robot Framework 作为最重要的Python测试框架之一,Robot Framework主要被用在测试驱动(test-driven)类型的开发与验收中.虽然是由Python开发而来,但 ...

  6. SecureCRT无法登陆ubuntu问题解决的方法(亲测有效)

    最近在虚拟机安装了几个ubuntu系统玩耍,然后想着用SecureCRT在Windows本地连接但是怎么也连接不上!!!如下,这只是示意图,ip地址是瞎编的,但是情况完全相同,期间尝试过让linux和 ...

  7. ubuntu系统共享桌面的使用和配置

    内容转载自我的博客 目录 1. ubuntu共享桌面 2. 局域网登录远程桌面 2.1 ubuntu使用remmina登录远程桌面 2.2 在windows登录远程桌面 2.3 Android使用RD ...

  8. C# 处理PPT水印(三)—— 在PPT中添加多行(平铺)文本水印效果

    在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即幻灯片中只有一个文本水印:也可以添加多行(平铺)文本水印效果,即幻灯片中以一定方式平铺排列多个文本水印效果.本文 ...

  9. Synchronized 轻量级锁会自旋?好像并不是这样的。

    本来是在写面霸系列的,写着写着就写到了这一题: Synchronized 原理知道不? 而关于 Synchronized 我去年还专门翻阅 JVM HotSpot 1.8 的源码来研究了一波,那时候我 ...

  10. 定西+简单dp

    定西 ECNU-3531 #include<iostream> #include<cstdio> #include<algorithm> #include<c ...