从今天起开始记录我的Python学习之路。
现在的我只是一个学习Linux服务器的大三学生党,在大学中不断的学习是必要的,学习完了写技术博客也是必要的,不管有没有人看,这对于自己来说都是有好处的。
最近发现Python这个强大的语言,就如它的名字一样,Python是一门强壮又迅捷的语言,所以引发了我对于它浓厚的兴趣。
- >>> 1/2
- 0
- >>> 1//2
- 0
- >>> 1.0/2
- 0.5
- >>> from __future__ import division
- >>> 1/2
- 0.5
- >>> abs(-19)
- 19
- >>> round(1/2)
- 1.0
- >>> import math
- >>> math.floor(23.2)
- 23.0
- >>> int(math.floor(23.2))
- 23
- >>> from math import sqrt
- >>> sqrt(9)
- 3.0
- >>> import cmath
- >>> cmath.sqrt(-2)
- 1.4142135623730951j
- >>> (2+5j)*(9+2j)
- (8+49j)
- >>> "hello,"+"world"
- 'hello,world'
- >>> x = "hello,"
- >>> y = "world!"
- >>> x + y
- 'hello,world!'
反撇号的用途是很明显的,但是据说``已经被repr()给代替了,所以还是用repr()吧,repr()则让数值得到解释
- >>> num = 25
- >>> print "The num is " + num
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: cannot concatenate 'str' and 'int' objects
- >>> print "The num is " + `num`
- The num is 25
- >>> print "The num is " + repr(num)
- The num is 25
- >>> str = "hello"
- >>> print "The string is " + str
- The string is hello
- >>> print u"hello , world!"
- hello , world!
- >>> print r"hello , world!"
- hello , world!
这是目前为止已经学习了的函数
下面就要开始学习Python的数据结构啦,列表和元组。
这是一种类似字典的结构:
- >>> tom = [01,"teacher"]
- >>> jerry = [02,"student"]
- >>> index = [tom,jerry]
- >>> print index
- [[1, 'teacher'], [2, 'student']]
这样看起来就是一个多维数组嘛
- >>> print index[1]
- [2, 'student']
- >>> print index[0]
- [1, 'teacher']
- >>> print index[0][1]
- teacher
- >>> print index[0][0]
- 1
很神奇的一点是,Python可以用负数下标来取元素
- >>> test = "apple"
- >>> test[1]
- 'p'
- >>> test[0]
- 'a'
- >>> test[-1]
- 'e'
- >>> test[-2]
- 'l'
- >>> test[-5]
- 'a'
在输入的字符中你也可以取你感兴趣的那个
- >>> month = raw_input('Y-M-D:')[4]
- Y-M-D:20140420
- >>> month
- '0'
那么来看一个具体的小程序吧
- #!/usr/bin/python
- months = [
- 'January',
- 'February',
- 'March',
- 'April',
- 'May',
- 'June',
- 'July',
- 'August',
- 'September',
- 'Oxtober',
- 'November',
- 'December'
- ]
-
- endings = ['st','nd','rd'] + 17 * ['th'] \
- + ['st','nd','rd'] + 7 * ['th'] \
- + ['st']
-
- year = raw_input('Year:')
- month = raw_input('Month(1-12):')
- day = raw_input('Day(1-31):')
-
- month_number = int(month)
- day_number = int(day)
-
- month_name = months[month_number-1]
- ordinal = day + endings[day_number-1]
-
- print month_name + ' ' + ordinal + '. ' + year
-
- 运行结果:
- [root@server py]# ./yearPrint.py
- Year:2012
- Month(1-12):12
- Day(1-31):21
- December 21st. 2012
先前说了Python可以用负数当数组下标,这里再来看看分片的操作吧
- >>> url = 'http://www.baidu.com/index.html'
- >>> url[7:20]
- 'www.baidu.com'
- >>> url[21:-1]
- 'index.htm'
- >>> num = [1,2,3,4,5]
- >>> num[0:4]
- [1, 2, 3, 4]
- >>> num[2:]
- [3, 4, 5]
- >>> num[:4]
- [1, 2, 3, 4]
分片的操作还可以接步长,这使得对数组的操作变得更加的灵活可变了,比如说数组的逆序打印变得如此简单。 步长是不能为0的,不然就不能执行下去了。 基本语法: array[起始下标:结束下标:步长]
- >>> num = [1,2,3,4,5,6,7,8,9,10]
- >>> num[0:10:2]
- [1, 3, 5, 7, 9]
- >>> num[3:6:3]
- [4]
- >>> num[0:6:3]
- [1, 4]
- >>> num[2::3]
- [3, 6, 9]
- >>> num[1::3]
- [2, 5, 8]
- >>> num[1:6:3]
- [2, 5]
- >>> num[3:6:3]
- [4]
- >>> num[3:7:3]
- [4, 7]
- >>> num[::-1]
- [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
看看上面这些例子,这些对数组的操作是多么的方便啊。 再用一个例子来说明一下分片的操作吧:
- #!/usr/bin/python
-
- url = raw_input('Please enter the URL:')
-
- isD = url[-3]
- if isD==".":
- domain = url[11:-3]
- else:
- domain = url[11:-4]
- print "Domain name:" + domain
-
- 运行结果:
- [root@server py]# ./urlPrint.py
- Please enter the URL:http://www.baidu.com
- Domain name:baidu
- [root@server py]# ./urlPrint.py
- Please enter the URL:http://www.baidu.cn
- Domain name:baidu
序列的相加就如字符串的相加一样是将两个序列拼接在一起的:
- >>> num = [1,2,3,4,5,6,7,8,9,10]
- >>> num2 = [11,12,0]
- >>> num + num2
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0]
所以从根本上来看,很多操作序列和字符串都是相似的:
- >>> a = [1,2,3]
- >>> a * 2
- [1, 2, 3, 1, 2, 3]
- >>> b = 'string'
- >>> b * 2
- 'stringstring'
-
空列表的初始化可以使用array = []来表示,但是如果想要看到列表中是10个空的呢? 那就用None吧,它Python的内建值,表示什么都没有。
- >>> c = []
- >>> c
- []
- >>> d = [None]*10
- >>> d
- [None, None, None, None, None, None, None, None, None, None]
<---------------------------我是华丽的日期分隔线------------------------------>
今天早上起来就在想怎么才能读取文件中的某几行某几列的数据放到数组中呢,在网上找了一下发现就是用昨天学习的序列就可以实现了,真的是物以致用啊。
- #!/usr/bin/python
- import random
- file = open("file","r")
- content = [x.rstrip("\n") for x in file]
- file.close
-
- data = [x.split()[1:2] for x in content[:]]
- #如果你的数据不是以字符列为界,而是以空格分隔,加上split()
- #这个是取单个字符:data = [x[3:] for x in content[2:]]
- print data
- a=random.randrange(0,len(data))
- i=0
- while i<len(data):
- print data[i]
- i=i+1
- print "singer is " + data[a][0]
检查一个值是否存在序列中可以用in来检测,它会返回True或False。
- >>> user = ['tom','jerry']
- >>> raw_input('Enter your user name:') in user
- Enter your user name:tom
- True
- >>> id = [1,2,3,4,5]
- >>> 1 in id
- True
- >>> 11 in id
- False
- >>> database = [['tom','123'],['jerry','123']]
- >>> username = raw_input('Enter your user name:')
- Enter your user name:tom
- >>> password = raw_input('Enter password:')
- Enter password:123
- >>> if [username,password] in database:print 'ok!'
- ...
- ok!
内建函数len()、min()、max()非常有用
len()返回序列中包含元素的数量
min()和max()分别返回序列中最大和最小的元素
- >>> test = ['abc','abcd','ab','abcde','a']
- >>> max(test)
- 'abcde'
- >>> min(test)
- 'a'
- >>> len(test)
- 5
- >>> i = [1,20,100,999]
- >>> min(i)
- 1
- >>> max(i)
- 999
- >>> len(i)
- 4
列表是非常有用的,所以也有人说列表是Python的苦力~
列表是可变的,而字符串是不可变的,所以用list()函数可以实现字符串转换成列表。
- >>> list('hello')
- ['h', 'e', 'l', 'l', 'o']
- >>> hello = list('hello')
- >>> del hello[3]
- >>> hello
- ['h', 'e', 'l', 'o']
- >>> hello[2]='r'
- >>> hello
- ['h', 'e', 'r', 'o']
在这里我们可以再来用用之前的分片操作
array[i:]=list('str')表示在array列表的2号元素开始替换为'str'
- >>> hello = list('hello')
- >>> hello
- ['h', 'e', 'l', 'l', 'o']
- >>> hello[2:]=list('ad')
- >>> hello
- ['h', 'e', 'a', 'd']
- #在此可以看出,本来的4号元素没有进行替换而是直接消失了
- >>> hello[1:2]=list('i')
- >>> hello
- ['h', 'i', 'a', 'd']
- #而在这里,却只替换了1号元素,后面的没有影响,这就是分片的神奇之处呐!
- >>> hello = list('python')
- >>> hello
- ['p', 'y', 't', 'h', 'o', 'n']
- >>> hello[1:5]=[]
- >>> hello
- ['p', 'n']
- #在这里是将从1号元素开始直到5号元素前,替换为空,就是删除啦~
- >>> hello[1:1]=list('ytho')
- >>> hello
- ['p', 'y', 't', 'h', 'o', 'n']
- #这里是从1号元素开始又到1号元素之前替换为列表list('ytho'),这是哪里?这就是在0号元素后插入列表list('ytho')啦~
注意Python内建函数名一定不能被一定为变量名,不然的话函数就不能用了哦!
在来看看加了步长后的序列会怎么样呢?
- >>> hello
- ['a', 'a', 'n']
- >>> hello[:0]=list('b')
- >>> hello
- #这里终止为0就是在最前面插入列表哦
- ['b', 'a', 'a', 'n']
- >>> hello[:]=list('c')
- >>> hello
- ['c']
- #这里什么都不指定的话,就是整个替换了
- >>> hello
- ['d', 'd', 'n']
- >>> hello[:-1]=list('a')
- >>> hello
- ['a', 'n']
- #终止处-1就使得替逆序了,同样前面的字符也被空给覆盖了
- >>> hello
- ['a', 'a', 'a']
- >>> hello[:1:-1]=list('c')
- >>> hello
- ['a', 'a', 'c']
- #这里指定了终止处为1号元素处,步长为-1,所以只有最后一个元素符合标准所以替换了,事实上如果有两个或两个以上的匹配会报错的~
<---------------------------我是华丽的日期分隔线------------------------------>
接下来我们来看看列表对象的一些方法吧
1.append方法:用于在列表末尾追加新对象
- >>> lst = [1,2,3]
- >>> lst.append(4)
- >>> lst
- [1, 2, 3, 4]
2.count方法:统计某个元素在列表中出现的次数
- >>> string
- ['a', 'ab', 'abc', 'abcd', 'abcde', 'a']
- >>> string.count('a')
- 2
3.extend方法:可以在列表末尾一次追加多个新对象,当然也可以用分片实现
- >>> a = [1,2,3]
- >>> b = [4,5,6]
- >>> a.extend(b)
- >>> a
- [1, 2, 3, 4, 5, 6]
- #用分片实现
- >>> a
- [1, 2, 3, 4, 5, 6]
- >>> b
- [4, 5, 6]
- >>> a[len(a):] = b
- >>> a
- [1, 2, 3, 4, 5, 6, 4, 5, 6]
4.index方法:用于找出列表中某个值第一次出现在列表中的索引位置
- >>> string
- ['a', 'ab', 'abc', 'abcd', 'abcde', 'a']
- >>> string.index('a')
- 0
- >>> string.index('ab')
- 1
5.insert方法:用于将对象插入列表中
- >>> a
- [1, 2, 3, 4, 5, 6, 4, 5, 6]
- >>> a.insert(0,'zero')
- >>> a
- ['zero', 1, 2, 3, 4, 5, 6, 4, 5, 6]
6.pop方法:移除列表的一个元素,返回它的值。append和pop可以实现进栈出栈
- >>> num
- [16, 13, 5, 3, 2]
- >>> num.pop()
- 2
- >>> num
- [16, 13, 5, 3]
- >>> num.pop(1)
- 13
7.remove方法:用于移除列表中找到的第一个匹配项
- >>> a
- ['zero', 1, 2, 3, 4, 5, 6, 4, 5, 6]
- >>> a.remove(4)
- >>> a
- ['zero', 1, 2, 3, 5, 6, 4, 5, 6]
8.reverse方法:用于将列表中的元素反向存放
- >>> a
- ['zero', 1, 2, 3, 5, 6, 4, 5, 6]
- >>> a.reverse()
- >>> a
- [6, 5, 4, 6, 5, 3, 2, 1, 'zero']
9.sort方法:用于将列表中的元素排序直接存入序列
- >>> num = [ 3,5,2,16,13]
- >>> num
- [3, 5, 2, 16, 13]
- >>> num.sort(cmp)
- >>> num
- [2, 3, 5, 13, 16]
- >>> num.sort(cmp,reverse=True)
- >>> num
- [16, 13, 5, 3, 2]
- >>> string = ['abc','abcd','a','ab','abcde']
- >>> string.sort(reverse=True)
- >>> string
- ['abcde', 'abcd', 'abc', 'ab', 'a']
- >>> string.sort(cmp,reverse=True) #逆序
- >>> string
- ['abcde', 'abcd', 'abc', 'ab', 'a']
- >>> string.sort(cmp) #cmp用于比较大小
- >>> string
- ['a', 'ab', 'abc', 'abcd', 'abcde']
- >>> string.sort(key=len) #根据长度排序
- >>> string
- ['a', 'ab', 'abc', 'abcd', 'abcde']