Python核心编程(第二版)第3章 Python基础


 

3.1 语句和语法

3.1.1注释#

Python注释语句从#字符开始,注释可以在一行的任何地方开始,解释器会忽略掉该行#之后的所有内容。

print 'Hello World'  #Print "Hello World", this is the first line code of mine for IronPython

3.1.2继续\

today_weather = raw_input("Today's Weather:")

 

 

if today_weather != "Hot" and \

today_weather != "Rainy":

    print "It's a cool day, %s" % today_weather

3.1.5同一行书写多个语句(;)

分号(;)允许你讲多个语句写在同一行上,语句之间用分号隔开,而这些语句也不能在这行开始一个新的代码块。

import sys; x = 'foo'; sys.stdout.write(x + '\n')

3.1.6模块

Python文件以模块的形式组织。

3.2 变量赋值

Python中变量是通过引用传递的,在赋值时将该对象的引用赋值给变量。Python的赋值语句不会返回值。

>>> x = y = 2 + 2

>>> print x, y

4 4

>>>

3.2.2增量赋值

增量赋值相对于普通赋值好处是可变对象被就地修改,不用分配新对象。

>>> z = 2

>>> z += 1

>>> print z

3

>>>

python不支持前置/后置自增/自减运算。

3.2.3多重赋值

>>> x = y = z = 1

>>> print x, y, z

1 1 1

>>>

3.2.4“多元”赋值

>>> (x, y, z) = (1, 2, 'a string')

>>> print x, y, z

1 2 a string

>>>

>>> (x, y) = (1, 'a string')

>>> (x, y) = (y, x)

>>> print x, y

a string 1

>>>

3.3 标识符

3.3.1合法的Python标识符

第一个字符必须是字母或下划线(_);

剩下的字符可以是字母和数字或者下划线

大小写敏感

3.3.4专用下划线标识符

Python用下划线作为变量前缀和后缀指定特殊变量。

3.4 基本风格指南

3.4.1模块结构和布局

_name_指示模块应如何被加载。如果模块是被导入,_name_的值为模块名字;如果模块是被直接执行,_name_的值为’_name_‘.

主程序调用main函数

在python中,当一个module作为整体被执行时,moduel.__name__的值将是"__main__";而当一个module被其它module引用时,module.__name__将是module自己的名字,当然一个module被其它module引用时,其本身并不需要一个可执行的入口main了。可以说python中的这种用法很灵活啊。

3.4.2在主程序中书写测试代码

Python标准库中提供了unittest模块,有时候它被成为PyUnit,是一个测试框架。

3.5 内存管理

3.5.1变量定义

在Python中,无需此类显示变量声明语句,变量在第一次被赋值时自动声明。变量只有被创建和赋值后才能被使用。

3.5.2动态类型

Python中不但变量名无需事先声明,而且也无需类型声明。在Python语言中对象的类型和内存占用都是在运行时确定的。在创建时,也就是赋值时,解释器会根据语法和右侧的操作数决定新对象的类型。在对象创建后,一个该对象的引用会被赋值给左侧的变量。

3.5.3内存分配

在变量分配内存时,是在借用系统内存,在用完之后,应该释放借用的系统资源。Python解释器承担了内存管理的复杂任务,这大大简化了应用程序的编写。

3.5.4引用计数

Python内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量成为一个引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,它被垃圾回收。

1.增加引用计数

对象被创建

另外的别名被创建

被作为参数传递给函数

作为容器对象的一个元素

2.减少引用计数

一个本地引用离开了其作用范围

对象的别名被显示销毁

对象的一个别名被赋值给其他对象

对象被从一个窗口对象中移除

窗口对象本身被销毁

del 语句删除一个变量。 执行del x会删除该对象的最后一个引用,也就是该对象的引用计数会减少为0,这会导致该对象从此“无法访问”或“无法抵达”。从此刻起,该对象就成为垃圾回收机制的回收对象。任何追踪或调试程序会给一个对象增加一个额外的引用,这会推迟该对象被回收的时间。

3.5.5垃圾回收

虽然解释器跟踪对象的引用计数,但垃圾收集器负责释放内存。垃圾收集器是一块独立的代码,它用来寻找引用计数为0的对象。它也负责检查那些虽然引用计数大于0但也应该被销毁的对象。Python的垃圾收集器实际上是一个引用计数和一个循环垃圾收集器。

3.6 第一个Python程序

 

创建文件并写入内容

#!/user/bin/env python

'makeTextFile.py -- Create text file'

 

import os

ls = os.linesep

 

# get file name

fname = raw_input("FileName:")

while True:  

    if os.path.exists(fname):

        print "Error '%s' already exists" % fname

        fname = raw_input("FileName:")

    else:

        break

 

# get file content (text) lines

all = []

print "\n Enter lines ('.' by itself to quit). \n"

 

# loop until user terminates input

while True: www.2cto.com

    entry = raw_input('> ')

    if entry == '.':

        break

    else:

        all.append(entry)

 

# write lines to file with proper line-ending

fproj = open(fname, 'w')

fproj.writelines(['%s%s' % (x,ls) for x in all])

fproj.close()

print 'Done!'

os.path.exists() 判断文件是否存在

os.lineseq 行结束符,跨平台,Unix下代表'\n', win32下代表'\r\n'。

文件对象的writelines()方法接收包含行结束符的结果列表。

['%s%s' % (x,ls) for x in all] 列表解析,使用一个for循环将所有结果输入到一个列表中。

 

文件读取和显示

#!/user/bin/env python

 

'readTextFile.py -- read and display text file'

 

# get filename

 

fname = raw_input('Enter filename: ')

print

 

try:

    fobj = open(fname, 'r')

except IOError, e:

    print "*** file open error:", e

else:

    # display contents to the screen

    for eachLine in fobj:

        print eachLine,

    fobj.close()

try-except-else语句中的else子句在try代码块运行无误时执行。

摘自:xufei96的专栏

相关内容

    暂无相关文章

评论关闭