Python学习日志(三)

3.1 变量赋值

Python 语言中, 等号(=)是主要的赋值运算符。(其他的是增量赋值运算符
anInt = -12
aString = 'cart'
aFloat = -3.1415 * (5.0 ** 2)
anotherString = 'shop' + 'ping'
aList = [3.14e10, '2nd elmt of a list', 8.82-4.371j]

3.1.1链式赋值
>>> y = x = x + 1
>>> x, y
(2, 2)


3.1.2增量赋值
从 Python 2.0 开始, 等号可以和一个算术运算符组合在一起, 将计算结果重新赋值给
左边的变量。这被称为增量赋值, 类似下面这样的语句:
x = x + 1
现在可以被写成:
x += 1 
Python 不支持类似 x++ 或 --x 这样的前置/后置自增/自减运算 

3.1.3多重赋值
>>> x = y = z = 1
>>> x
1
>>> y
1
>>> z
1


在上面的例子中,一个值为 1 的整数对象被创建,该对象的同一个引用被赋值给 x、y 和
z 。也就是将一个对象赋给了多个变量。当然,在 Python 当中,将多个对象赋给多个变量也是
可以的。
3.1.4“多元”赋值
另一种将多个变量同时赋值的方法我们称为多元赋值(multuple)。这不是官方 Python 术
语, 而是我们将 "mul-tuple"连在一起自造的。因为采用这种方式赋值时, 等号两边的对象
都是元组。
>>> x, y, z = 1, 2, 'a string'
>>> x
1
>>> y
2
>>> z
'a string' 
在上面的例子里, 两个整数对象(值分别为 1 和 2)及一个字符串对象, 被分别赋值给
x, y 和 z。通常元组需要用圆括号(小括号)括起来,尽管它们是可选的。我们建议总是加上
圆括号以使得你的代码有更高的可读性。
>>> (x, y, z) = (1, 2, 'a string') 
3.1.5 交换
# swapping variables in Python
>>> x, y = 1, 2
>>> x
1
>>> y
2
>>> x, y = y, x
>>> x
2
>>> y
1
显然, Python 在赋值之前已经事先对 x 和 y 的新值做了计算。 

3.2模块结构和布局

用模块来合理组织你的 Python 代码是简单又自然的方法。 你应该建立一种统一且容易阅读
的结构,并将它应用到每一个文件中去。下面就是一种非常合理的布局:
# (1) 起始行(Unix)
通常只有在类 Unix 环境下才使用起始行,有起始行就能够仅输入脚本名字来执行脚本,无
需直接调用解释器。


# (2) 模块文档
 
简要介绍模块的功能及重要全局变量的含义,模块外可通过 module.__doc__ 访问这些内
容。


# (3) 模块导入
导入当前模块的代码需要的所有模块;每个模块仅导入一次(当前模块被加载时);函数
内部的模块导入代码不会被执行, 除非该函数正在执行。


# (4) 变量定义
这里定义的变量为全局变量, 本模块中的所有函数都可直接使用。从好的编程风格角度说,
除非必须,否则就要尽量使用局部变量代替全局变量,如果坚持这样做,你的代码就不但容易
维护,而且还可以提高性能并节省内存。


# (5) 类定义
所有的类都需要在这里定义。当模块被导入时 class 语句会被执行, 类也就会被定义。类
的文档变量是 class.__doc__。


# (6) 函数定义
此处定义的函数可以通过 module.function()在外部被访问到,当模块被导入时 def 语句
会被执行, 函数也就都会定义好,函数的文档变量是 function.__doc__。


# (7) 主程序

无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。通常这里
不会有太多功能性代码,而是根据执行的模式调用不同的函数。




3.3 程序示例

3.3.1 makeTextFie.py
1 #!/usr/bin/env python
2
3'makeTextFile.py -- create text file'
4 #UNIX 启动行之后是模块的文档字符串。应该坚持写简洁并有用的文档字符串。这里我们写
  #的有点短,不过对这段代码已经够用。(建议读者看一下标准库中 cgi 模块的文档字符串,那
  #是一个很好的示例)
5import os
6 ls = os.linesep
7 #之后我们导入 os 模块, 在第 6 行我们为 os.linesep 属性取了一个新别名。这样做一方
  #面可以缩短变量名, 另一方面也能改善访问该变量的性能。
  #核心技巧:使用局部变量替换模块变量
  #类似 os.linesep 这样的名字需要解释器做两次查询:
  #(1)查找 os 以确认它是一个模块,
  #(2)在这个模块中查找 linesep 变量。因为模块也是全局变量, 我们多消耗了系统资源。如
  #果你在一个函数中类似这样频繁使用一个属性,我们建议你为该属性取一个本地变量别名。 变
  #量查找速度将会快很多--在查找全局变量之前, 总是先查找本地变量。 这也是一个让你的
  #程序跑的更快的技巧: 将经常用到的模块属性替换为一个本地引用。代码跑得更快,而也不用
  #老是敲那么长的变量名了。在我们的代码片段中,并没有定义函数,所以不能给你定义本地别
  #名的示例。不过我们有一个全局别名,至少也减少了一次名字查询
8# get filename
9 while True:
10#显然这是一个无限循环, 也就是说除非我们在 while 语句体提供 break 语句, 否则它会
  #一直循环下去。
  #while 语句根据后面的表达式决定是否进行下一次循环, 而 True 则确保它一直循环下去。
11 if os.path.exists(fname):
12 print "ERROR: '%s' already exists" % fname
13 else:
14 break
15#第 11-14 行提示用户输入一个未使用的文件名。 raw_input() 内建函数接受一个“提示
  #字符串”参数,作为对用户的提示信息。raw_input()返回用户输入的字符串,也就是为 fname
  #赋值。 如果用户不小心输入了一个已经存在的文件的名字,我们要提示这个用户重新输入另一
  #个名字。 os.path.exists() 是 os 模块中一个有用的函数, 帮助我们确认这一点。 当有输
  #入一个不存在的文件名时, os.path.exists() 才会返回 False, 这时我们中断循环继续下面
  #的代码。
16 # get file content (text) lines
17 all = []
18 print "\nEnter lines ('.' by itself to quit).\n"
19
20 # loop until user terminates input
21 while True:
22 entry = raw_input('> ')
23 if entry == '.':
24 break
25 else:
26 all.append(entry)
27#这部分代码提供用户指令,引导用户输入文件内容,一次一行。我们在第十七行初始化了
  #列表 all, 它用来保存每一行文本。 第 21 行开始另一个无限循环, 提示用户输入每一行文本,
  #一行仅输入一个句点 '.' 表示输入结束。 23-26 行的 if-else 语句判断是否满足结束条件
  #以中止循环(行 24), 否则就再添加新的一行。
28 # write lines to file with proper line-ending
29 fobj = open(fname, 'w')
30 fobj.writelines(['%s%s' % (x, ls) for x in all])
31 fobj.close()
32 print 'DONE!'
  #现在所有内容都保存在内存当中, 我们需要将它们保存到文件。 第 29 行打开文件准备进
  #行写操作,第 30 行将内存中的内容逐行写入文件。每个文件都需要一个行结束符(或文件结束
  #字符)。 第 30 行的结构称为列表解析, 它做以下事: 对我们文件的每一行, 根据程序运行
  #平台添加一个合适的行结束符。 '%s%s' 为每一行添加行结束符,(x, ls)表示每一行及其行
  #结束符, 对 Unix 平台, 是'\n', 对 DOS 或 win32 平台, 则是 '\r\n'。通过使用 os.lineseq ,
  #我们不必关心程序运行在什么平台,也不必要根据不同的平台决定使用哪种行结束符。 文件
  #对象的 writelines() 方法接收包含行结束符的结果列表,并将它写入文件
3.3.2 readTextFile.py
1 #!/usr/bin/env Python
2
3 'readTextFile.py -- read and display text file'
4
5 # get filename
6 fname = raw_input('Enter filename: ')
7 print
8
9 # attempt to open file for reading
10 try:
11 fobj = open(fname, 'r')
12 except IOError, e:
13 print "*** file open error:", e
14 else:
15 # display contents to the screen
16 for eachLine in fobj:
17 print eachLine,
18 fobj.close()
# 脚本的剩余部分展示了一种新的 Python 结构, try-except-else 语句。try 子句是一段
# 我们希望监测错误的代码块。 在第 10-11 行代码,我们尝试打开用户输入的文件。except 子
# 句是我们处理错误的地方。在 12-13 行,我们检查 open() 是否失败-通常是 IOError 类型
# 的错误。
# 最后,14-18 行的 else 子句在 try 代码块运行无误时执行。我们在这儿将文件的每一行
# 显示在屏幕上。注意由于我们没有移除代表每行结束的行结束符,我们不得不抵制 print 语句
# 自动生成的行结束符 --通过在 print 语句的最后加一个逗号可以达到这一目的。 第 18 行关
# 闭文件,从而结束这段脚本。

3.4 相关模块和开发工具

Python 代码风格指南(PEP8), Python 快速参考和 Python 常见问答都是开发者很重要的
“工具”。另外, 还有一些模块会帮助你成为一个优秀的 Python 程序员。
(1) Debugger: pdb
(2)Logger: logging
(3)Profilers: profile, hotshot, cProfile
调试模块 pdb 允许你设置(条件)断点,代码逐行执行,检查堆栈。它还支持事后调试。
logging 模块是在 Python2.3 中新增的, 它定义了一些函数和类帮助你的程序实现灵活
的日志系统。共有五级日志级别: 紧急, 错误,警告,信息和调试。
历史上,因为不同的人们为了满足不同的需求重复实现了很多性能测试器,Python 也有好
几个性能测试模块。 最早的 Python profile 模块是 Python 写成的,用来测试函数的执行时
间,及每次脚本执行的总时间,既没有特定函数的执行时间也没有被包含的子函数调用时间。
在三个 profile 模块中,它是最老的也是最慢的,尽管如此, 它仍然可以提供一些有价值的性
能信息。 hotshot 模块是在 Python2.2 中新增的,它的目标是取代 profile 模块, 它修复了
profile 模块的一些错误, 因为它是用 C 语言写成,所以它有效的提高了性能。 注意 hotshot
重点解决了性能测试过载的问题, 但却需要更多的时间来生成结果。 Python2.5 版修复了
hotshot 模块的一个关于时间计量的严重 bug。
cProfile 模块是 Python2.5 新增的, 它用来替换掉已经有历史的 hotshot 和 profile 模
块。被作者确认的它的一个较明显的缺点是它需要花较长时间从日志文件中载入分析结果, 不
支持子函数状态细节及某些结果不准。它也是用 C 语言来实现的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值