小白之Python-基础中的基础03

序列,目前看来很基础,东西比较多,难度开始加大。。。加油吧,骚年

 

Python之序列


1.数据结构:序列、容器(序列:索引、映射:键)、集合
2.列表、元组、字符串、Unicode字符串、buffer对象、xrange对象
3.列表可以修改、元组不可修改(一般情况下列表都可以替代元组),并且列表有许多专门方法(下面会说明)

序列

#定义一个【名字、年龄】的库?datebase
maomao=['maomao',21]
chouchou=['chouchou',22]
xiangxiang=['xiangxiang',23]
benben=['benben',24]
database=[maomao,chouchou,xiangxiang,benben]
print database
------下面是结果
[['maomao', 21], ['chouchou', 22], ['xiangxiang', 23], ['benben', 24]]

通用序列的操作:
索引、分片、加、乘、检查都元素是否属于序列成员、
计算序列长度、最大最小值、迭代(依次对序列中的每个元素重复执行X动作)


索引:
序列中的所有元素都是有编号的-----从0 开始递增。>>> greeting = 'maomao'

>>> greeting[0]
'c'
>>> greeting[2]
'o'

 

使用负数索引时,python 会从右边,也就是从最后1个元素开始计数。最后1个元素的位置编号是-1

>>> greeting = 'maomao'
>>> greeting[-1]
'o'
>>> greeting[-2]
'a'

 

如果一个函数调用返回一个序列,那么可以直接对返回结果进行索引操作
例如,假设只对用户输入年份的第4个数字感兴趣,那么,可以进行如下操作:

fourth = raw_input('year:')[3]
print fourth

#以1-31的数字作为结尾的列表
endings = ['st','nd','rd']+ 17*['th']\
+['st','nd','rd']+ 7*['th']\
+['st']
#嗯,总的来说,目前对这一段代码,对目前的小白我内心还是崩溃的。。

#根据给定的年月日以数字形式打印出日期
#定义months,是一个序列
months = [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December'
    ]

#以1-31的数字作为结尾的列表
#['st','nd','rd']表示1/2/3日分别以'st','nd','rd'结束
#17*['th']表示每月的第四日开始-第20日,均以'th'结束,为17个
#['st','nd','rd']+ 7*['th']+['st'],就好理解了。。
#每一行最后的\ 是用来换行的
endings = ['st','nd','rd']+ 17*['th']\
           +['st','nd','rd']+ 7*['th']\
           +['st']

#python2中,要用raw_input语法来获取用户输入值,这玩意获取完大约是‘xx’--字符串类型?i am not sure??
year  =raw_input('year:')
month =raw_input('month(1-12):')
day   =raw_input('day(1-31)')

#然后把获取到的用户输入的数值转换成int类型
month_number = int(month)
day_number = int(day)

#将月份和天数减1,以获得正确的索引,索引值是从0开始的
month_name = months[month_number-1]
ordinal = day + endings[day_number - 1]

print month_name + ' ,' + ordinal + ' ,' + year
-----------------------------------------------
输入:
>>> 
year:2017
month(1-12):8
day(1-31)3
输出:
August ,3rd ,2017

------------------------------------
(╥╯^╰╥)无奈呀~~加油吧,很快就能看懂了

 

-----------------华丽的分界线-------------

 

分片:类似java中的截取子串
(1)基础分片
格式:变量[x:y]---第x个索引开始,第y-1个索引结束,分片通过冒号相隔的两个索引来实现

>>> tag = '<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30] # 取第9个到第30个之间的字符
'http://www.python.org'
>>> tag[32:-4] #取第32到第-4(倒着数第4个字符)
'Python web site'
>>>
>>> numbers = [0,1,2,3,4,5,6,7,8,9]
>>> numbers[7:-1] # 从第7个数到 倒数第一个数
[7, 8] #显然这样不可行
>>> numbers[7:10] #从第7个数到第10个数
[7, 8, 9] #这样可行,索引10指向的是第11个元素。
>>> numbers[7:] # 可以置空最后一个索引解决
[7, 8, 9]
>>> numbers[:3] 
[0, 1, 2]
>>> numbers[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
url = raw_input('Please enter the URL:')
domain = url[11:-4]

print "Domain name:" + domain
------------------------------------------
输入:
>>> 
Please enter the URL:http://fnng.cngblogs.com
输出:
Domain name:.cngblogs

(2)进阶分片
分片可以正分片,也可以负分片
正分片:头到尾
格式:变量[x:y:z] 要求x<y,且z>0
表示第x个索引开始,第y-1个索引结束,并以z-1为分片步数---第x个索引开始,第y-1个索引结束,并以z-1为分片步数(即:每z个字符取一个)
负分片:尾到头
格式:变量[x:y:z] 要求x>y,且z<0
表示第x个索引开始,第y-1个索引结束,并以z-1为分片步数---第x个索引开始,第y-1个索引结束,并以z-1为分片步数(即:每z个字符取一个)
该方法实现序列的倒输出
当x/y没有指定固定值时,如步数为正,则自左向右按步数取值
如步数为负,则自右向左按步数取值

正分片:    
numbers = [0,1,2,3,4,5,6,7,8,9]
print numbers[0:1] #[0]
print numbers[:] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print numbers[0:] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print numbers[:10] #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print numbers[3:7] #[3, 4, 5, 6]
print numbers[0:10:2] #[0, 2, 4, 6, 8]
print numbers[3:6:3] #[3]
负分片
print numbers[::4] #[0, 4, 8]
print numbers[8:3:-1] #[8, 7, 6, 5, 4]
print numbers[10:0:-2] #[9, 7, 5, 3, 1]
print numbers[::-2] #[9, 7, 5, 3, 1]
print numbers[5::-2] #[5, 3, 1]
print numbers[:5:-2] #[9, 7]

-----------------华丽的分界线-------------

序列相加:
通过使用加号可以进行序列的连接操作:+
列表和字符串是无法连接接在一起的,尽管它他们都是序列。简单来说,两种相同类型的序列才能进行连接操作。

>>> 'hello.'+'world!'
'hello.world!'

>>> [1,2,3]+[4,5,6]
[1,2,3,4,5,6]

>>> [1,2,3] + 'world!'
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
[1,2,3] + 'world!'
TypeError: can only concatenate list (not "str") to list

 

乘法:
序列*次数,生成新的序列,原序列执行次数次

print 'python'*5 #pythonpythonpythonpythonpython
print [42]*5 #[42, 42, 42, 42, 42]
print [42,32]*5 #[42, 32, 42, 32, 42, 32, 42, 32, 42, 32]

如果想创建一个占用十个元素空间,却不包括任何有用的内容的列表,可以用None

print []*5 #[] 为空序列
print [0]*5 #[0, 0, 0, 0, 0] 为没有任何意义的序列
print [None]*5 #[None, None, None, None, None] 为有None站位符的序列

---神一样的盒子

# 以正确的宽度在居中的“盒子”内打印一个句子
sentence = raw_input("Sentence : ")

screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) //2

print
print ' ' * left_margin + '+' + '-' * (box_width - 2)+ '+'
print ' ' * left_margin + '| ' + ' ' * text_width + ' |'
print ' ' * left_margin + '| ' + sentence + ' |'
print ' ' * left_margin + '| ' + ' ' * text_width + ' |'
print ' ' * left_margin + '+' + '-' * (box_width - 2)+ '+'

-----------------------------------

想看输入结果不。。。嗯,自己抄代码去。。。

绝对不会承认是偶copy不出效果来了。(⊙▽⊙)

-----------------华丽的分界线-------------
成员资格:

为了检查一个值是否在序列中,可以使用in 运算符。该运算符和之前已经讨论过的(例如 + , * 运算符)有一点不同。
这个运算符检查某个条件为真或假的(True or False )。

>>> permissions = 'rw' #可用于检查文件处理权限
>>> 'w' in permissions
True
>>> 'y' in permissions
False
>>> users = ['zhangsan', 'lisi','wangwu'] #可用于检查用户是否在列表中
>>> raw_input('Enter your user name: ') in users
Enter your user name: lisi
True
>>> subject ='$$$ Get rich now!!! $$$' #可用于垃圾邮件的过滤器一部分
>>> '$$$' in subject

-----------------华丽的分界线-------------

长度、最值
函数:
len() 返回序列中所包含元素的数量。
min() 返回序列中最小的元素。
max() 返回序列中最大元素。

#开始用eclipse写代码,与ubantu的交互设计不一致
-----输入
number = [100,23,233,455]
print len(number) #获取长度
print min(number) #最小值
print max(number) #最大值

print max(2,3) #最大值
print min(2,3,5,3,6,7,82,) #最小值

------输出
4
23
455

3
2

--------------------------------分界线---------------------------

列表的函数方法们
列表是可变的,所有就有各种增删改查的方法
list() 用于将所有数据类型序列拆分成列表
join(somelist) 用于将列表转换成字符串

----元素赋值
----元素删除
----分片赋值
----列表方法
上述四方法并不都真正的改变列表

---元素赋值方法

方法一:定义列表是赋值,之前已经讲过,如
        listA = [1,3,5,7,9]
方法二:利用索引,重新对列表重点元素进行赋值 listB
= [1,1,1] listB[1]=2 #注意,利用索引进行赋值时,不能超过该序列的索引长度,否则会索引越界 print listB #[1,2,1]

---元素删除方法:del():用于删除列表、字典、及其他元素。此处暂只说明列表元素的说明

#del():

name = ['maomao','chouchou','guodong','benben']
del name[0]
print name
print len(name)
---
['chouchou', 'guodong', 'benben']
3


----分片赋值方法
可以用来替换、插入、删除

name = list('maomao')  #把maomao用list()转换成列表
        print name
        name[3:] = list('ben') #从第三个元素开始到结束,用list()转换成的ben来替代
        print name
        ----
        ['m', 'a', 'o', 'm', 'a', 'o']        
        ['m', 'a', 'o', 'b', 'e', 'n']
        
        name = list('maomao')
        name[3:] = list('xihuanben') #从第三个元素开始到结束,用list()转换成的xihuanben来替代
        print name
        ----
        ['m', 'a', 'o', 'x', 'i', 'h', 'u', 'a', 'n', 'b', 'e', 'n']
        
        name = list('maomao')
        name[0:0] = list('da') #从第0个元素开始到第0-1个元素结束(即为[]字符),用list()转换成的da来插入
        print name
        ----
        ['d', 'a', 'm', 'a', 'o', 'm', 'a', 'o']

        number = [1,5]
        number[1:1] = [2,3,4] #从第1个元素开始到第1-1个元素结束,用2,3,4来插入
        print number
        ----
        [1, 2, 3, 4, 5]

        number = [4,5]
        number[0:0] = [1,2,3] #从第0个元素开始到第0-1个元素,用1,2,3来插入
        print number
        ----
        [1, 2, 3, 4, 5]

        number = [1,2,3,4,5]
        number[1:4] = [] #从第1个元素开始到第4-1个元素,用[]来替换,实则为删除第2-4个数字
        print number
        ----
        [1, 5]

嗯。。。今天有个巨大的遗留问题就是:分片+step  或者  分片+负数step 的替换、删除、插入怎么玩 ???

揪心啊 ヽ(`Д´)ノ︵ ┻━┻ ┻━┻ 

٩(๑❛ᴗ❛๑)۶今儿先到这。。helloha~

 

posted @ 2017-08-03 21:30  haohaoplay  阅读(152)  评论(0)    收藏  举报