首页 > 代码库 > python基础

python基础

浮点数

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是相等的。浮点数可以用数学写法,如1.233.14-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

字符串

字符串是以‘‘或""括起来的任意文本,比如‘abc‘"xyz"等等。请注意,‘‘或""本身只是一种表示方式,不是字符串的一部分,因此,字符串‘abc‘只有abc这3个字符。如果本身也是一个字符,那就可以用""括起来,比如"I‘m OK"包含的字符是Im,空格,OK这6个字符。

如果字符串内部既包含又包含"怎么办?可以用转义字符\来标识,比如:

‘I\‘m \"OK\"!‘

>>> 10 / 33  
>>> 10.0 / 33.3333333333333335
>>> 10 % 31

格式化

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

>>> ‘Hello, %s‘ % ‘world‘‘Hello, world‘>>> ‘Hi, %s, you have $%d.‘ % (‘Michael‘, 1000000)‘Hi, Michael, you have $1000000.‘

你可能猜到了,%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。

常见的占位符有:

%d整数
%f浮点数
%s字符串
%x十六进制整数

其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

>>> ‘%2d-%02d‘ % (3, 1)‘ 3-01‘>>> ‘%.2f‘ % 3.1415926‘3.14‘

list

如果一个list中一个元素也没有,就是一个空的list,它的长度为0:

>>> L = []>>> len(L)0

比如,列出班里所有同学的名字,就可以用一个list表示:

>>> classmates = [‘Michael‘, ‘Bob‘, ‘Tracy‘]>>> classmates[‘Michael‘, ‘Bob‘, ‘Tracy‘]
>>> len(classmates)3

用索引来访问list中每一个位置的元素,记得索引是从0开始的

>>> classmates[0]‘Michael‘>>> classmates[1]‘Bob‘

如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

>>> classmates[-1]‘Tracy‘

以此类推,可以获取倒数第2个、倒数第3个:

>>> classmates[-2]‘Bob‘>>> classmates[-3]‘Michael‘

LIST操作包含以下函数:
1、cmp(list1, list2):比较两个列表的元素
2、len(list):列表元素个数
3、max(list):返回列表元素最大值
4、min(list):返回列表元素最小值
5、list(seq):将元组转换为列表
LIST操作包含以下方法:
1、list.append(obj):在列表末尾添加新的对象
2、list.count(obj):统计某个元素在列表中出现的次数
3、list.extend(seq):在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4、list.index(obj):从列表中找出某个值第一个匹配项的索引位置
5、list.insert(index, obj):将对象插入列表
6、list.pop(obj=list[-1]):移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7、list.remove(obj):移除列表中某个值的第一个匹配项
8、list.reverse():反向列表中元素
9、list.sort([func]):对原列表进行排序

要删除list末尾的元素,用pop()方法:

>>> classmates.pop()‘Adam‘>>> classmates[‘Michael‘, ‘Jack‘, ‘Bob‘, ‘Tracy‘]

要删除指定位置的元素,用pop(i)方法,其中i是索引位置:

>>> classmates.pop(1)‘Jack‘>>> classmates[‘Michael‘, ‘Bob‘, ‘Tracy‘]

要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:

>>> classmates[1] = ‘Sarah‘>>> classmates[‘Michael‘, ‘Sarah‘, ‘Tracy‘]

list里面的元素的数据类型也可以不同,比如:

>>> L = [‘Apple‘, 123, True]

list元素也可以是另一个list,比如:

>>> s = [‘python‘, ‘java‘, [‘asp‘, ‘php‘], ‘scheme‘]>>> len(s)4

要注意s只有4个元素,其中s[2]又是一个list,如果拆开写就更容易理解了:

>>> p = [‘asp‘, ‘php‘]>>> s = [‘python‘, ‘java‘, p, ‘scheme‘]

要拿到‘php‘可以写p[1]或者s[2][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。


tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:

>>> classmates = (‘Michael‘, ‘Bob‘, ‘Tracy‘)

现在,classmates这个tuple不能变了,

如果要定义一个空的tuple,可以写成()

>>> t = ()>>> t()

最后来看一个“可变的”tuple:

>>> t = (‘a‘, ‘b‘, [‘A‘, ‘B‘])>>> t[2][0] = ‘X‘>>> t[2][1] = ‘Y‘>>> t(‘a‘, ‘b‘, [‘X‘, ‘Y‘])

这个tuple定义的时候有3个元素,分别是‘a‘‘b‘和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

别急,我们先看看定义的时候tuple包含的3个元素:

dict(key-value)

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

>>> d = {‘Michael‘: 95, ‘Bob‘: 75, ‘Tracy‘: 85}>>> d[‘Michael‘]95

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

>>> d[‘Adam‘] = 67>>> d[‘Adam‘]67

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

>>> ‘Thomas‘ in dFalse

二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get(‘Thomas‘)>>> d.get(‘Thomas‘, -1)-1

注意:返回None的时候Python的交互式命令行不显示结果。

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

>>> d.pop(‘Bob‘)75>>> d{‘Michael‘: 95, ‘Tracy‘: 85}

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

IF

注意不要少写了冒号:

当然上面的判断是很粗略的,完全可以用elif做更细致的判断:

age = 3if age >= 18:    print ‘adult‘elif age >= 6:    print ‘teenager‘else:    print ‘kid‘

elifelse if的缩写,完全可以有多个elif

if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elifelse,所以,请测试并解释为什么下面的程序打印的是

Try

if判断条件还可以简写,比如写:

if x:    print ‘True‘

只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

For....in,While

Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来,看例子:

names = [‘Michael‘, ‘Bob‘, ‘Tracy‘]for name in names:    print name

执行这段代码,会依次打印names的每一个元素:

MichaelBobTracy

所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。

再比如我们想计算1-10的整数之和,可以用一个sum变量做累加:

sum = 0for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:    sum = sum + xprint sum

如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,比如range(5)生成的序列是从0开始小于5的整数:

>>> range(5)[0, 1, 2, 3, 4]

range(101)就可以生成0-100的整数序列,计算如下:

sum = 0for x in range(101):    sum = sum + xprint sum

第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。比如我们要计算100以内所有奇数之和,可以用while循环实现:

sum = 0n = 99while n > 0:    sum = sum + n    n = n - 2print sum

For....in,dic

>>> d = {‘a‘: 1, ‘b‘: 2, ‘c‘: 3}>>> for key in d:...     print key...acb

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.ist这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

>>> d = {‘a‘: 1, ‘b‘: 2, ‘c‘: 3}>>> for key in d:...     print key...acb

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),如果要同时迭代key和value,可以用for k, v in d.iteritems()

由于字符串也是可迭代对象,因此,也可以作用于for循环:

>>> for ch in ‘ABC‘:...     print ch...ABC

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。

Python内置的enumerate函数可以把一个list变成索引-元素对即将列表生成字典。这样就可以在for循环中同时迭代索引和元素本身:

>>> for i, value in enumerate([‘A‘, ‘B‘, ‘C‘]):...     print i, value...0 A1 B2 C
Try

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:...     print x, y...1 12 43 9

由于字符串也是可迭代对象,因此,也可以作用于for循环:

>>> for ch in ‘ABC‘:...     print ch...ABC

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。

那么,如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:

>>> from collections import Iterable>>> isinstance(‘abc‘, Iterable) # str是否可迭代True>>> isinstance([1,2,3], Iterable) # list是否可迭代True>>> isinstance(123, Iterable) # 整数是否可迭代False

最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

>>> for i, value in enumerate([‘A‘, ‘B‘, ‘C‘]):...     print i, value...0 A1 B2 C
Try

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

>>> for x, y in [(1, 1), (2, 4), (3, 9)]:...     print x, y...1 12 43 9
Try

DEF

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

我们以自定义一个求绝对值的my_abs函数为例:

def my_abs(x):    if x >= 0:        return x    else:        return -x

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():    pass

pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

参数检查

但是如果参数类型不对,Python解释器就无法帮我们检查。

让我们修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance实现:

def my_abs(x):    if not isinstance(x, (int, float)):        raise TypeError(‘bad operand type‘)    if x >= 0:        return x    else:        return -x

添加了参数检查后,如果传入错误的参数类型,函数就可以抛出一个错误:

>>> my_abs(‘A‘)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 3, in my_absTypeError: bad operand type

错误和异常处理将在后续讲到。

切片

>>> L[0:3][‘Michael‘, ‘Sarah‘, ‘Tracy‘]

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。

如果第一个索引是0,还可以省略:

>>> L[:3][‘Michael‘, ‘Sarah‘, ‘Tracy‘]

也可以从索引1开始,取出2个元素出来:

>>> L[1:3][‘Sarah‘, ‘Tracy‘]

类似的,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,试试:

>>> L[-2:][‘Bob‘, ‘Jack‘]>>> L[-2:-1] L[-2:-1]表示,从倒数第10个开始取,直到倒数第一个的前一个为止。[‘Bob‘]

记住倒数第一个元素的索引是-1

切片操作十分有用。我们先创建一个0-99的数列:

>>> L = range(100)>>> L[0, 1, 2, 3, ..., 99]

可以通过切片轻松取出某一段数列。比如前10个数:

>>> L[:10][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

后10个数:

>>> L[-10:][90, 91, 92, 93, 94, 95, 96, 97, 98, 99]L[-10:]表示,从倒数第10个开始取,直到最后一个索引为止。

前10个数,每两个取一个:step=2

>>> L[:10:2][0, 2, 4, 6, 8]

甚至什么都不写,只写[:]就可以原样复制一个list:

>>> L[:][0, 1, 2, 3, ..., 99]

有一个经典应用是:翻转字符串

比如:str=‘abcd‘

        str=[:,:,-1]

得到dcba

  1. a = [0,1,2,3,4,5,6,7,8,9]  
  2. a[:5:-1]   #step < 0,所以start = 9  
  3. a[0:5:-1]  #指定了start = 0  
  4. a[1::-1]   #step < 0,所以stop = 0 step<0 倒序切片

tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:

>>> (0, 1, 2, 3, 4, 5)[:3](0, 1, 2)

字符串‘xxx‘或Unicode字符串u‘xxx‘也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

>>> ‘ABCDEFG‘[:3]‘ABC‘>>> ‘ABCDEFG‘[::2]‘ACEG‘
Try

列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:
>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

x * x为生成式放到前面,后面跟for循环

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]

还可以使用两层循环,可以生成全排列:即对表达式中有2个变量

>>> [m + n for m in ‘ABC‘ for n in ‘XYZ‘][‘AX‘, ‘AY‘, ‘AZ‘, ‘BX‘, ‘BY‘, ‘BZ‘, ‘CX‘, ‘CY‘, ‘CZ‘]

运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

>>> import os # 导入os模块,模块的概念后面讲到>>> [d for d in os.listdir(‘.‘)] # os.listdir可以列出文件和目录[‘.emacs.d‘, ‘.ssh‘, ‘.Trash‘, ‘Adlm‘, ‘Applications‘, ‘Desktop‘, ‘Documents‘, ‘Downloads‘, ‘Library‘, ‘Movies‘, ‘Music‘, ‘Pictures‘, ‘Public‘, ‘VirtualBox VMs‘, ‘Workspace‘, ‘XCode‘]

for循环其实可以同时使用两个甚至多个变量,比如dictiteritems()可以同时迭代key和value:

因此,列表生成式也可以使用两个变量来生成list:
>>> d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }>>> [k + ‘=‘ + v for k, v in d.iteritems()][‘y=B‘, ‘x=A‘, ‘z=C‘]

最后把一个list中所有的字符串变成小写:(表达式:要对list进行怎样的操作,for迭代提出要进行操作的变量)

>>> L = [‘Hello‘, ‘World‘, ‘IBM‘, ‘Apple‘]>>> [s.lower() for s in L][‘hello‘, ‘world‘, ‘ibm‘, ‘apple‘]

python基础