注释句从 # 开始,到此行结束。当然还有三引号那种长注释,如下
'''里面全是注释,可以是段落'''
这个是反斜杠,一直搞不明白反斜杠跟斜杠,这个记住吧。
如果一行代码太长,就用这个反斜杠
if (weather_is_hot == 1) and \ (shark_warnings == 0): send_goto_beach_mesg_to_pager()
当然,也有例外:
1.闭合操作符内可以不用,如小括号、中括号、大括号内可以多行书写
a = ['apple','banana', 'watermelon' ]
2.三个引号内的字符串
print '''Today is saturday, it is a sunny day. May I have a nice tomorrow.'''
缩进相同的语句构成代码块,我们叫做代码组。
以if,while,def,class这些关键字开头,并且夹带着其后面的代码组我们称之为
子句(clause)
核心风格:缩进4个空格,避免只用制表符。
这个深有体会,当我从notepad里面复制代码到此页面的python框中时,就会发现缩进比较混乱。还要重新编辑空格
import sys; x = 'foo'; sys.stdout.write(x + '\n')
用 ; 可以把不同行的语句放在同一行,只是这样的话可读性变差,不建议使用。
这小结内没有什么可说的,模块以磁盘文件的形式存在,每个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]
这里看似简单,其实更深层次有些意思
赋值不是把数值或者字符串的值直接给变量,而是将对象的引用(不是对象的值)赋值给变量。注意是引用!
赋值还有一些写法:
>>>x = 1 >>>y = x = x + 1 >>>x,y (2,2)
问:为啥会有小括号?
>>>x = 2 >>>x += 1 #相当于x = x + 1 >>>x 3
同理还有
+= -= *= /= %= **= , <<= >>= &= ^= |= (后面这5个应该是位操作)
还有这些操作:
>>> aList = [123, 'xyz'] >>> aList += [45.6e7] >>> aList [123, 'xyz', 456000000.0]
3.2.3 多重赋值
就是为了懒省事,做出了这些操作
>>> x = y = z = 1 >>> x 1 >>> y 1 >>> z 1
为了省事,这都行
>>>a,b,c = x,y,z #这不是省事这是什么,哈哈 >>>a,b,c (1,1,1) >>>x,y = 1,2 >>>x,y (1,2) >>>x,y = y,x >>>y,x (2,1)
定义:是计算机语言中允许作为名字的有效字符串集合。有些关键字比方def、and、for等等,这些事保留字,不做其他用途
合法的:
第一个字符必须是字母或者下划线
剩下的字符可以是字母下划线或者数字
区分大小写
这个不多赘述
Python有内建名字的集合,这些名字由解释器设置或者使用。
其他过多的了解也没啥用
核心风格:避免用下划线作为变量名的开始。
因为变量名_xxx 被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。变量名__xxx__对Python 来说有特殊含义。
_xxx 不用'from module import *'导入
__xxx__系统定义名字
_xxx 类中的私有变量名
3.4 基本风格指南
对注释 文档(通过xx.__doc__访问) 缩进 标识符名称做了一些规范
觉得这个一节讲的很好,或者说收获颇大,因为这个毕竟是以后编码的规范啊~~
#/usr/bin/env python #1).起始行 "this is a test module" #2).模块文档(文档字符串) import sys #3).模块导入 import os debug = True #4).(全局)变量定义 class FooClass(object): #5).类定义(若有) "Foo class" pass def test(): #6).函数定义(若有) "test function" foo = FooClass() if debug: pring 'Ran test()' if __name__ = "__main__": #7).主程序 test()
1).仅在类Unix环境下才使用起始行
2).介绍模块功能和全局变量的含义
3).~7).简略啦
核心风格:主程序调用main()函数
主程序中的代码通常包括变量赋值、类定义和函数定义。
核心笔记:__name__只是模块应如何被加载
由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。 这种情况下,你只想访问那些位于其它应用程序中的代码,而不是想运行那个应用程序。因此一个问ti出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动).....没错! __name__ 系统变量就是正确答案。
如果模块是被导入, __name__ 的值为模块名字
如果模块是被直接执行, __name__ 的值为 '__main__'
上面几行是copy过来的,这里加上自己查资料后的理解:
首先,一个模块就是一个对象,而__name__这个变量是这个模块(应该是所有模块都有)的属性。
如果在另外一个文件中import这个模块,这个__name__的值是此模块名;但当直接在powershell运行这个模块的时候(把它当作了执行文件),
变量__name__的值就变成了“__main__”(其实main本身是缺省的)。
用例子说明一下,毕竟我记性不大好,拐回来可能又忘了。
假设这个模块文件名是test.py
class Test: def __init(self):pass def f(self):print 'Hello, World!' if __name__ == '__main__': Test().f()
在powershell中运行
>python test.py Hello,World!
这种情况,__name__的值是__main__
但如果是这样(交互模式):
>>>import test >>>test.__name__ 'test'
看到没,这个时候__name__是test,也就是它的模块名,或者说是文件名都行。那'__main__'到哪里去了呢?接着上面
>>>__name__ '__main__'
原来,这个__main__是当前程序的__name__值
变量在第一次被赋值时自动声明,没什么过多可以讲的
>>>a = 1 >>>a = 'hello'
也就是说,这个类型Python会自己判断,无需声明
变量需要分配内存,在不用变量之后要释放内存。但在Python中,这个由解释器来完成,你不用操心
python内部记录所有对象的引用次数,这些引用次数叫做引用计数
引用计数的增加:
对象被创建 x = 4
被另外的别名创建 y = x
作为参数传递给函数 foobar(x)
成为容器对象的一个元素 mylist = [123, x, 'xyz']
引用计数的减少:
一个本地引用离开了其作用范围。比如 foobar()函数结束时。
对象的别名被显式的销毁。 del y
对象的一个别名被赋值给其它的对象 x = 123 #本来对象1的别名是x,然后123横刀夺爱,所以对象1的引用计数减一
对象被从一个窗口对象中移除 myList.remove(x)
窗口对象本身被销毁 del mylist
注意,引用计数是针对对象的,只有对象的引用计数增加或者减少
del语句:
del y会产生两种结果
>>>x = 3.14 >>>y = x >>>del y
从现在的名称空间删除y
x的引用计数减一
接上步,如果
del x,则x的引用计数变为0,垃圾收集器(一个独立代码)会释放其内存
垃圾收集器包括:引用计数器和循环垃圾收集器
这个循环垃圾收集器用来处理两个对象相互引用的情况(目前我没有碰到过),这种情况的发生是因为引用计数器发现不了相互引用的情况,所以有循环回收
#!/usr/bin/env python 'makeTextFile.py -- create text file' import os ls = os.linesep # get filename while True: fname = raw_input("please enter the filename:") #少这一行,勘误啊这是 if os.path.exists(fname): print "ERROR: '%s' already exists" % fname else: break # get file content (text) lines all = [] print "\nEnter lines ('.' by itself to quit).\n" # loop until user terminates input while True: entry = raw_input('> ') if entry == '.': break else: all.append(entry) # write lines to file with proper line-ending fobj = open(fname, 'w') fobj.writelines(['%s%s' % (x, ls) for x in all]) fobj.close() print 'DONE!'
我发现了一个大坑!!!,这买的中文版第二版的教材这段代码居然少一行,而且这个代码块没有缩进,擦擦擦浪费青春啊有木有
不过运行没有问ti了:
please enter the filename:abc Enter lines ('.' by itself to quit). >I love three things >the sun,the moon and you >I love the sun for day,the moon for night >and you forever >.
核心提示:使用局部变量替换模块变量
比方第6行,os.linesep(行结束符)解释器需要做两次查询:1)查找os确认它是个模块;2)在这个模块中查找linesep变量
这样os.linesep出现的次数多会消耗系统资源,所以有了ls = os.linesep。把这个常用的属性替换一个本地应用。高,实在是高!
没有什么过多需要说的