3-1.标识符。为什么Python中不需要变量名和变量类型声明?
答:python是动态类型语言,也就是说不需要预先声明变量的类型。变量的类型和值在赋值那一刻被初始化。python语言中对象的类型和内存都是运行时确定的。在创建也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。
3-2.标识符。为什么Python中不需要声明函数类型?
答:应该和上面的解释差不多,python语言中对象的类型和内存都是运行时确定的。在创建也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。
3-3.标识符。为什么应当避免在变量名的开始和结尾使用双下划线?
答:Python用下划线作为变量前缀和反缀指定特殊变量。
_XXX 不用’from module import *’导入
_ _ XX _ _(快捷方式冲突,前后双下划线) 系统定义名字
__XXX 类中的私有变量名
3-5.语句。在Python中可以将一个语句分成多行书写吗?
答:可以,一行过长的语句可以使用反斜杠( \ ) 分解成几行。
3-6.变量赋值
(a)赋值语句x, y, z = 1, 2, 3会在x、y、z中分别赋什么值?
(b)执行z, x, y = y, z, x后,x、y、z中分别含有什么值?
答:a)x,y,z=1,2,3……b)3,1,2
3–13.
添加新功能。将你上一个问题改造好的 readNwriteTextFiles.py 增加一个新功
能:允许用户编辑一个已经存在的文本文件。 你可以使用任何方式,无论是一次编辑一行,还
是一次编辑所有文本。需要提醒一下的是, 一次编辑全部文本有一定难度,你可能需要借助 GUI
工具包或一个基于屏幕文本编辑的模块比如 curses 模块。要允许用户保存他的修改(保存到
文件)或取消他的修改(不改变原始文件),并且要确保原始文件的安全性(不论程序是否正
常关闭)。
#!/usr/bin/env python
'''ask people to wirte or read a file '''
import os
ls = os.linesep
myfile = "your file path and name"
choice = raw_input("choice to write or read or change file text:(w/r/c)")
#choose to write file
if choice =='w':
#file exist
if os.path.exists(myfile):
print ("%s is exist!!!"%myfile)
allText=[]
print "enter text(stop until you enter '.'):"
while True:
entry = raw_input(">")
if entry !=".":
allText.append(entry)
else:
break
fobj = open(myfile, 'w')
fobj.writelines('%s%s'% (x,ls) for x in allText)
fobj.close()
print "Done"
#choose to read file
elif choice == 'r':
try:
fobj = open(myfile, 'r')
except IOError, e:
print "open file erroe", e
else:
for eachline in fobj:
print eachline
print "Read"
fobj.close()
#choose 'c', to change the file
else:
print "changed the line until you enter <0"
try:
fobj = open(myfile, 'r')
except IOError, e:
print "open file erroe", e
else:
allContext = fobj.readlines()
while True:
lenText = len(allContext)
changeLine = int(raw_input("choice one line to change(not exist,append after file):"))
if changeLine >= 0:
changeText = raw_input("input the text you wanted to change:")
if changeLine < lenText:
allContext[changeLine] = changeText
else:
allContext.append(changeText)
else:
break
save = raw_input("Save?(y/n):")
if save =="y":
fobj = open(myfile, 'w')
fobj.writelines('%s%s'%(x, ls)for x in allContext)
fobj.close()
print "changed"
代码总结:简单粗暴,性能差,不过刚学,我只能用不断复写来修改编辑文本了。
1、Traceback (most recent call last):
File "./readNWriteFile.py", line 68, in <module>
fobj.writelines(allContext)
IOError: [Errno 9] Bad file descriptor
原因:文件想要用读写方式打开,所以我直接传了模式rw,最后出错了。python不支持直接rw的写法。所以最后改成上面代码了,一次可读打开,一次可写。
》》你打开一个写文件(w), 却尝试用read读取!
2、python赋值问题
和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。
python一般内部赋值变量的话,都是传个引用变量,和C语言的传地址的概念差不多。可以用id()来查询内存地址
如果a=b的话, a和b的地址是相同的;如果只是想拷贝,那么就得用 a=b[:]。
!!!注意这一点,这可是可以引起重大错误的。。。
x,y,z=1,2,3 其实这是元组赋值,可以写成(x,y,z=1,2,3),对应位置的变量获得对应的值。
其中需要说明的是1,2,3是对象,x,y,z是引用。
在执行x,y=y,x时,y,x这个元组其实已经被转换为2,1了,然后直行赋值后,引用x指向了对象2,引用y指向了对象1。例如:
>>> x,y,z=1,2,3
>>> id(x)
3508720
>>> id(y)
3508708
>>> id(z)
3508696
>>> x,y=y,x
>>> id(x)
3508708
>>> id(y)
3508720
>>>
3、关于python异常处理
感觉作者写的不错,搬过来了:http://www.th7.cn/Program/Python/201405/197007.shtml
python中try/except/else/finally语句的完整格式如下所示:
try:
Normal execution block
except A:
Exception A handle
except B:
Exception B handle
except:
Other exception handle
else:
if no exception,get here
finally:
print("finally")
说明:
正常执行的程序在try下面的Normal execution block执行块中执行,在执行过程中如果发生了异常,则中断当前在Normal execution block中的执行跳转到对应的异常处理块中开始执行;
python 从第一个except X处开始查找,如果找到了对应的exception类型则进入其提供的exception handle中进行处理,如果没有找到则直接进入except块处进行处理。except块是可选项,如果没有提供,该exception将会被提交给 python进行默认处理,处理方式则是终止应用程序并打印提示信息;
如果在Normal execution block执行块中执行过程中没有发生任何异常,则在执行完Normal execution block后会进入else执行块中(如果存在的话)执行。
无论是否发生了异常,只要提供了finally语句,以上try/except/else/finally代码块执行的最后一步总是执行finally所对应的代码块。
需要注意的是:
2.对于上面所展示的try/except完整格式而言,else和finally都是可选的,而不是必须的,但是如果存在的话else必须在finally之前,finally(如果存在的话)必须在整个语句的最后位置。
3.在上面的完整语句中,else语句的存在必须以except X或者except语句为前提,如果在没有except语句的try block中使用else语句会引发语法错误。也就是说else不能与try/finally配合使用。
4.except的使用要非常小心,慎用。
class AError(Exception):
"""AError---exception"""
print('AError')
try:
#raise AError
asdas('123')
except AError:
print("Get AError")
except:
print("exception")
else:
print("else")
finally:
print("finally")
print("hello wolrd")
在 上面的代码中,Normal execution block中出现了语法错误,但是由于使用了except语句,该语法错误就被掩盖掉了。因此在使用try/except是最好还是要非常清楚的知道 Normal execution block中有可能出现的异常类型以进行针对性的处理。