blog | 业余项目 | 关于Karry | RSS订阅 | 我在阅读 | 管理

Posts Tagged ‘Python 学习笔记’

Python学习笔记(2)

星期五, 九月 4th, 2009
  1. Python中没有 switch case语句,只有if elif else
  2. 字符串、数字、元组是不可变的,改变其值会创建新的对象(这也是为什么大量字符串的拼接会导致效率降低的原因)
  3. 字符串模版(直觉是这个功能做WEB的时候很有用,可以轻易的实现根据模版生成静态页面的功能):
    from string import Template
    s = Template("There are ${test}")
    print s.substitute(test="python")  ==>输出 There are python 
    substitute中参数如果没有对应声明字符串模版中的
    Template 对象还有另外一个方法save_substitute(),该方法在没有声明key的情况下不会报错,直接输出
  4. 浅拷贝与深拷贝
    在拷贝一个列表时,有两种拷贝方式。浅拷贝,就是新创建了一个类型跟原类型一样,其内容是原来对象的引用,也就是说这个拷贝本身是新的,但是它的内容不是。而深拷贝则是建了一个与原对象独立的,但值一模一样的新对象。
    如何实现浅拷贝?
    通常有三种方式,(1)完全的切片操作[:](2)利用工厂函数,比如list(),dict()等。(3)使用copy模块的copy函数。
    a 前拷贝的示例:
    person = ["name",['male',19]]
    girl = person[:]    # 将人这个列表浅拷贝到girl
    boy = person[:]  # 将人这个列表浅拷贝到boy
    gilr[0] = "lily"   #修改名字
    gril[1][0] = "female"
    boy[0] = “john”
    boy[1][0]="male"
    boy[1][1]=22

      例认为打印出girl 和boy结果是什么?
    boy ====>  ["johu",['male',22]]
    girl ====>   ["lily",['male',22]]
    为什么名字相互之间没有影响,而性别和年龄之间有影响呢?这是因为该列表中的第一个元素是一个字符串,是一个不可变的对象,一旦对其修改,就会独立生成一个新的对象。因此当拷贝的时候,字符串被显示的拷贝了,而列表只是拷贝了一个引用。
    那么,如何实现深拷贝
    在copy模块,有一个deepcopy()方法,可以轻松实现深拷贝。

 

Python学习笔记(1)

星期五, 八月 28th, 2009

由于公司的服务器端用的是Python,所以决定抽点时间熟悉一下,也好在以后的工作中能和其他同事有比较好的配合。

我主要是把Python和其他语言(特别是Javascript和c#,因为我熟悉)一些不一样的特性列出来。

首先说一下对Python的大体印象,Python和Javascript一样是解释性的语言,也是弱类型的语言。同时也是面向对象的一种语言,一切皆是对象:甚至字符串,变量,函数,都是对象。Python的设计也非常酷,用起来很灵活,习惯使用Javascript的人,一定会爱上Python 

  1. 没有大括号,靠缩进来控制代码块的开始与结束。语句结束不用分号,但一行中有多个语句,用分号隔开。
  2. // 运算符和 ** 运算符
    //特殊的除法运算(千万别以为是注释代码的,Python的代码注释用#),运算符对整型和浮点型都会取整。如:2.0//3.0=0   **是就幂,如:2**3 表示2的3次方。
  3. 不等号有两种写法 != 和<>
  4. 逻辑操作符的关键字是 and or not
  5. 三引号(三个连续的单引号或者双引号)中的特殊字符自动转义
  6. Python中没有数组,只有列表,但其特性跟js中的数组一样,也就是长度可变的数组。
  7. 列表可以用引号(:)来获取元素
    如:a = [0,1,2,3]   a[1:4] =[1,2,3]   a[:3]=[0,1,2]   a[1:] = [1,2,3]
  8. for 循环就相当于c#中的foreach ,有一个range函数来提供索引.
    #遍历数组
    a = [1,2,3]
    for(item in a):
        print item
    #另外一个例子
    for eachNum in range(3)
        print eachNum

    这里 range(obj1,obj2)为内建函数。obj1不提供默认为0,obj2不提供默认为1,返回一个从obj1到obj2的数组

  9. 可以多元赋值
    x,y= 1,2  等价于  x=1 y=2      x,y = y,x   交换x和y的值(很好很强大,哈哈)
  10. 布尔值为False的对象有
    None(相当于js中的null),False,所有值为0的数,空字符串”(注:’0′为True),空元组(),空列表[],空字典{}
  11. 多个比较操作符可以在同一行中进行
    3<4<5  等同于(3<4 and 4<5)
  12. 用 is 来判断两个变量是否指向同一个对象。
    a is b 等同于id(a) is id(b)      id()是获取对象的内存编号。但是要注意的是 Python为了提高性能会对整型和字符串类型进行缓存。但对浮点型不会。
    例如 a =2 ;b = 2; a is b  返回True,a=2.0;b=2.0 a is b 返回False
  13. 逻辑操作符的优先级 not 高于 and  高于 or
  14. 几个标准内建函数
    type(obj) 获取obj的类型,类似Javascript中的type of
    str(obj) 将obj 转换为 字符串类型
    repr(obj)是奖obj 序列化,转换为字符串,但是可以通过eval()还原,所以obj == eval(repr(obj))
  15. 与Javascript一样,Python 不支持方法和函数的重载(弱类型语言的特点)
  16. 字符串和列表、元组统称为序列,可以进行 in 、not in、+、*操作
    obj in seq  判断obj 元素是否包含在seq中,在返回True,不在返回False
    + 操作符可以把两个序列连接起来。  [1,2,3] +[4,5,6] == [1,2,3,4,5,6]
    * 操作符把一个序列拷贝多分。  [1,2]* 2 == [1,2,1,2]
  17. 列表的下标可以是负数,负数标识从结束点往左找。
    [1,2,3][-2]==2

今天先到这里,未完待续

12/29 更正:感谢butterinsect ,我确实没有弄清楚,python是强类型的语言,确切的说是,python是隐式类型的强类型语言。也就是说,在声明变量的时候,不需要显式说明它的类型,但是在Python里,是有明确的类型的概念,而且不同类型的对象不能相互替代和操作,比如:

>>> 10 + '20'

会出现错误 TypeError: unsupported operand type(s) for +: ‘int’ and ’str’