《Dive into Python》Chapter 2 and Chapter 3 笔记
Example 2.1. odbchelper.py
def buildConnectionString(params): """Build a connection string from a dictionary Returns string.""" return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) if __name__ == "__main__": myParams = {"server":"mpilgrim", \ "database":"master", \ "uid":"sa", \ "pwd":"secret" } print buildConnectionString(myParams)
odbchelper.py的输出结果:
pwd=secret;database=master;uid=sa;server=mpilgrim
1、函数声明
Python里的函数不需要指定返回值的数据类型,甚至不需要指定是否有返回值。实际上,每个Python函数都会返回一个值:如果函数执行过return语句,它将返回指定的值,否则将返回None(Python的空值)。
2、文档化函数
可以通过给出一个doc string(文档字符串)来文档化一个Python函数。
def buildConnectionString(params): """Build a connection string from a dictionary Returns string."""
三重引号表示一个多行字符串。在开始与结束引号之间的所有东西都被视为单个字符串的一部分,包括硬回车和其它的引号字符。在三重引号中的任何东西都是这个函数的doc string,它们用来说明函数可以做什么。如果存在doc string,它必须是一个函数要定义的第一个内容(也就是说,在冒号后面的第一个内容)。
3、万物皆对象
在Python中一切都是对象,并且几乎一切都有属性(看上去是什么样)和方法(会做什么)。万物皆对象可以感性地解释为:一切都可以赋值给变量或者作为参数传递给函数。
4、测试模块
所有的Python模块都是对象,并且都有一个内置属性__name__。一个模块的__name__的值取决于你如何应用模块:
如果import模块,那么__name__的值通常为模块的文件名,不带路径和文件扩展名。
>>>import odbchelper >>>odbchelper.__name__ 'odbchelper'
而如果直接运行模块,__name__的值将是一个特别的缺省值(即默认值),__main__。
可以利用这一特性在模块内部设计一个测试套件:
if __name__=="__main__":
当直接运行模块时,__name__的值是__main__,所以测试套件执行。而导入模块时,__name__的值就是别的东西了,所以测试套件被忽略。这样使得在将新的模块集成到一个大程序之前开发和调试容易多了。
5、字典(Dictionary)
>>>d = {"server":"mpilgrim","database":"master"} (1) >>>d {'server':'mpilgrim','database':'master'} >>>d["server"] (2) 'mpilgrim' >>>d["database"] 'master' >>>d{"mpilgrim"} (3) Traceback (innermost last): File"<interractive input>",line 1, in ? KeyError: mpilgrim >>>d["datebase"] = "pubs" (4) >>>d {'server':'mpilgrim','database':'pubs'} >>>d["uid"] = "sa" (5) >>>d {'server':'mpilgrim','uid':'sa','database':'pubs'}
(1)创建一个新的字典,它有两个元素,将其赋给变量d。每一个元素都是一个key—value对;整个元素集合用大括号括起来。
(2)’server’是一个key,它所关联的value是通过d[“server”]来引用的,为‘mpilgrim’。
(3)可以通过key来引用其值,但不能通过值获取key。
(4)在一个dictionary中不能有重复的key。给一个存在的key赋值会覆盖原有的值。
(5)1、在任何时候都可以加入新的key—value对。2、dictionary是无序的。
dictionary的key是大小写敏感的(即区分大小写)。
dictionary不止是用于存储字符串。它的值可以是任意数据类型,包括字符串、整数、对象,甚至其他的dictionary。在单个dictionary里,它的值不需要全都是同一数据类型,可以根据需要混用和匹配。dictionary的key则要严格的多。
del dictionary[key] 使用key从一个dictionary中删除独立的元素。
dictionary.clear()清除dictionary中的所有元素。
6、列表(List)
list中的元素是有序的,并且不必唯一。
append(追加)接受一个参数(这个参数可以是任何数据类型),并且简单地追加到list尾部。而extend(扩展)接受一个参数,这个参数总是一个list,并且把这个list中的每个元素添加到原list中。
insert将单个元素插入到list中。数值参数是插入点的索引。
index在list中查找一个值的首次出现并返回索引值。如果在list中没有找到值,python会引发一个异常。
要测试一个值是否在list中,使用in。如果值存在,它返回True,否则返回False。True和False的首字母必须大写。
remove从list中删除一个值的首次出现。如果没有找到该值,python同样会返回一个异常。
pop会删除list的最后一个元素,然后返回删除元素的值。
list可以用 + 运算符连接起来。list = list + otherlist相当于list。extend(otherlist)。
li += [‘two’]等同于li.extend([‘two’]).
* 运算符可以作为重复器作用于list。li = li * 3即把三个list连接成一个。
7、元组(Tuple)
Tuple是不可改变的list。一旦创建了一个tuple,就不能以任何方式改变它。
定义tuple与定义list的方式相同,但整个元素集是用小括号包围的,而不是方括号。
tuple的元素与list一样按定义的次序进行排序。
tuple没有方法,但可以使用in来查看一个元素是否存在于tuple中。
使用tuple的好处:
- tuple比list操作速度快,如果定义了一个值的常量集,并且唯一要用它做的是不断遍历它,应该使用tuple代替list。
- 如果对不需要修改的数据进行“写保护”,可以使代码更安全。
- tuple可以在dictionary中被用做key,但list不行。Dictionary key必须是不可变的。
- tuple可以用在字符串格式化中。
8、变量声明
当一条命令用续行符(“\”)分割成多行时,后续的行可以以任意方式缩进。
一次赋多值
>>> v = ('a','b','e') >>> (x,y,z) = V >>> x 'a' >>>y 'b >>>z 'e'
v是一个三元素的tuple,并且(x,y,z)是一个三变量的tuple。将一个tuple赋值给另一个tuple,会按顺序将v的每个值赋给每个变量。
连续值赋值
>>>range(7) [0,1,2,3,4,5,6] >>>(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY) = range(7) >>>MONDAY 0 >>>TUESDAY 1 >>>SUNDAY 6
内置的range函数返回一个元素为整数的list。
9、格式化字符串
字符串的格式化
>>> uid = "sa" >>> pwd = "se cret" >>> print pwd + " isnot agood passwor d for " + uid (1) secret is not agoodpasswo rd for sa >>> print "%s is nota good passw ord for %s" % (pw d,uid) (2) secretis not agood passwo rd for sa >>> userCou nt = 6 >>> print "Users con nected: %d" %(use rCoun t, ) (3) (4) Users connected:6 >>> print "Users con nected: " + userCoun t (5) Traceback (innermost last) : File "<i nteract ive input>", line 1, in ? TypeError: cannot concatenate 'str'and 'int' objects
(1)通过连接操作符“+”连接
(2)通过字符串格式化实现连接
(3)(userCount,)是一个只包含一个元素的tuple。当定义一个list,tuple,dictionary时,可以总是在最后一个元素后面跟上一个逗号,但是当定义一个只包含一个元素的tuple时逗号是必须的。如果省略逗号,python不会知道(userCount)究竟是一个只包含一个元素的tuple还是变量userCount的值。
(4)字符串格式化通过将%s替换成%d即可处理整数。
(5)试图将一个字符串同一个非字符串连接会引发一个异常。字符串连接只能在被连接的每一个都是字符串时起作用。
数值的格式化
>>> print "Today's stock price: %f" %50.4625 (1) 50.462500 >>> print "Today's stock price: %.2f" %50.4625 (2) 50.46 >>> print "Change since yesterday: %+.2f" %1.5 (3) +1.50
(1)%f格式符选项对应一个十进制浮点数,不指定精度时打印6位小数。
(2)使用包含“.2”精度修正符的%f格式符选项将只打印2位小数。
(3)添加+修正符用于在数值之前显示一个正号或负号。
10、映射list
通过对list中的每个元素应用一个函数,从而将一个list映射为另一个list
>>> li = [1, 9,8, 4] >>> [elem*2 for elem in li] (1) [2, 18, 16, 8] >>> li (2) [1, 9, 8, 4] >>> li = [ elem*2 for elem in li] (3) >>> li [2, 18, 16, 8]
(1)li是一个将要映射的list。Python循环遍历li中的每个元素。对每个元素均执行如下操作:首先临时将其值赋给变量elem,然后Python应用函数elem*2进行计算,最后将结果追加到要返回的list中。
(2)对list的解析并不改变原始的list。
(3)将一个list的解析结果赋值给对其映射的变量是安全的。
keys、values和items函数
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params .keys() (1) ['server', 'uid', 'database' , 'pwd'] >>> params .values() (2) ['mpilgrim', 'sa', 'master', 'secret'] >>> params .items() (3) [('server', 'mpilgrim'), ('uid', 'sa'), ('database' , 'master'), ('pwd' , 'secret')]
(1)dictionary的keys方法返回一个包含所有键的list。这个list没按dictionary定义的顺序输出(因为dictionary中的元素是无序的)。
(2)values方法返回一个包含所有值的list。它同keys返回的list输出顺序相同。
(3)items函数返回一个形如(key,value)组成的tuple的list,这个list包括dictionary中所有的数据。
11、连接list与分割字符串
连接list
return ";".join(["%s=%s" % (k, v) f or k, v i nparams. items()])
字符串”;”本身就是一个对象,而调用join方法是将list中的元素连接成单个字符串,每个元素用一个分号隔开。分隔符不必是一个分号,它甚至不必是单个字符,它可以是任何字符串。
join只能用于元素是字符串的list,它不进行任何的强制类型转换。连接一个存在一个或多个非字符串元素的list将引发一个异常。
分割字符串
>>> li = ['se rver=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret'] >>> s = ";".join(li) >>> s 'server=mpilgrim;uid=sa;database=master;pwd=secret' >>> s.split(";") (1) ['server=mpilgrim', 'uid=sa', 'datab ase=master', 'pwd=secret'] >>> s.split(";", 1) (2) ['server=mpilgrim', 'uid=sa;datab ase=master;pwd=secret']
(1)与join相反,split将一个字符串分割成多元素list。其中,分隔符被完全去掉了。
(2)split接受一个可选的第二参数,它是要分割的次数。
《Dive into Python》Chapter 2 and Chapter 3 笔记的更多相关文章
- 为什么《Dive into Python》不值得推荐
2010 年 5 月 5 日更新:我翻译了一篇<<Dive Into Python>非死不可>作为对本文观点的进一步支持和对评论的回复,请见:http://blog.csdn. ...
- python 学习笔记 5 ----> dive into python 3
字符串 文本:屏幕上显示的字符或者其他的记号 计算机认识的东西:位(bit)和字节(byte) 文本的本质:某种字符编码方式保存的内容. 字符编码:一种映射(显示的内容 ----> 内存.磁盘 ...
- python 学习笔记 4 ----> dive into python 3
解析 列表解析.字典解析.集合解析 浏览本地文件系统的模块: 1 os 2 os.path 3 glob os模块:获取(和修改)本地目录.文件进程.环境变量等信息 os.path模块:包含了操作路径 ...
- python 学习笔记 3 ----> dive into python 3
Python内置数据类型 注意: Python可以不需要声明变量的数据类型.它是根据变量的初始赋值情况分析数据类型,并在内部跟踪变量. 比较重要的数据类型: 1 布尔型(Booleans):True. ...
- python 学习笔记 2 ----> dive into python 3
Python Shell idle的使用 >>> >>>help() ----> help> 可以在help这个工具中查找Python内置函数的文档等等 ...
- Dive into Python
写这篇文章的原因完全是为了督促自己每天晚上看完两章<Dive Into Python>这本书,因此,很多内容都是摘抄自原书的翻译版或者是自己瞎想,于是就顺带着记录了下来.此前已经看完前两章 ...
- Python编程从入门到实践笔记——异常和存储数据
Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...
- Python编程从入门到实践笔记——文件
Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...
- Python编程从入门到实践笔记——类
Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...
- Python编程从入门到实践笔记——函数
Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...
随机推荐
- 通过Scrapy抓取QQ空间
毕业设计题目就是用Scrapy抓取QQ空间的数据,最近毕业设计弄完了,来总结以下: 首先是模拟登录的问题: 由于Tencent对模拟登录比较讨厌,各个防备,而本人能力有限,所以做的最简单的,手动登录后 ...
- android View 绘制完成监听
<span style="font-size:18px">//view重绘时回调 view.getViewTreeObserver().addOnDrawListene ...
- 用宏定义封装LoadLibrary,方便的动态加载dll
同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数.最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方 ...
- C#创建Windows服务入门图解(VS2010)
C#创建Windows服务入门图解(VS2010) Windows服务大家都知道,比如Audio.Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的.所 ...
- 高仿百度传课应用客户端源码iOS版
高仿百度传课iOS版,版本号:2.4.1.2 运行环境:xcode6.3 ios8.3 (再往上系统没有测试) 转载请注明出处,不可用于商业用途及不合法用途. 如果你觉得不错,欢迎 star 哦 ...
- Express中使用mongodb存储session
express默认有队session的支持,但是是存储在内存中的. 我们可以使用mongodb来存储会话. 但是express的各个版本中对该功能的写法是不同的. Express 2.x: app.u ...
- 构造高度自适应的textarea
高度自适应的textarea,这个需求还是比较常见的,随着用户的输入textarea的高度自动变化,这样输入较少的时候可以节省空间,输入多的时候可以不出现滚动条,让内容尽可能的展现在用户的视线内. 可 ...
- 10 个非常有用的 AngularJS 框架
AngularJS是最流行的开源web app框架.AngularJS被用于解决阻碍单页应用程序开发的各种挑战. 你作为一个AngularJS用户,却不知道一些可以帮助你美化编码的资源?那么一定不能错 ...
- 使用notepad++编辑器
使用notepad++编辑器 在公司时经常要用到文本编辑器去写jsp文件,之前使用的是sublime text 3,但是觉得不太顺手,于是转用notepad++编辑器. 这个编辑器最吸引我的地方是层次 ...
- Winfrom皮肤样式的使用
IrisSkin类库提供了可供我们使用的设置窗体皮肤的类,简单地说,就是给我们提供了一个皮肤引擎,通过设置皮肤引擎来达到我们想要的窗体界面. 具体的开发步骤: (1)引入IrisSkin.dll文件 ...