pythonista模板_Python——Code Like a Pythonista: Idiomatic Python
如果你有C++基础,那学习另一门语言会相对容易。因为C++即面向过程,又面向对象。它很底层,能像C一样访问机器;它也很高级,有模板、STL
等。如果认真读过《深入C++对象模型》,我想其它语言不会比这个更复杂。你对C++了解的越深,你用其它语言写出的代码就越像C++,这样就体现不出新
语言的价值了。所以,学习新语言要抛弃原有的潜意识,包括代码风格。
1. The Zen of Python (1)
漂亮比丑陋好
清晰比隐含好
简单比复杂好
复杂比晦涩好
平摊比嵌套好
松耦合比紧耦合好
可读性是有价值的
特殊的条件不足以打破这些条款
尽管实践打败理论的纯洁
错误永远不要掩盖
除非明确地平息它
……
2. PEP 8: Style Guide for Python
关于Python的重要风格准则
Whitespace1
每级对齐为4个空格
没有硬tab
永远不要把tab与空格混用
函数之间留出1行空白
类之间留出2行空白
Whitespace 2
在字典,列表,元组,参数列表的”,”后面加上空格,字典中”:”后也加上空格
在赋值或比较符间加上空格
在括号中要紧挨空格,函数名与括号也不要有空格
在docstrings中不要立即空格
Naming
joined_lower用于函数,方法,属性
joined_lower或ALL_CAPS用于常量
StudlyCaps用于类, 不需要前面加C
#每字母大写
camelCase仅用于兼容已存在的惯例
属性有:interface,_internal, __private。但后一种绝对不要使用。
一些来自C++/Java对类的访问权限过于在意。在Python中,MyClass.__private会直接解析为
MyClass._MyClass__private,因为它可以造成“视觉上”的不可访问。Python有条原则是:“we’reall
consenting adults
here”,你没有理由向我隐藏什么。子类有权力从父类继承属性,而父类有义务向子类提供相关文档来帮助其重写,而非拒绝。
Python倡导使用_internal来表示私有属性,它没有命令空间限制,而仅仅是善意提醒“be careful with this,
it's an internalimplementation detail; don't touch it if you don't fully understand it”
Long Lines &Continuations
在括号里的换行使用隐含换行,但要注意对齐
def __init__(self, first, second, third,
fourth, fifth, sixth):
output = (first + second + third
+ fourth + fifth + sixth)
其它换行要使用“\”,注意后面千万不要有空格
LongStrings
与C语言一样,两个相邻的字符串是可以被编译器自动连接的。有一点不同的是,C语言中字符串只有一种形式,即用””,但Python中可以有’’,””,r’’,’’’,”””等等。不过原理都是一样的。
组合语句
Python中不提倡将多条语句写在同一行。比如if语句等。Python是非常讲究通过缩进来显示代码的结构与流程。
交换值
Python中的元组是非常有意思且不被C语言系的人所察觉。
b, a = a, b
元组有非常好的通用性,列表与元组可以很容易地交换
a = [12, 34, 45]
b, c, d = a
元组还常常用在for语句中,用于一次处理多个索引
>>> people = [l, ['Guido', 'BDFL', 'unlisted']]
>>> for (name, title, phone) in people:
... print name, phone
More About Tuples
Tuples的构造最重要的是“,”.比如、
>>> 1,
(1,)
即使上面没有括号也无妨。
Interactive “_”
在解释器中,_用于表示上次运算的结果。这种机制往往会给使用都很大的方便!
Building String from Substrings、、
这一条在Python世界中应该是很普及了。’’.join()只有在替代for循环连接列表时才有用
colors = ['red', 'blue', 'green', 'yellow']
result = ''
for s in colors:
result += s
result = ''.join(colors) #这一条要比上面for循环更有效率
Used in where possible
首先,in是操作符而不是关键字;其次,所有的内建窗口都支持此操作符。作者要强调的是,in有两个常用的位置:1. 配合for执行遍历;2. 与if一起使用判断存在。
作者一再强调,字典重载的in操作是对象是所有的keys,所以没必要先调用d.keys()获取键的列表,再使用in,而是直接用in d就可以了!
Dictionary get Method
在向字典中添加key时,常常要判断原来的key是否存在。如果仅仅是对原来的值做一些操作,那么get方法就非常适合。
get(key,default):获取key的值,如果key不存在,则返回default。
Dictionary setdefault Method
上一节是获取,那么相应的会有设置。setdefault的语义是”set if necessary, the get”,首先会判断key是否存在,如果不存在则设置值,否则返回已存在的值。在cookbook一书中,它提到这一函数对于值为链表的字典很有用。
defaultdict
它是从字典中派生出来的,顾名思义,这种字典有一个默认的值(事实上它通过一个函数)。这个种字典的产生来源于简化setdefault的调用,在以后遇到使用setdefault时,可以考虑使用这个特化的字典代替。
PS:这个类来源于collections模块,这个模块还包含其它有用模块,包括队列、OrdereDict、MutableSet等。
Building Dictionary
将2个序列组合在字典:一个序列为键,别一个为值。这种操作有一个惯用法,即使用zip组合。
given = ['John', 'Eric', 'Terry', 'Michael']
family = ['Cleese', 'Idle', 'Gilliam', 'Palin']
pythons = dict(zip(given, family))
Test for Truth Values
Python中不喜欢在条件判断时与True或False做比较,而是直接用内置转换和not来判断。这样做代码更简练。下面是判断True与False的完整表格。
False
True
False (== 0)
True (== 1)
"" (empty string)
any string but "" (" ", "anything")
0, 0.0
any number but 0 (1, 0.1, -1, 3.14)
[], (), {}, set()
any non-empty container ([0], (None,), [''])
None
almost any object that's not explicitly False
Index & Item:enumerate
enumerate函数很大的特点是这是个generator函数,所以在一些场合效率会不错。在涉及Index时,这个函数应该是用得最多的。因为
Python语言中for循环的天生缺陷,如果要达到这个效果,必须用range,并再配合索引。正因为这个缺陷,才有了这个函数产生!这给我的感觉就像
STL很多人推荐用迭代器遍历,有人觉得声明太冗长,于是在C++0x推出一个auto关键字来。
Default Parameter Values
一开始出现了一个非常令人不解的代码
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
>>> print bad_append('one')
['one']
>>> print bad_append('two')
['one', 'two']
问题原因是,a_list是一个变量,它在声明的时候被定义为一个空的list。而list是mutable对象~~~~~~~~~~
最终我找到它的原因。在函数声明时,创建了一个空的list (‘[]’),a_list只不过是这个空list的Label而已。在编译器中,a_list被定死为某一全局list的地址“引用”。在第一次调用 append(‘on’)时,那个空list变成了[‘one’],函数退出后此list没有回收,所以在下一次调用时才会出现这种情况!
Advanced % String Formatting
%有一个非常有意思的用法,即在字符串内写出对象名字。
values = {'name': name, 'messages': messages}
print ('Hello %(name)s, you have %(messages)i ' % values)
这种写法的好处是,当要改变打印格式时,只需要改变里面的内容即可。通常,values是用locals()代替,这样一来这种灵活的机制就非常厉害了。例如,可以向某一函数传入一条字符串就可以指定打印的内容了。
Generator Expression(生成器表达式)
GE与listcomprehension(列表解析)非常类似
列表解析:
语法:[expr for iter_var in iterable] 或 [expr for iter_var in iterable ifcond_expr]
生成器表达式:
语法:(expr for iter_var in iterable) 或 (expr for iter_var in iterable if cond_expr)
生成器表达式比列表解析晚一点出来,它的好处非常明显,就是它返回的是一个“生成器”,而非一个列表。
生成器在Python中被推荐替代常规的for循环,而很多地方生列表施展的地方成器也可以替代,因为本质上它们支持程度相同。当列表仅仅是作为临时使用时,生成器可能在内存上表现更佳。
Reading Lines From Text/Data File
请看代码
datafile = open('datafile')
for line in datafile:
do_something(line)
可能不少人会使用readlines方法,对于小文件,两者没有区别,但是大文件前者效率会高很多。
pythonista模板_Python——Code Like a Pythonista: Idiomatic Python相关推荐
- 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器
原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...
- 解决VS Code连接远程服务器使用Python中的matplotiib包画图无法显示的问题
项目场景: 在使用VS Code连接远程服务器使用Python中的matplotiib包画图时,会出现无法显示的问题 问题描述: 在直接执行画图程序时,会报错:RuntimeError: Invali ...
- pythonista3使用教程-Pythonista中文文档:使用Pythonista
使用Pythonista 此页面概述了Pythonista的用户界面,还包含一些有用的提示和技巧,可帮助你充分利用它. Pythonista分为三个面板:脚本库,代码编辑器和交互式控制台,其中还包含文 ...
- pythonista脚本_IPA Installer脚本下载-Pythonista脚本IPA Installer(安装手机ipa文件) - 极光下载站...
pythonista脚本IPA Installer,通过这个脚本,无需电脑,也可有让iOS苹果手机用户端轻松安装ipa文件,非常实用.安装速度快,没有大小限制. 主要特点: 无需上传,本地安装 没有大 ...
- python自动寻路模板_Python实现的简单模板引擎功能示例
本文实例讲述了Python实现的简单模板引擎功能.分享给大家供大家参考,具体如下: #coding:utf- 8 __author__="sdm" __author_email=' ...
- pythondocx模板_python操作docx文档(转)
关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很出名的一个工具"pa ...
- python利用什么写模板_Python利用逻辑回归分类实现模板
Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数. 优点:计算代价不高,易于理解和实现. 缺点: ...
- python乘法模板_python – 使用矩阵乘法的numpy模板匹配
我试图通过沿着图像移动模板来匹配模板与二进制图像(仅黑色和白色).并返回模板和图像之间的最小距离,以及发生此最小距离的相应位置.例如: IMG: 0 1 0 0 0 1 0 1 1 模板: 0 1 1 ...
- python 论坛模板_python模板 - PH的个人空间 - OSCHINA - 中文开源技术交流社区
看Python帮助文档模板部分,抄下来以备记忆 11.2. Templating The string module includes a versatile Template class with ...
- python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例
本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...
最新文章
- Python的控制语句4
- 普通PC安装ESXI6.0无法识别网卡驱动问题
- lightoj 1224
- C语言-字符串处理函数strcpy
- 获得连接对象 jdbc 20210412_204123.mp4
- Python——杂记
- xmu1214: 购物
- 39.伪造重定向ICMP数据包
- Qt插件化(Plugins)开发扩展应用程序
- 数据分析之数据透视表(Office2019)
- 机关干部的21条人际关系准则
- 好用≠滥用,人脸识别的公共应用边界在哪里?
- 二维码QR 码纠错级别
- 弹出框样式,swal is not define
- 链路不通或服务器没响应,连不通服务器服务怎么办(理论篇)
- 【附源码】计算机毕业设计SSM网上旅游订票服务系统
- “黑洞事件”持续发酵,视频版权保护又有哪些门道?
- 人工智能的春天来了!Tesra超算网络,助力AI开发!
- 自制天平一架自制饮料
- C++][基础知识 5] 虚函数
热门文章
- IDEA创建项目时弹出链接超时的提示,亲测好用的解决办法
- LCD屏的TCON、Source Driver、Gate Driver 、Gamma概念
- android10 psp模拟器,PPSSPP(PSP模拟器) V1.10 安卓版
- win10多用户同时登陆
- Linux C 函数参考(日期时间) 作者: 出处:hur.cn 更新时间: 2007年01月29日
- Java自学路线总结
- linux filp open,诚意请教一个filp_open的问题。
- 塞力斯是鸿蒙系统吗,赛力斯“驼峰”智能增程系统为何物?一亮相就引起行业沸腾...
- 阿里云新优惠活动,幸运券免费领取
- 自动化测试遇到的难点_谈谈我在自动化测试中遇到的坑