写在前面的话

从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. js 数组详解(javascript array)

    Array Array 对象用于在单个的变量中存储多个值. 构造函数: 1)   new Array(); 2)   new Array(size); 3)   new Array(element0, ...

  2. shell 中函数放回字符串问题

    shell 中函数放回字符串问题 shell 中不可以直接 return 字符串 ,可以return 数字.如果要return 字符串 改为 echo "hello world" ...

  3. android中ListView点击和里边按钮点击不能同时生效问题解决

    今天遇到一个问题:android中ListView点击和里边button点击不能同时生效问题解决. 原因是: listView 在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得 ...

  4. 【转】cocos2d-x获取系统时间——2013-08-25 10

    欢迎转载,本帖地址:http://blog.csdn.net/jinjian2009/article/details/9449585 之前使用过cocos2d-x获取系统时间,毫秒级的 long ge ...

  5. Dynamic SQL--官方文档

    https://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html 3.9. Dynamic SQL A very common problem ...

  6. [转] JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和 Matcher Pattern 一个Pattern是一个正则表达式经编译后的 ...

  7. Android 开发第三天

    今天学习的内容

  8. 第一个felx项目的创建

    使用新建flex项目向导建立项目

  9. Android 自学之帧布局 FrameLayout

    帧布局(FrameLayout)直接继承了ViewGroup组件: 帧布局容器为每一个加入其中的组件都创建了一个空白的区域,这个区域我们称之为一帧,所有每个组件都占据一帧,这些都会根据gravity属 ...

  10. selendroid项目实战教程1

    selendroid是国内使用非常少的框架.资料也少.刚好公司项目用到,给大家分享下,技术不太行,有错误还望指正. 使用selendroid契机,是公司开发的APP,需要大量捕捉Toast信息.公司的 ...