Python: statements

      statements是编程语言中重要部分。在Python中也是如此。statements代表一段逻辑。Python通过对齐(indent)控制statements。

赋值:

      正常的赋值就不提了。Python3支持一种特别的赋值方式: a,*b, c = [1,2,3,4,5] ,*b代表匹配剩下的。Python3在赋值前都会创建副本,比如 a,b = b,a 的赋值方式完全没有问题。 顺便提一下, print(a = 1) 这样的语句在Python中是不行的,因为赋值不返回值,跟C不一样。
      当然Python也支持 Augmented assignment statements。其实就是 X += Y 这样的。如果这里X是不可变的,那么这样操作与 X = X + Y 差别不大。但是如果X是可变的,比如list类型,那差别就大了。特别是效率问题。如下所示。变量是重新开辟了内存区域。

if:

      Python里只有if,没有switch。因为if…elif…也可以写的很漂亮。更因为Python可以直接用dict代替switch。仔细想想如何做。更强大的是可以直接switch到函数。如下:

      Python中的判断还是要注意的。像大小比较返回的是True、False,但是逻辑判断返回的居然是对象,因为在Python中每个对象都是固有的True或False。当然判断还是遵守short circuit的。如下:

循环:

      计算机就是用来循环的。Python的循环也不同寻常。Python很少用while,至少我很少用,因为for太强大了。平常的for不管了。Python的for是只要对方是个可迭代的,就可以使用 for i in X: 的形式。举例文件的读取。下面才是正确的做法。节省内存,效率也不低。唯一的弱点是f是iterator,只能顺序读一次。

      循环也经常与map,zip,enumerate配合使用。

Iterations:

      Iteration是Python中重要的类型。Python中有iterable和iterator。书上是这么说的。

The iterable object you request iteration for, whose __iter__ is run by iter
The iterator object returned by the iterable that actually produces values during
the iteration, whose __next__ is run by next and raises StopIteration when finished
producing results

      感觉还是不太明白,后来还是上网查查明白了。见stackoverflow。像list,dict,str等等都是iterable的。这样就可以做有趣的事了。普通的for一样可以。这里多了叫Comprehension的说法。其实就是把for写在[]里。如

      据说这样效率会比较高。。总之比手动index快。所以让Python做更多事是提升效率的基本原则。

文档:

      虽然说Python已经十分接近自然语言了。但是写注释和文档还是必要的。Python这点做的很好,PyDoc把注释和文档结合了。所以写大型注释就是写””” HELLO “””这样的。然后由__doc__或help获取。不展开。也可以使用HTML看文档, python -m pydoc -b 。对与个人用足够了。高大上的Sphinx也可以尝试一下。

 

      好了,Python以前会打大概就差不多了。还有后面一点点会的函数。。就当复习了。这么点时间还是学到了不少。收获很多!

Python: list, dict, tuple, file

      chromium更新了Version 35.0.1916.114 (270117)。字体变好看了,爽!好像还出来aura什么的。

      list, dict, tuple基本上算Python中最常用的高级数据类型。很多其他数据结构都可以由这些数据类型衍生。比如namedtuple。

list:

      list相当于数组,但是不同于数组的是list可以存任何数据类型,可以嵌套。因为list存的都是引用(指针)。比一般的数组灵活很多。比如添加元素,删除等。list是可变的,即一般的操作不会改变list的内存地址。像 l.sort() 都是直接在原list上操作的 不会返回新list。如果要返回新list的话使用sorted会更好。list等其他类型都要注意循环引用的问题。如下代码,在很久以前的Python会有问题。现在的Python也很好玩。

dict:

      dict是Python里非常神奇的数据类型。上能建树下能索引。dict使用hash来实现基本功能,因此dict的key的顺序是随机的,甚至同一个程序不同时间也会不一样,具体可以参考。dict用起来也是非常方便的,dict的key是不能用可变类型的,因为key要先hash,可变类型hash是没有意义的。关键是dict的Python3跟Python2稍微有点区别。最主要的区别是获取keys。 D.keys() 返回的是类似set的类型。如下程序测试。

tuple:

      tuple应该来说是最简单的。tuple是不可变类型。但tuple里面引用的内容可以变,不变的是可变数据类型的引用。如下。

      有了list为什么还有有tuple呢。最直接的原因是tuple的不可变。可以限制其他地方不小心的更改。更好的一点是因为不可变,tuple可以作为dict的key。

namedtuple是既可以像list一样顺序存取也可以像dict一样按key来。很有意思。

file:

      file姑且也算数据类型了。是由open()函数来创建。但也有其他类型的file,比如socket等。file在Python中默认以uft8格式解码,而不是Unicode。这两个之间还是有一点差别的。当然Python也可以指定不解码,以二进制方式读取, f = open('boot.img','rb') 。这种用法通常是读取编译文件等等。

      有时要把对象写入file。这是就需要序列化。python有内置的pickle等,有个struct也很好用。具体含义help就知。

      file据说不用手动关闭,因为Python的gc会自动收集没有引用的文件。但作为良好编程习惯还算close好。但也可以使用Python的File Context Manager.
      Python可以直接把shell的命令执行结果当成文件。

Unicode与utf8:

      Python默认是使用utf8的而不是Unicode。还有个NCR是用在网页里的,跟Unicode差不多,就是表示方法不一样。可以试一下Python中的对字符的处理以及utf8和Unicode间的转换。

链接:

  1. Python Built-in Types

Python: str

      string应该算比较常用的类型,特别是处理文本方面。Python 3对字符串的支持是原生的Unicode,不用像Python 2一样, u’我’。

string类型:

      Python支持普通字符串,raw字符串和bytes字符串。raw的话不会转义任何字符,但是不能以单数的’\’结尾,特别适合window文件目录(实际上Python会自动处理这个问题)。bytes就是把字符串的编码存下,还有bytearray是可变的。

string操作:

      由于string是不可变的,操作一般都会产生新的对象。比如 s[::-1] 会在别的内存产生逆序的字符串。Python函数 len(s) 返回的不是占用的字节数,而是字符数。如 len('我去') 的结果是2。Python有很多string对象的内置方法,不一一举例。要注意的是,Python还有个模块叫string,里面有也不错的内容。

format:

      Python有三种格式化字符串的方法。%差不多跟C一样,format比较先进跟php有点像,还有就是string.Template。我只关注format,强大而简单。

      以上是format的基本格式,看到就傻了。但是用个例子就完全明白了。具体含义可以动手实验得出。我也讲不清。

      总之format可以以各种牛X的方式格式化字符串。

意外收获:

      在Python中使用dict,tuple什么的类型有时不能直接使用,要先unpack,说白了就是去掉外面的括号。下面分别是dict和tuple的unpack。