python学习--核心编程3习题解答以及知识点记录

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所对应的代码块。
需要注意的是:

  1. 在上面所示的完整语句中try/except/else/finally所出现的顺序必须是try–>except X–>except–>else–>finally,即所有的except必须在else和finally之前,else(如果 有的话)必须在finally之前,而except X必须在except之前。否则会出现语法错误。

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中有可能出现的异常类型以进行针对性的处理。

你可能感兴趣的:(python)