###3.1语句和语法
Python语句中有一些基本的规则和特殊字符:
- 井号(#)表示自后的字符为python注释
- 换行(\n)是标准的行分割符
- 反斜线()继续上一行
- 分号(;)将两个语句连接在一行中
- 冒号(:)将代码块的头和体分开
- 语句(代码块)用缩进的方式体现
- 不同的缩进深度分隔不同的代码块
- Python文件以模块的形式组织
####3.1.1注释(#)
Python注释语句从#字符开始,注释可以在一行的任何地方开始,解释器会忽略掉该行#之后的所有内容.
####3.1.2继续(\)
Python语句,一般使用换行分隔.当一行语句过长的时候可以使用反斜杠()分成几行
有两种例外情况一个语句不使用反斜线也可以跨行.在使用闭合操作符是,单一语句可以跨多行,例如:在含有小括号 中括号 大括号的时候可以多行书写.
####3.1.3多个语句构成代码组(?
缩进相同的一组语句构成一个代码块,我们称之为代码组.像if while def 和class这样的复合语句,首行以关键字开始,以冒号(:)结束,该行之后的一行或多行代码构成代码组.将首行及后面的代码组称为一个字句(clause).
####3.1.4代码组由不同的缩进分割
随着缩进深度的增加,代码块的层次也在加深,没有缩进的代码块是最高层次的,也称作脚本的"main"部分.
####3.1.5同一行书写多个语句
分号(;)允许你将多个语句卸载同一行上,语句之间用分号隔开,但这些语句不能在这一行开始一个新的代码块.()
####3.1.6模块
每个Python脚本文件都可以被当成一个模块.模块以磁盘文件的形式存在,当一个模块变得过大的时候,并且驱动了太多的功能的话,就应该考虑拆分一些代码出来,新建一个模块.模块里的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导入(import)调用
###3.2变量赋值
Python语言中,等号(=)是主要的赋值运算符
python的赋值语句不会返回值
####3.2.1增量复制
等号可以和一个算术运算符结合在一起,将计算结果重新赋值给左边的变量
x = x + 1
可以写为
x += 1
增量赋值相对普通赋值不仅仅是写法上的改变,最有意义的变化是第一个对象仅被处理一次.可变对象会被就地修改(无修改拷贝引用),不可变对象则和x = x + 1的结果一样(分配一个新的对象
)
####3.2.2"多元"赋值
将多个变量同时赋值的方法称之为多元赋值
>>> x, y, z = 1, 2, "aaa"
>>> x
1
>>> y
2
>>> z
'aaa'
###3.3 标识符
相当于变量的命名,有些系统内置的标识符,不可被使用,否则会引起语法错误(SyntaxError异常)
####3.3.2 合法的Python标识符
- 第一个字符必须是字母或下划线
- 剩下的字符可以是字母和数字或者下划线
- 大小写敏感
标识符不能以数字开头;除了下划线,其他的符号都不允许使用.
####3.3.2 专用下划线标识符
- _xxx 不用’from module import *’ 导入
- __xxx类中私有变量名
- __xxx__系统定义名称
核心风格: 避免用下划线作为变量名开始
###3.4 基本风格指南
- 注释
合理准确的使用注释,有利于节省每个人的时间和精力
- 文档
Python提供了一个机制,可以通过__doc__特别变量,动态获得文档字符串.在模块,类中声明,或函数声明中第一个没有赋值的字符串可以用属性obj.__doc__来进行访问
- 缩进
默认使用四个空格缩进
- 选择标识符名称(变量)
尽量能表达标识符的含义
####3.4.1 模块结构和布局
- 起始行(类unix)
- 模块文档
- 模块导入
- 变量定义
- 类定义
- 函数定义
- 主程序
(1) 起始行
有起始行就能仅输入脚本名字来执行脚本,无需直接调用解释器
######(2)模块文档
简要介绍模块的功能及重要全局变量的含义,模块外可以通过module.__doc__访问这些内容
######(3)模块导入
导入当前模块的代码所需要的所有模块;每个模块仅导入一次;函数内部的模块导入代码不会被执行,除非该函数正在执行
######(4) 变量定义
这里定义的变量为全局变量,本模块中的所有函数都可直接使用.(尽量使用局部变量来代替全局变量,这样便于维护,而且还可以提高性能并节省内存)
######(5)类定义语句
所有的类都需要在这里定义.当模块被导入时class语句会被执行,类也就会被定义.类的文档变量为class._doc_
######(6) 函数定义语句
此处定义的函数可以通过module.function()在外部被访问到,当模块被导入时def 语句会被执行,函数也就都会定义好,函数的文档变量是function._doc_
######(7)主程序
无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码.通常这里不会有太多功能性代码,而根据执行的模式调用不同的函数.
核心笔记
如果模块是被导入, __name__的值为模块名字
如果模块是被直接执行,__name__的值为’_main_’
####3.4.2 在主程序中书写测试代码
测试代码仅当该文件被直接执行时运行.我们利用__name__变量来控制,将测试代码放在一个叫main(),或者test()等随便你怎么搞得函数中,如果该模块是被当做脚本运行,就调用这个函数.
这些测试代码应该随着测试条件及测试结果的变更及时修改,每次代码更新都应该运行这些测试代码,以确认修改没有引发新问题.(为了让你的代码更加牛逼,建议这样做)
###3.5 内存管理
变量和内存管理的细节
- 变量无需事先声明
- 变量无需指定类型
- 程序员不用关心内存管理
- 变量名会被回收
- del语句能够直接释放资源
####3.5.1 变量定义
变量在第一次被赋值时自动声明
####3.5.2 动态类型
在创建(赋值)时,解释器会根据语法和右侧的操作数来决定新对象的类型.在对象创建后,一个改对象的应用会被赋值给左侧的变量.
####3.5.3 内存分配
python解释器自动会处理这些东西,我们目前可以不用关心这些
####3.5.4 引用计数
要保持追踪内存中的对象,聘用合同使用了引用计数来记录着所有使用中的对象各有多少个引用.一个内部跟踪变量,成为一个引用计数器,而每个对象各有多少个引用,简称引用计数.当对象被创建时,就创建了一个引用计数,当这个对象不再需要时(对象的引用计数变为0时,它被垃圾回收.(并不是100%))
#####增加引用计数
当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就被设置为1.
当同一个对象(的引用)又被赋值给其他变量时,或作为参数传递给函数,方法或实例时,或者被赋值为一个窗口对象的成员时,该对象的一个新的引用,或者称作别名,就被创建(则该对象的引用计数自动加1)
#####减少引用计数
当对象的引用被销毁时,引用计数会减小.例,当引用离开其作用范围时(函数运行结束时),所有局部变量都被自动销毁,对象的引用计数也就随之减少
当变量被赋值给另外一个对象时,原对象的引用计数也会自动减1
######引用计数减少情况
x = 3.14
y = x
foobar(x)
mylist = [123, x, 'xyz']
- 本地引用离开其作用范围
- 对象的别名被显式的销毁(del)
del y 或 del x
- 对象的一个别名被赋值给其他的对象
x =123
- 对象被从一个窗口对象移出
mylist.remove(x)
- 窗口对象本身被销毁
del mylst
######del语句
语法:del obj[,obj2[,… objN]]
注释:Del语句会删除对象的一个引用
del y
- 从现在的名字空间中删除y
- x的引用计数减一
#####3.5.5 垃圾收集
不再被使用的内存会被一种称为垃圾收集的机制释放.解释器跟踪对象的引用计数,垃圾收集器负责释放内存.垃圾收集器是一块独立的代码.它用来寻找引用计数为0的对象.它也负责那些虽然引用计数大于0但也应该被销毁的对象.特定情形会导致循环引用.
一个循序应用发生在当你有至少两个对象互相引用时,也就是说所有的引用都消失时,这些引用仍然存在,这说明只靠应用技术是不够的.Python的垃圾收集器实际上是一个引用计数器,和一个循环垃圾收集器.当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问(可到达)的其它对象.作为引用计数的补充,垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象.在这种情况下,解释器会暂停下来,试图清理所有未引用的循环.
###3.6 扯完蛋的第一个python程序
提醒用户输入一个(不存在的)文件名,然后由用户输入该文件的每一行.最后将所有文本写入文本文件.
#!/usr/bin/env python
#coding:utf-8
import os
#根据系统判断换行符
ls = os.linesep
while True:
file_name = raw_input('input file name')
#os.path.exists文件存在则返回True,文件损坏返回False
if os.path.exists(file_name):
print ("Error:'s%' already exists" % file_name)
else:
break
all = []
print ("\nEnter lines('.' by itself to quit). \n")
while True:
entry = raw_input('>')
if entry == '.':
break
else:
all.append(entry)
fobj = open(file_name, 'w')
#[expr for value in collection ifcondition]
'''expr:表达式'''
fobj.writelines(['%s%s' %(x,ls) for x in all])
'''
x:每行数据
ls:换行符
'''
fobj.close()
print ('Done!')
查看上一步创建的文件
#!/usr/bin/env python
#coding:utf-8
file_name = raw_input("Enter you filename:")
try:
fobj = open (file_name, 'r')
except IOError, e:
#except <错误名字>,<错误数据>:
print "***file open error:", e
else:
for line in fobj:
print line,
fobj.close()