python基础知识学习(二)

python基础知识学习(二)

pyhon有4个内建的数据结构——List(列表)、Tuple(元组)、Dictionary(字典)以及Set(集合),他们可以统称为容器,因为它们实际上是一些元素组合而成的结构,而这些元素,可以是数字、字符甚至是列表,或者是它们之间几种的组合。通俗地讲,容器里是什么都行,而且容器里的元素类型不要求相同。

列表/元组

列表和元组都是序列机构,它们本身相似,但又有一点不同的地方。

从外形上看,列表与元组的区别是,列表是用方括号标记的,如a=[1,2,3],而元组是用圆括号标记的,如b=(4,5,6),访问列表和元组中的元素的方式都是一样的,如a[0]等于1,b[2]等于6等。上面已经谈及,容器里是什么都行,因此,下面的定义也是成立的。

c=[1,'abc',[1,2]]

'''

c是一个列表,列表的第一个元素是整型1,第二个是字符串'abc’,第三个是列表(1,2]

'''

从功能上看,列表与元组的区别是,列表可以被修改,而元组不可以。比如,对于a=[1,2,3],那么语句a[0]=0,就会将列表a修改为[0,2,3],而对于元组b=(4,5,6),语句b[0]=1就会报错。要注意的是,如果已经有了一个列表a,同时想复制a,命名为变量b,

那么b=a是无效的,这时候b仅仅是a的别名(或者说引用),修改b也会修改a的。正确的复制方法应该是b=a[:]。

与列表有关的函数是list,与元组有关的函数是 tuple,它们的用法和功能几乎一样,都是将某个对象转换为列表/元组,如 list(ab)的结果是[a,b], tuple([1,2])的结果是(1,2)。

下面是一些常见的与列表/元组相关的函数。

python基础知识学习(二)

此外,作为对象,列表本身自带了很多实用的方法(元组不允许修改,因此方法很少)。

python基础知识学习(二)

最后,不能不提的是“列表解析”这一功能,它能够简化我们对列表内元素逐一进行操作的代码,如下面的代码

a=[1,2,3]

b=[]

for i in a:

b append (1+ 2)

可以简化到

a =[1,2,3]

b=[i+2 for i in a]

这样的语法不仅方便,而且直观!充分体现了 Python语法的人性化。

字典

Python引入了“自编”这一方便的概念。从数学上来讲,它实际上是一个映射。通俗来讲,它也相当于一个列表,然而它的“下标”不再是以0开头的数字,而是让自己定义的“键”(Key)开始。

创建一个字典的基本方法为:

d={' today ': 20,'tomorrow: 301}

这里的 today、 tomorrow就是字典的键,它在整个字典中必须是唯一的,而20、30就是键对应的值,访问字典中元素的方法也很直观。

d['today'] #该值为20

d['tomorrow'] #该值为30

还有其他一些比较方便的方法来创建一个字典,如通过dict0函数转换,或者通过dict.fromkeys来创建,例如:

dict([[' today',20],[' tomorrow',30]]) #相当于{'today':20,' tomorrow':30}

dict. fromkeys(['today','tomorrow'], 20) #相当于{'today': 20,'tomorrow: 20}

很多字典的函数和方法与列表是一样的。

集合

Python内置了集合这一数据结构,同数学上的集合概念基本上是一致的,它与列表的区别在于:

1.它的元素是不重复的,而且是无序的;

2.它不支持索引。

一般我们通过花括号{}或者set0函数来创建一个集合。

s={1,2,2,3} #注意2会自动去重,得到{1,2,3}

s=set([1,2,2,3]) #同样,它将列表转换为集合,得到{1,2,3}

由于集合的特殊性(特别是无序性),因此集合有一些特别的运算。

a=t | s #t和s的并集

b=t & s #t和s的交集

c=t - s #求差集(项在t中,但不在s中)

d=t ^ s #对称差集(项在t或s中,但不会同时出现在二者中)

用python做数据分析的过程中,集合并不常用,所以这里仅仅简单地介绍它,。

函数式编程

函数式编程或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。简单来讲,函数式编程是一种“广播式”的编程,之前提到过的 lambda定义函数,用于

科学计算中,会显得特别简洁方便。在 Python中,函数式编程主要由几个函数的使用构成: lambda()、map()、 reduce()、filter(), lambda()前面已经介绍过,主要用来自定义“行内函数”,所以现在逐一介绍后三个。

首先介绍map()函数。假设有一个列表a=[1,2,3],要给列表中的每个元素都加2得到一个新列表,利用前面已经谈及过的“列表解析”,我们可以这样写:

b=[i+2 for i in a]

而利用map函数我们可以这样写:

b= map (lambda x: x+2, a)

b=1ist(b) #结果是[3,4,5]

也就是说,我们首先定义一个函数,然后再用map命令将函数逐一应用到(map)列表中的每个元素,最后返回一个数组。map()命令也接受多参数的函数,如map( lambda x,y:x*y,a,b)表示将a、b两个列表的元素对应相乘,把结果返回给新列表。

接着是 reduce()函数。它有点像map()函数,但map()函数用于逐一遍历,而是 reduce()函数用于递归计算。先给出一个例子,这个例子可以算出n的阶乘:

reduce (lambda x, y: x*y, range (1, n+1))

其中, range(1,n+1)相当于给出了一个列表,元素是1~n这n个整数。 lambda x,y:x*y构造了一个二元函数,返回两个参数的乘积。 reduce命令首先将列表的前两个元素作为函数的参数进行运算,然后将运算结果与第三个数字作为函数的参数,然后再将运算结果与第四个数字作为函数的参数……依此递推,直到列表结束,返回最终结果。如果用循环命令,那就要写成:

s=1

for i in range(1,n+1):

s=s*i

最后是 filter()函数。顾名思义,它是一个过滤器,用来筛选出列表中符合条件的元素,例如,

b= filter (lambda x: x>5 and x 8, range (10))

b=1ist(b) #结果是[6,7]

使用 filter()函数首先需要一个返回值为布尔值型的函数,如上述的 lambda x:x>5 and x<8定义了一个函数,判断x是否大于5且小于8,然后将这个函数作用到 range(10)的每个元素中,如果为True,则“挑出”那个元素,最后将满足条件的所有元素组成一个列表返回。

当然,上述 filter语句,可以用列表解析写为:

b= [i for i in range (10) if i > 5 and 1< 8]

它并不比 filter语句复杂。但是要注意,我们使用map()、 reduce()或 filter(),最终目的是兼顾简洁和效率,因为map()、 reduce()或 filter()的循环速度比 Python内置的for或 while循环要快得多。


分享到:


相關文章: