建议1---理解Pythonic的概念
对于Pythonic的概念,众人都有自己的看法,但大家心中都认同一个更具体的指南,即Tim Peters的《The Zen of Python》。在这一篇充满禅意的诗篇中,有几点非常深入人心:
- 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密。
- 找打一个简单问题的一个方法,最好是唯一的方法。
- 难以解释的实现,源自不好的主意;如有好的主意,它的实现肯定易于解释。
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
(1)Pythonic的定义
遵循Pythonic的代码,看起来像是伪代码。其实,所有伪代码都可以轻易的转换为可执行的Python代码,比如维基百科中的快速排序:
def quicksort(array):
less=[];greater=[]
if len(array)<=1:
return array
pivot=array.pop()
for x in array:
if x<=pivot: less.append(x)
else: greater.append(x)
return quicksort(less)+pivot+quicksort(greater)
结合例子而言,Pythonic也许可以定义为:充分体现Python自身特色的代码风格。
(2)代码风格
举个最常见的例子,在其它语言中(如C语言),两个变量交换需要如下的代码:
int a=,b=;
int tmp = a;
a = b;
b = tmp;
利用Python的packaging/unpackaging机制,Pythonic的代码只需要一行:
a,b = b,a
另外,在遍历一个容器的时候,其他语言代码如下:
length = len(alist)
i =
while i<length:
do_sth_with(alist[i])
i+=
而Pythonic风格的代码如下:
for i in alist:
do_sth_with(i)
灵活的使用迭代器是一种Pyhton风格,但不应过分使用奇技淫巧,比如利用python的Slice语法,可以写出如下代码:
a = [1,2,,3,4]
c = 'abcdef'
print(a[::-1])
print(c[::-1])
实际上,这个时候更好的体现Pythonic的代码是充分利用python库里的reversed()函数的代码。
print(list(reversed(a)))
print(list(reversed(c)))
(3)标准库
写Pythonic程序需要对标准库有充分的理解,特别是内置函数和内置函数数据类型。比如对字符串格式化,一般这样写:
print('Hello %s!' % ('Tom',))
但其实%s是非常影响可读性的,因为数量多了以后很难清除哪一个占位符对应哪一个实参。所以相对应的Pythonic代码是这样的:
print('Hello %(name)s' % {'name':'Tom'})
这样在参数比较多的情况下尤其有用。
#字符串
value = {'greet':'Hello World','language':'Python'}
print('%(greet)s from %(language)s' % value)
%占位符来自于大家的先验知识,对于新手而言,有点‘莫名其妙’,所以更具有Pythonic的风格代码如下:
print('{greet} from {language}'.format(greet='Hello World',language='Python'))
str.format()方法非常清晰的表达了这条语句的意图,而且模板的使用也减少了许多不必要的字符,使得可读性得到了很大的提升。事实上,str.format()也成了Python最为推荐的字符格式化方法,当然也是最Pythonic的。
(4)Pythonic的库或框架
程序员利用Pythonic的库或框架能更加容易、更加自然的完成任务。如果用python编写的库或框架迫使程序员编写累赘的或不推荐的代码,那么可以说它并不Pythonic。现在通常认为Flask这个框架是比较Pythonic的,它的一个Hello World级别的用例如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello world!" if __name__="__main__":
app.run()
建议1---理解Pythonic的概念的更多相关文章
- 后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
- 理解 Keystone 核心概念 - 每天5分钟玩转 OpenStack(18)
作为 OpenStack 的基础支持服务,Keystone 做下面这几件事情: 管理用户及其权限 维护 OpenStack Services 的 Endpoint Authentication(认证) ...
- 转:深入理解JavaScript闭包概念
闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的 ...
- Java IO 理解流的概念
Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取(INPUT)流从流读出数据( ...
- 理解前端模块概念:CommonJs与ES6Module
前言 现代前端开发每时每刻都和模块打交道.例如,在项目中引入一个插件,或者实现一个供全局使用组件的JS文件.这些都可以称为模块. 在设计程序结构时,不可能把所有代码都放在一起.更为友好的组织方式时按照 ...
- 加深理解Java异常概念并熟记5个最常见的运行时异常
加深理解Java异常概念并熟记5个最常见的运行时异常 说明Error与Exception的联系和区别有哪些? 列举最常见的5个运用时异常. 1.Error和Exception的联系和区别: Error ...
- 理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...
- 初学Java时没有理解的一些概念
背景 之前学Java属于赶鸭子上架,草草学习基础语法便直接做课程作业,许多概念问题仍不清楚,故在此梳理一下,主要参考廖雪峰和互联网资料. Java运行方式与JVM Java是介于编译型语言(C++)和 ...
- 理解 angular2 基础概念和结构 ----angular2系列(二)
前言: angular2官方将框架按以下结构划分: Module Component Template Metadata Data Binding Directive Service Dependen ...
随机推荐
- shzr要填的各种坑
shzr要填的各种坑 如果大家看到我学了什么算法没写总结,或者做了什么题没写题解,欢迎让我填坑. 计划要写的: [ ] 点分治 [ ] 整体二分 [ ] CDQ分治 [ ] Min-Max容斥 [√] ...
- [JXOI2018]排序问题
嘟嘟嘟 这是今天做的第二道九条可怜的题,现在对他的题的印象是:表面清真可做,实则毒瘤坑人. 首先要感谢吉司机,我期望学的特烂,好在样例直接告诉我们期望怎么求了. 令\(b_i\)表示第\(i\)个不同 ...
- 通过 PHP,可以把文件上传到服务器。
创建一个文件上传表单 允许用户从表单上传文件是非常有用的. 请看下面这个供上传文件的 HTML 表单: <html> <body> <form action=" ...
- 微信硬件平台(八) 4 ESP8266通过微信公众号给用户推送消息
https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=自己申请微信公众号的TOKEN 输出结果: 由于aRDUINO串 ...
- Vue.js项目详解
还是以Blog项目来讲解,最近我本人利用闲暇时间,以博客作为参考学习一些新的技术并尝试之前没有尝试过的思路来玩玩. 技术看似枯燥,但是带有一个目的来学,你会发现还是蛮有趣的. 主要实践的就是前后端分离 ...
- mac nginx 启动 自启动
MacBook-Pro:local shihw$ brew services start nginx ==> Tapping homebrew/services Cloning into '/u ...
- C# 中使用log4.net的注意事项
新建Log4Net.config文件,内容为 <?xml version="1.0" encoding="utf-8" ?> <configu ...
- Luogu P3703 [SDOI2017]树点涂色
比较有趣的综合树上问题,刷LCT题单时做的但是发现后面LCT只是起了辅助作用233 首先我们分析每一个操作,\(1\)的定义就让我们联想到了access,我们回忆一下LCT的性质: LCT中每一个sp ...
- sklearn 数据预处理1: StandardScaler
作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...
- 简单的自定义ViewGroup
自定义ViewGroup需要重写onMeasure, onLayout等方法.下面是一个实例,4个View分别显示在四个角. public class MyGroup extends ViewGrou ...