在C++的程序员眼中,脚本是个奇葩的逻辑。当然也可能我比较奇葩。不过从Lua走过来,python的理解也不那么难。记录一下刚学python要注意的东西,也算是个快速入门吧。如果你是从C++过来的,那你来对地方了。
避免运行脚本闪过可以添加raw_input()。这相当于getline。
在命令行中可以直接键入filename.py来运行脚本。导入模块用import moduleName。注意没有.py。然后使用moduleName.attr即可使用相应的属性。也可使用from module import attr命令,如此做则可直接使用属性。第一次导入模块时会运行脚本,但第二次导入不会。用reload可以重写导入模块,并运行模块。交互模式下使用dir(moduleName)可以列出模块中的属性名称。
Python内置对象
数字:
**表示乘方。
import math导入数学库,可使用pi、sqrt等常用方法。
import random 导入随机数库。
使用random.random()产生0-1的随机数。也可random.choice([1,2,3,4]),在列表中选择。
random.int(1,10),在1到10中产生随机数。
字符串:
字符串是常量,不可更改,只能重新赋值。
len()计算长度。支持下标随机访问。
可以用s[-1]的方式表示倒数,其等效于s[len(s)-1]。
拆分字符串用分片(slice)机制。
形式为X[I:J]。表示取出X中从I到J的内容,左开右闭。
如果I、J空出来,则分别表示0和len(X)。当然I、J可为负数。
字符串连接可以用'+',例如:S = S +'a'。此时S已经创建了一个新对象了。
字符串查找使用find(),返回偏移量位置。
字符串替换使用replace返回替换后的串。
字符串的split使用split函数。分成的结果存入一个列表。
字符串有基本操作的一些方法,如:upper、isalpha、rstrip等。
三引号可定义一段复杂文本。这些文字会被转化为相应的串,包含制表符等符号。同时也可用作注释,相当于/***/
帮助:
dir(变量)的方法可以列出对象的所有属性和方法。具体方法的解释可使用help命令。例如:help(S.index)。
模式匹配:
import re。具体涉及正则表达式,再查吧。
列表:
列表能够进行索引,切片等操作,像对字符串一样。例如用[:]、[-1]等。
列表与数组有些类似,但强大的多。列表没有固定类型的约束,也能按需要增减大小,响应特定操作。有操作如:append、pop、'+'、sort、reverse。
列表解析通过在一个列表中运行一个表达式而建立一个新的列表。它编写在方括号中,并且有表达式和循环结构。有点像是sql语句。形如:
[func(value) for value in list [statment]]
这条语句会将每一个list中的元素赋值给value,检查statment中条件是否符合,然后运行func(value),将其值创建为新列表中的一个项。例如:[row[1] for row in M if row[1]%2 == 0]。
字典:
表示方法为{key:value,key:value...}。
value可以是任何数据类型比如列表。内存是自动管理的,不需要释放。
字典的输出并不是有序的,我推测内部实现方法是树。
固定顺序输出可先将键排序,再用for key in Keys: 的方法。或直接用sorted()方法。例如:for key in sorted(D): 。
可以通过.has_key判断是否有对应的键。
元组:不能更改,其它跟列表相似。
文件:
open(filename,weight)。默认权限为'r',创建或打开文件。write()写入文件。read()读出文件内容。注意只能读一次。
python中,按算符的优先级确定计算顺序。表的操作符中越靠后的优先级越高。当然还是提倡使用括号。
Floor除法。抛弃小数部分之后的除值,即%的商的部分。
python中长整形任意大。当长度超过int时,会自动转换为长整形。
支持位操作。八进制数以0开头,16进制以0x开头。oct(num)、hex(num)、int()可以对数字进行转换。
脚本动态对象实现逻辑:
每一个声明出的变量名并没有实际的类型,变量名是一个void指针,指向对象。另一方面,对象知道自己的类型,每个对象都包含了一个头部信息,标记了这个对象的类型。赋值有三个操作:创建一个对象、创建一个变量、将变量与对象连接。
当变量名指向新对象时,旧对象内存就被回收(这要是能不慢都见鬼了)。
变量不能指向变量。只能指向对象。因此当两个变量之间赋值时,实际意思是要保持一致。他们实际上共享了对象。这样就不会存在内存访问的问题,代价就是效率低到爆。当原变量更改而不是对象更改时,会产生分歧。因此对于列表L2=L1,当L1中的值改变时,对象变了,变量并没有变,所以L2的值也会变化,如果你不希望这样可以简单的使用分片技术:L2 = L1[:]。如果是字典的话,就要import copy,使用copy.copy()函数了。
使用"=="操作符,测试两个被引用的对象是否值相同。"is"操作符,检查对象是否指向同一对象。注意小的数字和字符串是在缓存中被复用的。因此is判断会为真。
大概就写这些,以后可能在这里再增加。有必要也会新写一篇,欢迎大家关注。