Python深入学习笔记(一)
写在前面的话
从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深入学习笔记(一)的更多相关文章
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- 获取字段唯一值工具- -ArcPy和Python案例学习笔记
获取字段唯一值工具- -ArcPy和Python案例学习笔记 目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...
- Python高级学习笔记
Python高级学习笔记,此笔记中包含Linux操作系统.Html+CSS+JS.网络协议等. 所有思维导图为本人亲手所画,请勿用于商用. 大哥们,求点赞哦. 第一天笔记:链接 第二天笔记:链接 第三 ...
- Python入门学习笔记4:他人的博客及他人的学习思路
看其他人的学习笔记,可以保证自己不走弯路.并且一举两得,即学知识又学方法! 廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958 ...
- Python 基础学习笔记(超详细版)
1.变量 python中变量很简单,不需要指定数据类型,直接使用等号定义就好.python变量里面存的是内存地址,也就是这个值存在内存里面的哪个地方,如果再把这个变量赋值给另一个变量,新的变量通过之前 ...
- Python人工智能学习笔记
Python教程 Python 教程 Python 简介 Python 环境搭建 Python 中文编码 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 ...
随机推荐
- cocos2d-x触屏事件(单点触屏)
转自:http://blog.csdn.net/onerain88/article/details/7550009 一般经常用到的触屏的情况有两种:一种是Layer统一接收触屏消息,然后由程序根据需要 ...
- 深入理解JavaScript系列+ 深入理解javascript之执行上下文
http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html http://blog.csdn.net/hi_kevin/article/d ...
- MySQL协议分析
MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报 分类: 数据库(19) 目录(?)[+] 1 交互过程 MySQL客户端与 ...
- Android EventBus
https://github.com/greenrobot/EventBus onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也 ...
- Java基础知识强化之IO流笔记56:IO流练习之 登录注册IO版
1. 登录注册IO版的Java项目框架,如下: 2. 具体代码实现: (1)User.java(cn.itcast.game): package cn.itcast.pojo; /** * 这是用户 ...
- c基础语法
1 连续写两个分号,第2个分号就是一条空语句,空语句实际是什么也不做,语法是正确的,编译不会出错. 空语句可以增加程序的可读性,可以作为待写的函数体.循环体.语句块.所以,空语句是可以有用的. 2 s ...
- extjs6整合到web项目中
最近有一个项目需要应用extjs作为前端界面,因此研究了一下如何将extjs 6引入到项目中.以下是操作步骤 extjs6下载地址 extjs 6有gpl版本的,下载地址https://www.sen ...
- 跨时钟域设计【一】——Slow to fast clock domain
跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...
- 虚拟机及ubuntu环境搭建问题
1.现象: VMware中ubuntu ping通 宿主机windows VMware中ubuntu ping通 百度 宿主机windows ping不通 VMware中ubuntu 解决办法: 确保 ...
- js基础1
一.JavaScript 不同于Java 有三部分组成 核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) 二.var 是定义数据前加的前缀 三.弹出 alert( ) ...