写在前面的话

从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理、科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力。虽然看了一些Python的教程,除了当初那本《Python核心编程》被反复翻看之外,其余还没看到很能让自己Python水平提高的书,虽然也掌握了一些比较Pythonic的方法,但总觉得离真正的深入理解和运用还很远,就像一直属于业余选手,算不上专业队伍那般。直到最近在看《编写高质量代码——改善Python程序的91个建议》和《Python开发实战》,开始有点眼前一亮的感觉,所以,趁此机会,在读书学习的过程中把一些有意思的Pythonic Code做个记录,也方便自己以后查阅。

代码风格与规范

1. 包和模块的命名采用小写、单数形式,而且短小;

2. 包通常仅作为命名空间,如只包含空的__init__.py文件;

参数变量操作

1. 三元操作

 x=0
y=1
print x if x>y else y #等价于
if x>y:
print x
else:
print y 

2. 将常量集中到一个文件中

 # const.py
class _const:
class ConstError(TypeError): pass
class ConstCaseError(ConstError): pass def __setattr__(self, name, value):
if self.__dict__.has_key(name):
raise self.ConstError, "Can't Change const %s." % name
if not name.isupper():
raise self.ConstCaseError, \
'const name "%s" is not all uppercase' % name
self.__dict__[name] = value import sys
sys.modules[__name__] = _const() # 存放常量的文件 constant.py
import const const.MY_CONSTANT = 1

3. 枚举类型

使用第三方模块flufl.enum,注:flufl不支持枚举元素比较

 from flufl.num import Enum
#方法一:通过继承的方式实现
class Seasons(Enum):
Spring = "Spring"
Summer = 2
Autumn = 3
Winter = 4
#方法二:直接初始化为Enum类的实例
Seasons = Enum('Seasons', 'Spring Summer Autumn Winter') #使用枚举值
#方法一:得到枚举项的名称
print [member for member in Seasons.__members__]
#方法二:得到枚举项的值
print Seasons.Summer.value

4. 类型检查

使用isinstance(object, classinfo)

5.字符串操作

a. 格式化字符串

 #在参数比较多的情况下,这样写使得格式化的字符串比较清晰,尤其当参数以dict传递时
print 'hello %(name)s' % {'name': 'Tom'} #使用str.format()也可以使字符串格式化变得清晰
print '%(name)s is %(age)d years old.' % {'name': 'Tom', 'age': 12}

b. 格式化字符串使用format(),更为灵活

weather = [("Monday", "rain"), ("Tuestday", "sunny")]

formatter = "Weather of '{0[0]}' is '{0[1]}'".format
for item in map(formatter, weather):
print item

6. 判断数值=或!=时,尽量使用整型数,浮点数可能由于精度不一,导致无法获得精确一致使判断条件得以满足。

7. 在不可信的计算环境中,尽量避免使用eval(),使用ast.literal_eval代替。

8. 将对象转换成字符串表示,有repre()和str()两种方法:

str()一般是将数值转成字符串。 
repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思。如list,dict使用str()是无效的,但使用repr可以,这是为了看它们都有哪些值,为了显示之用。

9. 函数传参既不是传值也不是传引用,准确的说法是传对象或者说传对象的引用。对可变对象的修改在函数外部以及内部都可见,调用者和被调用者之间共享这个对象,而对于不可变对象,由于并不能真正被修改,因此,修改往往是通过生成一个新的对象然后赋值实现。(书p75)

列表解析

语法: [expr for iter_item in iterable if cond_expr]

1. 多重迭代,例如两个集合的笛卡尔乘积:

>>> [(a, b) for a in ['a', 1, '', 'b'] for b in ['', 2, '', 'b'] if a!=b]
[('a', ''), ('a', 2), ('a', ''), ('a', 'b'), (1, ''), (1, 2), (1, ''), (1, 'b'), ('', 2), ('', ''), ('', 'b'), ('b', ''), ('b', 2), ('b', '')]

排序

sorted()作用于任意可迭代的对象,list.sort()一般作用于列表,sorted()不改变原有序列对象,返回一个新的对象,而sort()直接改变原有列表。

1. 多键值排序

#这里有两个同为ann,但年龄分别为2和3的小孩
>>> person = [{'name':'joe', 'age':2},{'name':'ann','age':3},{'name':'ben','age':5},{'name':'ann','age':2}]
#同时考虑name和age两个键值的排序
>>> sorted(person, key=lambda x: (x['name'],-x['age'])) [{'age': 3, 'name': 'ann'}, {'age': 2, 'name': 'ann'}, {'age': 5, 'name': 'ben'}, {'age': 2, 'name': 'joe'}]
#注意这里的键值顺序
>>> sorted(person, key=lambda x: (x['age'],x['name'])) [{'age': 2, 'name': 'ann'}, {'age': 2, 'name': 'joe'}, {'age': 3, 'name': 'ann'}, {'age': 5, 'name': 'ben'}]
#另外一种排序方法
>>> from operator import itemgetter
>>> sorted(person, key=itemgetter('name','age'))
[{'age': 2, 'name': 'ann'}, {'age': 3, 'name': 'ann'}, {'age': 5, 'name': 'ben'}, {'age': 2, 'name': 'joe'}]

2. 字典中混合list排序

>>> mydict = {'Li':[1,'b'],
... 'zhang':[3,'e'],
... 'Wang':[2,'a']}
>>> sorted(mydict.iteritems(), key=lambda (k,v): itemgetter(1)(v))
[('Wang', [2, 'a']), ('Li', [1, 'b']), ('zhang', [3, 'e'])]
>>> sorted(mydict.iteritems(), key=lambda (k,v): itemgetter(0)(v))
[('Li', [1, 'b']), ('Wang', [2, 'a']), ('zhang', [3, 'e'])]

3. 多维list排序

>>> results = [['ann',10,'b'],['ben',9,'a'],['aris',9,'c']]
>>> sorted(results, key=itemgetter(2,1))
[['ben', 9, 'a'], ['ann', 10, 'b'], ['aris', 9, 'c']]
>>> sorted(results, key=itemgetter(1,2))
[['ben', 9, 'a'], ['aris', 9, 'c'], ['ann', 10, 'b']]
>>> sorted(results, key=itemgetter(0,1))
[['ann', 10, 'b'], ['aris', 9, 'c'], ['ben', 9, 'a']]
>>> sorted(results, key=itemgetter(0))
[['ann', 10, 'b'], ['aris', 9, 'c'], ['ben', 9, 'a']]

Python深入学习笔记(一)的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  2. Python Click 学习笔记(转)

    原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...

  3. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  4. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  5. Python Flask学习笔记之Hello World

    Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...

  6. 获取字段唯一值工具- -ArcPy和Python案例学习笔记

    获取字段唯一值工具- -ArcPy和Python案例学习笔记   目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...

  7. Python高级学习笔记

    Python高级学习笔记,此笔记中包含Linux操作系统.Html+CSS+JS.网络协议等. 所有思维导图为本人亲手所画,请勿用于商用. 大哥们,求点赞哦. 第一天笔记:链接 第二天笔记:链接 第三 ...

  8. Python入门学习笔记4:他人的博客及他人的学习思路

    看其他人的学习笔记,可以保证自己不走弯路.并且一举两得,即学知识又学方法! 廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958 ...

  9. Python 基础学习笔记(超详细版)

    1.变量 python中变量很简单,不需要指定数据类型,直接使用等号定义就好.python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前 ...

  10. Python人工智能学习笔记

    Python教程 Python 教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 ...

随机推荐

  1. VM启用ISO共享

    在SCVMM中可以启用ISO共享,如下图: 如果不勾选共享镜像复选框,则vmm会把镜像文件通过网络复制到Hyper-v主机下的虚拟机配置文件夹中 配置步骤如下: 1.新建一个共享文件夹(存放ISO), ...

  2. C++编译器函数模版机制剖析 - 函数模版的本质

    思考:为什么函数模板能够和函数重载放在一块.C++编译器是怎样提供函数模板机制的? demo 1 #include <cstdio> #include <iostream> u ...

  3. MySQL——索引与优化

    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调 ...

  4. 【转】获取Sprite的实际Rect

    判断点击是否点击在了一个精灵上, 其实就是判断一个点是否在一个矩形内. cocos2d-x的2.0.2版本可以使用CCRect的函数 bool CCRect::containsPoint(const ...

  5. jQuery DOM XSS漏洞

    jQuery DOM XSS漏洞http://automationqa.com/forum.php?mod=viewthread&tid=2943&fromuid=21

  6. 查看kindle paperwhite2上卡索引书籍的方法

    昨天kindle耗电量突然加快,经过检查和网络搜索得知是卡索引导致的耗电量增大.我自己通过关闭索引的方式解决了这个问题. 在这个过程中发现了一个可以直接找到所有卡索引书籍的方法,在此分享一下. 首先打 ...

  7. bash调试执行

    bash -x 调试执行 bash -n 测试语法

  8. Velocity 模板引擎介绍

    一.变量 1. 变量定义 #set($name =“velocity”) 2. 变量的使用 在模板文件中使用$name 或者${name} 来使用定义的变量.推荐使用${name} 这种格式,因为在模 ...

  9. 20160406javaweb JDBC 实例工具类

    一.建立静态的数据库配置文件: config.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/datab ...

  10. 转载---SQL Server XML基础学习之<5>--XQuery(query)

    本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...