整数(正负,与数学上一样,0x十六进制)、浮点数(科学计数法)、字符串、布尔型(True/False,and/or/not)、空值(特殊的值,None),除此之外,还有列表、字典等多种数据类型,还允许创建自定义数据类型。
变量名:英文、下划线、数字的组合,数字不能开头;
变量本身类型不固定,不需要制定数据类型,是动态语言,更灵活;
a=’ABC’ : (1)在内存中创建了一个’ABC’的字符串;(2)在内存中创建了一个名为a的变量,并把它 指向 ‘ABC’
字符串用\进行转义,转义字符\不计入字符串的内容中
\n 表示换行
\t表示一个制表符
\\表示\字符本身
raw 字符串:解决太多转义字符的麻烦,在字符串的前面加上一个前缀r,里面的字符就不需要转义了
”’… …”’ 多行字符串的表示
u’… …’ Unicode表示的字符串
print u’中文’ 不添加u,中文就不能正常演示
# -*- coding: utf-8 -*- 表示告诉解释器用UTF-8编码读取源代码
内置数据类型,[],有序集合,可增删元素;
empty_list = [];
元素可以不为同一种数据类型,因为python是动态语言;
按索引访问,从0开始索引:L[0];倒序访问,L[-1]:最后一个元素;都不能越界;
L.append():新元素追加在list末尾;
L.insert(索引号,新元素):索引位置上添加为新元素,原来的旧元素及其后面的元素自动往后移动一位;
L.pop():删掉list的最后一个元素,并且还返回这个元素;
L.pop(索引号):删除索引号所对应的元素;
替换:赋值成(指向)新的元素即可,L[-1]='new one';
元组,有序,tuple一旦创建不可修改,()
**没有**append、insert、pop方法;
可以用索引方式访问元素,但不能赋值,print t[-1];
empty_tuple = ()
one_tuple = (1,):单元素tuple要加一个逗号“,”,避免歧义;
强调:tuple的“不能变”是指它的每个元素的指向永远不变;
list/tuple都是有序的集合,用循环依次访问元素(for循环把每个元素迭代出来)for name in list:依次取出每一个元素并赋值给name这个变量;
while循环不会迭代list或者tuple的元素,而是根据表达式判断循环是否结束,要特别留意while的循环推出条件;
break;/continue;
循环内部可以嵌套循环;
集合,键-值对,key-value,花括号{};
len()函数:计算任意集合的大小(有几个键值对);
访问dict的值:d[key]返回对应的 value;
用in操作符判断是否存在key:if ‘key’ in d: …
dict本身提供一个get方法,key不存在的时候返回None;
dict的特点:
更新dict:
dict是可变的,随时可以添加新的key-value,用赋值语句:d[‘new key’] = new value;如果key已存在,原来的value会被替换掉;
遍历dict:
for key in d:
print key,':',d.get(key)
只关心key,不关心value,保证元素不重复;
Set的元素没有重复,内部存储的元素是无序的;
调用set(),传入一个list,list的元素作为set的元素:s=set([‘A’,’B’,’C’]);
set会自动去掉list中重复的元素;
访问set:
无索引,实际上是“判断元素是否在set中”,in 操作符;
元素区分大小写;
特点:
被阉割的dict,因为不存储value,因此,判断一个元素是否在set中速度很快,set的元素类似于dict的key,是不变对象,set存储的元素没有顺序。
weekdays = set([‘MON’, ‘TUE’, ‘WED’, ‘THU’, ‘FRI’, ‘SAT’, ‘SUN’])
遍历set:
是集合,for循环遍历实现,for name in s:
更新set:
添加元素:add(),可以直接用
删除元素:remove(),使用之前需要判断
抽象,def my_fun(x):…
没有return语句,执行完毕也会返回结果,只是结果是None;return None = return
可以返回多值:在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便
import math
递归函数:一个函数在内部调用自身本身,定义简单,逻辑清晰,注意防止栈溢出;
函数调用是通过 栈(stack)这种数据结构实现的,每进入一次函数调用,栈就会加一层 栈帧,每当函数返回,栈就会减一层栈帧。
定义函数的时候可以有默认参数(可以看成是赋值的常量参数),函数参数从左到右的顺序匹配。默认参数只能定义在必需参数的后面
可变参数:def fn(*args):… Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了
对list切片:
L[0:3] 从索引开始取,直到索引到3为止,但不包括索引3,(取出的个数为两索引值相差),可以省略第一个为0的索引,L[:3];
L[:] 从头到尾,复制整个list;
L[::N] 每N个取一个;
list换成tuple,切片操作完全相同,只是结果也是tuple了;
倒序切片 L[-3:-1:2] 输出也是从左到右的顺序,-3的到最后一个,每隔2个选一个;最后十个数:L[-10:];
记住倒数第一个元素的索引是-1。倒序切片包含起始索引,不包含结束索引;
对字符串切片:
操作结果仍是字符串 ‘abcdefg’[:3] → ‘abc’
方法 upper() 可以把字符变成大写字母:’abc’.upper()
list和tuple用for循环来遍历我们称之为迭代(Iteration)
迭代操作就是:对于一个集合,无论该集合是有序还是无序,我们用for循环总是可以依次取出集合的每一个元素。注意:集合是指包括一组元素的数据结构,目前学到了包括:
有序集合:list,tuple,str,unicode;
无序集合:set
无序集合并且有key-value对:dict
迭代是一个动词,它是指一种操作,在Python中,就是for循环。
迭代与按下标访问数组最大的不同,后者是一种具体的迭代实现方式,而前者只关心迭代后果,根本不关心迭代在内部是如何实现的。
迭代永远是取出元素本身,而非元素的索引
关于enumerate()
函数,可以在for循环中同时绑定索引index和元素name,实际上,enumerate()函数把:['Adam','Lisa','Bart','Paul']
换成了[(0,'Adam'),(1,'Lisa'),(2,'Bart'),(3,'Paul')]
,迭代的每一个元素实际上是一个tuple:
for index,name in enumerate(L):
print index,'-',name
所以说,可见,索引迭代也不是真的按索引访问,而是由 enumerate() 函数自动把每个元素变成 (index, element) 这样的tuple,再迭代,就同时获得了索引和元素本身。
关于zip()函数,可以把两个list变成一个list:
>>> zip([10,20,30],['A','B','C'])
[(10,'A'),(20,'B'),(30,'C')]
迭代dict的value:
dict本身对象就是可迭代对象,for循环每次拿到dict的一个key。
dict对象有一个values()方法,把dict转换成一个包含所有value的list,迭代的就是dict的每一个value:d={} print d.values()
itervalues()
values()方法实际上把一个dict转换成了包含value的list;
itervalues()方法不会转换,它会在迭代过程中依次从dict中取出value,所以itervalues()方法比values()方法节省了生成list所需的内存。
迭代dict的key和value:
dict()的items()可以把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:
for key,value in d.item():
itemvalues()不把dict转换成list,而是在迭代中不断给出tuple,所以,iteritems()不占用额外的内存。
Python特有的列表生成式,[x*x for x in range(1,11)]
http://blog.csdn.net/heartyhu/article/details/50988007
不改动range()的情况下,可以加上if来筛选
PS:有两个函数了解一下
for 循环可以嵌套,[m+n for m in ‘ABC’for n in ‘123’] 这个就生成了全排列[‘A1’, ‘A2’, ‘A3’, ‘B1’, ‘B2’, ‘B3’, ‘C1’, ‘C2’, ‘C3’]