Python 3 笔记

本文以3.4版本实践。

基本知识

  1. “//” 整除运算符。1//2 输出 0,1/2输出0.5(2.x版本中默认当整数处理,输出0)
  2. “**” 幂运算,不用像其它一些语言一样函数调用了
  3. 2.x版本时可像C#中一样,给整数字面量加”L”后辍表示长整型,3.x版本不可以了
  4. 十六进制”0x”前辍,八进制”0″进辍
  5. “表达式”表示某事,”语句”表示做某事
  6. 两个字面量字符串通过空格就可拼接
  7. repr函数(转换为python字面量形式字符串)在2.x时代可以用反引号 ‘`’ 相等替换
  8. [”’]三个单引号形式的字符串字面量为长字符串表示形式,可以跨行,可以换成三个双引号,中间可以直接写引号而不需要转义了;
    普通字符串字面串要换行,需要在行尾加”\”反斜线,反斜线必须是最后一个字符;
    字符串字面量加前缀”r”,表示这是一个原始字符串,不将斜线当转义符(这时最后一个字符也不能是反斜线”\”,因为最后一个字符是反斜线时表示字符串未结束,下一行也是字符串的一部分),类似C#中的”@”字面量前缀
    “u”前缀表示字符串为Unicode对象,在python3.x中,所有字符串都是Unicode对象,此前缀也没有什么用了
  9. None是null的表现形式,True为true,False为false
  10. 序列解包(sequence unpacking)
    x, y ,z = 1, 2, 3 也可以 values=(1, 2, 3) 然后 x, y, z = values
    x, y = y, x
    x, y, *rest = 1, 2, 3, 4  //python3中的星号运算符,将后面后将赋值到rest中
  11. x += 1 叫做增量赋值(augmented assignment)
  12. 使用冒号(:)来表示语句块的开始,块中的每一个语句都是缩进的
  13. 比较连写:1<x<3
  14. “==”是值相等比较,”is”是引用比较(同一性比较,”is”叫同一性运算符)
  15. 同js,逻辑运算符返回表达式自身:acopy = a or b (可实现三目运算符 bcopy = a and b or c)
  16. python3的三目运算符:x = a if b else c
  17. 断言: assert 0 < x < 100,断言失败则报错(AssertionError)
  18. enumrate()可以在迭代时返回索引:for index, string in enumrate(strings):
  19. for x in seq:
    else:    //else子句仅在for中没有break时执行
  20. 列表推导式:利用其它列表创建新列表的一种方法。类似于for语句:[x * x for x in range(1, 10)]
    增加guard:[ x * x for x in range(1,10) if x % 3 == 0]
    增加for:[(x,y) for x in range(1,4) for y in range(2,5)],相当于嵌套for语句
    增加for 增加guard:[(x,y) for x in range(1,4) for y in range(2,5) if x==y ]
    使用 (x for x in range(1,10))不会得到“元组推导式”而是得到一个生成器(generator)
  21. pass 生成也不干,就为了构造完事的语法
    del 移除名字以及对象的引用,但不会移除对象(对象由垃圾回收器回收)
  22. exec(‘code’,scope)(对应python2中:exec <code> in <scope> ):用于执行语句,scope必须是dict;
    eval(exp,scope) :用于执行表达式,如 x = eval(‘1+1’)
    exec和eval都可以使用命名空间。可以给eval提供两个命名空间,一个全局的一个局部的,如scope={‘x’:1, ‘y’:2}, eval(‘x+y’,scope)
  23. with expression as var: do 类似C#的using(){}语句,可以简化try finally
  24. @ decorator修饰符,便捷的装饰者模式实现:
    @dec2
    @dec1
    def func(arg1, arg2, ...):
        pass
    

    This is equivalent to:

    def func(arg1, arg2, ...):
        pass
    func = dec2(dec1(func))

数据结构

序列sequence

序列中的每一个元素被分配一个序号-索引。本质上和数组一样。内建了几种序列:列表(list)、元组(tuple)、字符串(str)、buffer、xrange

列表可以修改,元组不可以修改。

列表的字面量形式”[1,3]”,元组的字面量形式”(1,2)”或省略括号简写”1,2″。

可以使用”+”、”*”、”in”等运算符,可用len、min、max等函数。

list

使用”del”删除元素,可删除分片:del a[3:5],同样可指定步长:del a[3:8:2]。

强大的分片赋值:a[1:]=[2,3],存在则修改,不存在则增加元素,直接插入:a[1:1]=[2,3]。实际上相当于js的splice:删除左边序列后插入右边序列,或者说用右边序列替换左边序列。

实例方法:append、count、extend(末尾追加序列)、index(查找元素索引)、insert、pop、remove、reverse、sort、join

字符串

字符串格式化操作符”%“:print(‘%s得%d分’ % (‘td’,100)),可以在转换说明符中用”*”号占位,表示参数从元组参数中读出:print( ‘%*s’ % (5,’td’))。如果参数是字典而不是元组,可以使用”%(key)”的形式:print(‘%(name)s得%(score)d分’ % {‘name’: ‘td’, ‘score’: 100})。

实例方法:find、split、lower、replace、strip(相当于觉的trim)、translate

字典(dict)

唯一的映射类型。键可以是任何不可变类型

字面量形式:{‘a’:1, ‘b’:2},注意,key同php中的key,不能像json一样省略key的引号。

构造:dict([(‘a’,1), (‘b’, 2)]) 、dict(dic)、dict(a=1, b=2)(这种关键字参数方式在python3.x中,声明顺序与存储顺序是相反的)

实例方法:clear、copy(浅复制)、fromkeys(没叼用)、get、has_key、items、keys、values、pop、popitem(返回元组)、setdefault(如果没有则新加一项并返回指定的value,如果已存在指定的key则直接返回与key对应的value)、update(用另一个字典更新自己,按key覆盖或添加新项)。iterkeys、itervalues和iteritems已被删除。

注意,for  in 迭代时是迭代key,相当于 for k in dic.keys()。想迭代键值对使用 for k,v in dic.items()

 函数

参数不能“引用”传递,如果要传递引用,只能使用小技巧:包装成列表传递。

调用支持命名参数,叫做“关键字参数(keyword argument)”。使用命名参数调用时,顺序就无所谓了。这可牛B了,可以字典解包!

参数带星号(*):收集其余参数,放在一个元组中,如:def pt(v1,*rest),rest为元组。星号还可以在调用是“反转过程”,pt(1,*(2,3)),星号作用在序列上。

参数带两个星号(**):收集其余“关键字参数”,放在一个字典中,如def pt(v1, *t, **pair),pair为字典。两个星号也可以用来“反转过程”,pt(1,*(2,3),**dict(name=’3q’,age=1))

globals() is vars()

使用global关键字重绑定全局变量,类似php。如 def m: global g,g为全局变量。

函数可以嵌套,内部的函数可以形成闭包。内部函数的外部作用域中的变量在python2中是不能重新绑定的,在python3中可以使用关键字nonlocal来重新绑定,类似global关键字。

lambda表达式:lambda x: x%2==1,当然,也是可以返回lambda表达式的:l=lambda x: lambda y: x ** y,调用l(2)就返回一个lambda表达式了。

 

发表评论

电子邮件地址不会被公开。