世界上有很多语言,但是我觉得 Python 是最有味道的,很多代码更接近于人的思考方式,既然选择了 Python 大法,就应该像 Pythonist 那样思考,写出 Pythonic 的代码,这篇文章介绍的都是很简单很基本的技巧,但也正是这些基础的用法使得 Python 变得与众不同。

行内判断
求绝对值 Non-Pythonic version

# Non-pythonic, ugly
if x < 0:y = -x
else:
y = x

Pythonic version

#Pythonic, elegant
y = -x if x < 0 else x

快速交换
交换两个变量的值 Non-Pythonic version

# Non-pythonic, ugly
temp = x
x = y
y = temp

Pythonic version

#Pythonic, elegant
x, y = y, x

快速生成数组
找出数组中所有大于零的数?

Non-Pythonic version

# Non-pythonic, ugly
x_list = [1, -1, 2, 3, -4]
y_list = []
for x in x_list:if x > 0:y_list.append(x)

Pythonic version

#Pythonic, elegant
x_list = [1, -1, 2, 3, -4]
y_list = [x for x in x_list if x > 0]

不只是数组,字典也可以快速生成:

#Pythonic, elegant
x_list = [1, -1, 2, 3, -4]
x_dict = {str(x): x for x in x_list}

列表切片
想要获取列表中第 3-5 个元素?

Non-Pythonic version

# Non-pythonic, ugly
alist = [1, 2, 3, 4, 5, 6, 7]
blist = []
index = 0
for x in alist:if 2 < index < 6:blist.append(x)index += 1

Pythonic version

#Pythonic, elegant
alist = [1, 2, 3, 4, 5, 6, 7]
blist = alist[3:6]

切片还有很多其他用法,可以戳这里了解更多。

简化判断
Non-Pythonic version

# Non-pythonic, ugly
if x == 1 or x == 2 or x ==3 or x == 4:print(x)

Pythonic version

#Pythonic, elegant
if x in [1, 2, 3, 4]:
print(x)

获取序号
Non-Pythonic version

# Non-pythonic, ugly
i = 0
for x in x_list:print(i, x)i += 1

Pythonic version

#Pythonic, elegant
for index, x in enumerate(x_list):
print(index, x)

只要 x_list是可以迭代的对象就行,enumerate()还可以接受一个参数来指定序号的初始值: for index, x in enumerate(x_list, 1) 指定起始序号为1。

用Counter来计数
还在手动计数?

# Non-pythonic, ugly
x_list = ['Ozil', 'Ramsey', 'Ozil', 'Ramsey', 'Giroud']
x_dict = {}
for x in x_list:if x in x_dict.keys():x_dict[x] += 1else:x_dict[x] = 1
print(x_dict)

试试Counter吧

#Pythonic, elegant
from collections import Counter
x_list = ['Ozil', 'Ramsey', 'Ozil', 'Ramsey', 'Giroud']
x_dict = Counter(x_list)
print(x_dict)

巧用函数工具
这里介绍两个常用的 Python 函数工具,map,reduce, 体会函数式编程的快感。

比如我有一大堆英文名,书写不规范,要求你整理成规范的形式(首字母大写,其余小写),这个例子来源于廖老师的Python教程中的习题

Non-Pythonic version

# Non-pythonic, ugly
name_list = ['luccy', 'BaTT', 'bOunD']
for name in name_list:name = name[0].upper()+ name[1:].lower()
print(name)

觉得上面的代码还行,不算丑陋?让我们换个思路,用 map,map()函数接收两个参数,一个是函数,一个是Iterable(可迭代对象),map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
Pythonic version

#Pythonic, elegant
def normalize(name):return name[0].upper() + name[1:].lower()
name_list = ['luccy', 'BaTT', 'bOunD']
print(list(map(normalize, name_list)))

再来思考这个问题,给你一个列表,求出列表中所有元素的积(还是来自于廖老师的博客)

Non-Pythonic version

# Non-pythonic, ugly
alist = [1, 3, 6, 10]
product = 1
for x in alist:sum *= x

对于这种问题,其实我们完全可以用reduce来解决,reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

就让我们把这个求积的过程用reduce()来解决吧:
Pythonic version

#Pythonic, elegant
def prod(alist):return reduce(multi, alist)
def multi(x, y):return x * y
alist = [1, 3, 6, 10]
print(prod(alist))

用好这几招,让你的代码洋溢着 Pythonic 的味道相关推荐

  1. 【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关

    目录 1. 超声波模块的测距原理 2. 超声波模块如何与Arduino开发板连接 3. 先从测距开始 4. 如何将超声波改造成声控开关 5. 再加一个超声波开关 在本文最后有完整的视频讲解 玩Ardu ...

  2. python简单代码编写-新手写Python,8招让你的代码更简洁更Pythonic!

    Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别是对于从C.Java等语言转向Python的人来说,很容易按照C.Java等语言的写法来写Python,对于初学者来说,如果对Pyth ...

  3. python编写赛车_90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来

    2.用set而不用list 我们再来看一个常见的场景,搜索性能的时候用set是列表10倍,不信看下面这个例子 原因搜索成员的时候,Python的set比list快很多.差距就在if i in myli ...

  4. FPGA秋招面试手撕代码20+

    目录 前言 1.序列检测器 (1)三段式状态机实现方式 (2)移位寄存器实现方式 2.序列生成器 (1)移位寄存器方式实现 (2)计数器方式实现 (3)三段式状态机方式实现 3.分频 (1)偶数分频 ...

  5. 京东android面试题2019,京东2019春招编程题参考代码

    数内排序 分析 字符串读入,逆序排序即可. 时间复杂度 O(len(x)*log(len(x))) 参考代码 #include using namespace std; int main() { st ...

  6. 360_2019年校园秋招笔试题(Java代码实现)

    时间:20180827      19:00~21:00 地点:远程 岗位:Java开发工程师 分两部分,第一部分选择题,共40道,没啥可说的,就是不明白为什么还有C++的代码分析题(Java岗). ...

  7. 京东2018秋招编程题

    C++开发工程师 京东 2018秋招编程题 (代码后续更新...) 1.神奇数 将一个数n的各数位分成两部分,两部分之和相等,则称这个数为神奇数.比如242分成[2,2].[4].输入一个范围[l, ...

  8. 想要成为一名优秀的程序员,这十八招必看

    文章目录 第一招:速学能力 第二招:理解能力 第三招:编程能力 第四招:使用能力 第五招:编码能力 第六招:注释能力 第七招:思维能力 第八招:英语能力 第九招:学习能力 第十招:思考能力 第十一招: ...

  9. 武汉大学计算机学院招博士目录

    学院.专业.研究方向 代码及名称 计划招 生人数 博导代码及姓名 考试科目 复试加试科目 (含同等学力.跨学科) 备注 211计算机学院 (68775536) 51 计划招收定向就业生不超过5人(各类 ...

最新文章

  1. python代码大全表解释-python操作列表的函数使用代码详解
  2. UiBot Creator v1.2火热体验中……
  3. Oracle运行set autotrace on报错SP2-0618、SP2-0611
  4. 前端利器!让AI根据手绘原型生成HTML | 教程+代码
  5. 介绍一款界面自动化的工具
  6. 计算机专业黑板报迎新,开学迎新黑板报_迎新学期黑板报高三
  7. CMM3 正式评估全过程
  8. 网页中的位图与矢量图使用
  9. 一键解决Win10 LTSC 2021官方镜像存在的问题
  10. 用fft对信号进行频谱分析实验报告_【鼎阳硬件智库原创︱测试测量 】基于全数字中频技术频谱分析仪的工作原理...
  11. 英特尔神经计算棒是什么?边缘计算又是什么?
  12. 我的python学习(五)文件操作、异常捕获
  13. php移动端可拖动可视化,可视化编辑uniapp项目DIY拖拽
  14. 北京车辆过户全过程(详细得狠)20160729更新,图4幅
  15. 《士兵突击》哪些最精彩的话语
  16. 2014中国计量学院matlab考试卷,中国计量学院学习心得
  17. linux如何让命令是中文,linux centos 让man命令帮助显示简体中文
  18. pycharm调试代码139错误的可能解决办法
  19. 前端 | Chrome打不开HTTPS个人网站的解决办法
  20. 怎么给苹果手机设备画面投屏到电脑上面?

热门文章

  1. 中软国际实习 dzy15
  2. 【Keil编译警告】warning C316:unterminated conditionals
  3. PHP代码审计——任意文件删除漏洞(YXcms)
  4. 移动端图文直播技术方案的分析
  5. 通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
  6. c语言 投影法图像定位,基于抛物线拟合和边缘点搜索的虹膜精确定位
  7. Django cms 教程五:添加内容
  8. Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)
  9. PHP 将xml文件解析为数组
  10. idea下设置git忽略提交ignore