用好这几招,让你的代码洋溢着 Pythonic 的味道
世界上有很多语言,但是我觉得 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 的味道相关推荐
- 【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关
目录 1. 超声波模块的测距原理 2. 超声波模块如何与Arduino开发板连接 3. 先从测距开始 4. 如何将超声波改造成声控开关 5. 再加一个超声波开关 在本文最后有完整的视频讲解 玩Ardu ...
- python简单代码编写-新手写Python,8招让你的代码更简洁更Pythonic!
Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别是对于从C.Java等语言转向Python的人来说,很容易按照C.Java等语言的写法来写Python,对于初学者来说,如果对Pyth ...
- python编写赛车_90%的人说Python程序慢,5大神招让你的代码像赛车一样跑起来
2.用set而不用list 我们再来看一个常见的场景,搜索性能的时候用set是列表10倍,不信看下面这个例子 原因搜索成员的时候,Python的set比list快很多.差距就在if i in myli ...
- FPGA秋招面试手撕代码20+
目录 前言 1.序列检测器 (1)三段式状态机实现方式 (2)移位寄存器实现方式 2.序列生成器 (1)移位寄存器方式实现 (2)计数器方式实现 (3)三段式状态机方式实现 3.分频 (1)偶数分频 ...
- 京东android面试题2019,京东2019春招编程题参考代码
数内排序 分析 字符串读入,逆序排序即可. 时间复杂度 O(len(x)*log(len(x))) 参考代码 #include using namespace std; int main() { st ...
- 360_2019年校园秋招笔试题(Java代码实现)
时间:20180827 19:00~21:00 地点:远程 岗位:Java开发工程师 分两部分,第一部分选择题,共40道,没啥可说的,就是不明白为什么还有C++的代码分析题(Java岗). ...
- 京东2018秋招编程题
C++开发工程师 京东 2018秋招编程题 (代码后续更新...) 1.神奇数 将一个数n的各数位分成两部分,两部分之和相等,则称这个数为神奇数.比如242分成[2,2].[4].输入一个范围[l, ...
- 想要成为一名优秀的程序员,这十八招必看
文章目录 第一招:速学能力 第二招:理解能力 第三招:编程能力 第四招:使用能力 第五招:编码能力 第六招:注释能力 第七招:思维能力 第八招:英语能力 第九招:学习能力 第十招:思考能力 第十一招: ...
- 武汉大学计算机学院招博士目录
学院.专业.研究方向 代码及名称 计划招 生人数 博导代码及姓名 考试科目 复试加试科目 (含同等学力.跨学科) 备注 211计算机学院 (68775536) 51 计划招收定向就业生不超过5人(各类 ...
最新文章
- python代码大全表解释-python操作列表的函数使用代码详解
- UiBot Creator v1.2火热体验中……
- Oracle运行set autotrace on报错SP2-0618、SP2-0611
- 前端利器!让AI根据手绘原型生成HTML | 教程+代码
- 介绍一款界面自动化的工具
- 计算机专业黑板报迎新,开学迎新黑板报_迎新学期黑板报高三
- CMM3 正式评估全过程
- 网页中的位图与矢量图使用
- 一键解决Win10 LTSC 2021官方镜像存在的问题
- 用fft对信号进行频谱分析实验报告_【鼎阳硬件智库原创︱测试测量 】基于全数字中频技术频谱分析仪的工作原理...
- 英特尔神经计算棒是什么?边缘计算又是什么?
- 我的python学习(五)文件操作、异常捕获
- php移动端可拖动可视化,可视化编辑uniapp项目DIY拖拽
- 北京车辆过户全过程(详细得狠)20160729更新,图4幅
- 《士兵突击》哪些最精彩的话语
- 2014中国计量学院matlab考试卷,中国计量学院学习心得
- linux如何让命令是中文,linux centos 让man命令帮助显示简体中文
- pycharm调试代码139错误的可能解决办法
- 前端 | Chrome打不开HTTPS个人网站的解决办法
- 怎么给苹果手机设备画面投屏到电脑上面?
热门文章
- 中软国际实习 dzy15
- 【Keil编译警告】warning C316:unterminated conditionals
- PHP代码审计——任意文件删除漏洞(YXcms)
- 移动端图文直播技术方案的分析
- 通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
- c语言 投影法图像定位,基于抛物线拟合和边缘点搜索的虹膜精确定位
- Django cms 教程五:添加内容
- Ubuntu设置定时任务——每10秒钟执行一次命令(修改文件权限)
- PHP 将xml文件解析为数组
- idea下设置git忽略提交ignore