python入门2

列表、字典、元组、集合

列表

1
2
3
4
5
6
# 列表
# 使用方括号定义列表
list1=['s','h','y','ee',123]
# 使用内置函数
list2=list(['s','h','y','ee',123])
print(list1,list2)

运行结果:

[‘s’, ‘h’, ‘y’, ‘ee’, 123] [‘s’, ‘h’, ‘y’, ‘ee’, 123]

1
print(list1[0],list1[-2])

运行结果:

s ee

获取索引
1
2
# 获取索引
print(list1.index('ss'),list1.index(123))

报错:

ValueError: ‘ss’ is not in list

1
2
list3=['s','ss',123,4,123,'ss','4']
print(list3.index(123))#只返回相同元素中的第一个元素的索引

运行结果:

2

规定查找区间
1
2
#规定查找区间
print(list3.index(123,3,5))

运行结果:4

查找索引区间超过列表长度
1
2
#查找索引区间超过列表长度
print(list3[10])

报错:IndexError: list index out of range

设置步长
1
2
3
4
5
6
7
8
9
10
11
#设置步长
list4=[10,20,30,40,50,60,70,80,90,100]
#start:stop:step
print(list4[2:6:2])
#省略步长,默认为1
print(list4[2:6])
print(list4[2:6:])
#start默认从0开始
print(list4[:6:])
# stop默认为最后一个
print(list4[::])

运行结果:

[30, 50]
[30, 40, 50, 60]
[30, 40, 50, 60]
[10, 20, 30, 40, 50, 60]
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

添加新的元素
append
1
2
3
4
5
# 添加新的元素
list5=[1,2,3,4]
print('添加新元素前',list5,id(list5))
list5.append(6)
print('添加新元素之后',list5,id(list5))

运行结果:

添加新元素前 [1, 2, 3, 4] 2862260696008
添加新元素之后 [1, 2, 3, 4, 6] 2862260696008

extend
1
2
3
4
5
6
7
list5=[1,2,3,4]
print('添加新元素前',list5,id(list5))
list5.append(list4)
print('append添加新元素之后',list5,id(list5))
list5=[1,2,3,4]
list5.extend(list4)
print('extend添加新元素之后',list5,id(list5))

运行结果:

添加新元素前 [1, 2, 3, 4] 2213139002312
append添加新元素之后 [1, 2, 3, 4, [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]] 2213139002312
extend添加新元素之后 [1, 2, 3, 4, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

insert
1
2
3
list5=[1,2,3,4]
list5.insert(2,10)
print('insert添加新元素之后',list5)

运行结果:insert添加新元素之后 [1, 2, 10, 3, 4]

在某位置添加很多元素
1
2
3
4
5
6
7
8
list5=[1,2,3,4]
# list在任意位置添加很多元素
list5[1:]=list2
print('list添加新元素之后',list5)
#将第二个元素替换为另一个列表中的所有元素
list5=[1,2,3,4]
list5[1:2]=list2
print('list添加新元素之后',list5)

运行结果:

list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123]
list添加新元素之后 [1, ‘s’, ‘h’, ‘y’, ‘ee’, 123, 3, 4]

移除元素
remove
1
2
3
4
5
6
print('list添加新元素之后',list5)
# remove 移除出现的第一个元素
list6=[1,2,3,3,4,4,5,6,1]
list6.remove(3)
print(list6)
list6.remove(111)

运行结果:[1, 2, 3, 4, 4, 5, 6, 1]

运行报错:ValueError: list.remove(x): x not in list

pop
1
2
3
# 移除索引为n的元素
list6.pop(3)
print(list6)

运行结果:[1, 2, 3, 4, 5, 6, 1]

1
2
# 如果不知名参数,pop将删除列表中最后一个元素
print(list6.pop())

运行结果:1

切片
1
2
3
4
# 用切片删除多个元素
print(list6)
list6[1:3]=[]
print(list6)

运行结果:

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

del&clear
1
2
3
4
5
6
# clear:清空列表
list6.clear()
print(list6)
# delete:删除列表
del list6
print(list6)

运行结果:

[]

NameError: name ‘list6’ is not defined

修改
1
2
3
4
5
6
# 修改
list7=[1,23,4,3,2]
list7[1]=1
print(list7)
list7[1:3]=11,2,3
print(list7)

运行结果:

[1, 1, 4, 3, 2]
[1, 11, 2, 3, 3, 2]

排序
1
2
3
4
5
6
7
8
9
# sort默认升序
list7.sort()
print(list7)
# 降序排序
list7.sort(reverse=True)
print(list7)
# sorted
list9=sorted(list7,reverse=True)
print('list7:',list7,'list8:',list8,'list9:',list9)

运行结果:

[1, 2, 2, 3, 3, 11]
[11, 3, 3, 2, 2, 1]
list7: [11, 3, 3, 2, 2, 1] list8: [1, 2, 2, 3, 3, 11] list9: [11, 3, 3, 2, 2, 1]

生成
1
2
3
4
5
6
# 列表生成
lst=[i*i for i in range(1,10)]
print(lst)
# 产生元素为2,4,6,8,10的列表
lst=[i*2 for i in range(1,6)]
print(lst)

运行结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]
[2, 4, 6, 8, 10]

字典

创建字典

使用{}创建
1
2
3
4
# 字典的创建方式
# 使用{}创建
dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
print(dict1,type(dict1))

运行结果:

{‘张三’: 13, ‘李四’: 15, ‘王五’: 20, ‘赵六’: ‘’} <class ‘dict’>

使用内置函数
1
2
3
# 使用内置函数dict
student=dict(name='Shyee',age=22)
print(student)

运行结果:

{‘name’: ‘Shyee’, ‘age’: 22}

创建空字典

1
d={}

获取字典中的元素

1
2
3
4
5
# 获取字典元素
print(dict1['张三'],dict1['jojo'])
# 或者
print(dict1.get('李四'),dict1.get('jojo'))
print(dict1.get('jojo',30))

运行结果:

13
KeyError: 'jojo'

15 None

30

判断在不在字典里

1
2
3
# 判断在不在字典里
print('李四' in dict1)
print('李四' not in dict1)

运行结果:

True
False

删除字典中的元素

1
2
3
# 删除字典中的元素
del dict1['王五']
print(dict1)

运行结果:

{‘张三’: 13, ‘李四’: 15, ‘赵六’: ‘’}

1
2
3
#清空字典
dict1.clear()
print(dict1)

运行结果:

{}

新增

1
2
3
# 新增
dict1['jojo']=20
print(dict1)

运行结果:

{‘jojo’: 20}

修改

1
2
3
# 修改
dict1['jojo']=1
print(dict1)

运行结果:

{‘jojo’: 1}

获取所有的key

1
2
3
4
5
dict1={"张三":13,"李四":15,"王五":20,"赵六":""}
# 获取所有的key
print(dict1.keys())
# 转成列表
print(list(dict1.keys()))

运行结果:

dict_keys([‘张三’, ‘李四’, ‘王五’, ‘赵六’])
[‘张三’, ‘李四’, ‘王五’, ‘赵六’]

获取所有的值

1
2
3
# 获取所有的值
print(dict1.values())
print(list(dict1.values()))

运行结果:

dict_values([13, 15, 20, ‘’])
[13, 15, 20, ‘’]

获取所有的键值对

1
2
3
# 获取所有的键值对
print(dict1.items())
print(list(dict1.items())[0][0])

dict_items([(‘张三’, 13), (‘李四’, 15), (‘王五’, 20), (‘赵六’, ‘’)])
张三

字典的遍历

1
2
3
# 字典的遍历
for item in dict1:
print(item,dict1[item],dict1.get(item))

运行结果:

张三 13 13
李四 15 15
王五 20 20
赵六

字典的特点

· 字典中的所有元素都是一个key-value对, key不允许重复, value可以重复

· 字典中的元素是无序的

· 字典中的key必须是不可变对象

· 字典也可以根据需要动态地伸缩

· 字典会浪费较大的内存,是一种使用空间换时间的数据结构

内置函数zip()

1
2
3
4
5
6
# 内置函数zip()
# 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
items=['A','B','C','D']
codes=[27,28,29,30,31,32]
d={item.upper():code for item,code in zip(items,codes)}
print(d)

运行结果:

{‘A’: 27, ‘B’: 28, ‘C’: 29, ‘D’: 30}

元组

不可变序列与可变序列

不变可变序:字符串、元组
不变可变序列:没有增、删,改的操作
可变序列:列表、字典
可变序列:可以对序列执行增、删、改操作,对象地址不发生更改

元组的创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 元组的创建
t=('a',1,'1',('a',1,'1'),['l'],{'a'})
t1='a',1,'1',('a',1,'1'),['l'],{'a'}
print(t)
print(t1,type(t1))
t2=tuple(('a',1,'1',('a',1,'1'),['l'],{'a'}))
print(t2,type(t2))
# 如果元组当中只包含一个元素,用括号创建元组的时候应加逗号
s1=('ss')
s2='ss'
t1=('tt',)
t2='tt',
print("s1:",s1,type(s1))
print("s2:",s2,type(s2))
print("t1:",t1,type(t1))
print("t2:",t2,type(t2))
# 创建空元组
et=()
et1=tuple()
print("et:",et,type(et))
print("et1:",et1,type(et1))

#运行结果:
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'})
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
('a', 1, '1', ('a', 1, '1'), ['l'], {'a'}) <class 'tuple'>
s1: ss <class 'str'>
s2: ss <class 'str'>
t1: ('tt',) <class 'tuple'>
t2: ('tt',) <class 'tuple'>
et: () <class 'tuple'>
et1: () <class 'tuple'>

元组的修改

1
2
3
4
# 如果对元组中的值进行修改
t=('a',1,'1',('a',1,'1'),['l'],{'a'})
t[3]=1
print(t[3])

报错:TypeError: 'tuple' object does not support item assignment

1
2
3
# 向t[4]添加元素
t[4].append(3)
print(t[4],id(t[4]))

运行结果:

[‘l’] 2052995427208
[‘l’, 3] 2052995427208

元组的遍历

1
2
3
# 元组的遍历
for item in t:
print(item)

a
1
1
(‘a’, 1, ‘1’)
[‘l’, 3]
{‘a’}

集合

集合的创建

1
2
s={1,1,2,2,3,3,"a","a",'a',{'s'},{'s'}}
print(s)

报错:TypeError: unhashable type: 'set'

1
2
s={1,1,2,2,3,3,"a","a",'a'}
print(s)

运行结果:{1, 2, 3, ‘a’}

不能重复

内置函数set

1
2
3
4
5
6
7
# 内置函数set
s=set(range(6))
print(s)
print(set([3,4,5,""]))
print(set(([3,4,5,""])))
print(set('Python'))
print(set())

运行结果:

{0, 1, 2, 3, 4, 5}
{‘’, 3, 4, 5}
{‘’, 3, 4, 5}
{‘n’, ‘y’, ‘t’, ‘h’, ‘P’, ‘o’}
set()

集合的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 判断
print(9 in s)
# 新增
s.add('s')
print(s)
s.update('o')
print(s)
# 删除
s.remove('a')#报错:KeyError: 'a'
print(s)
s.discard('a')#不报错也不执行
print(s)
s={1,1,2,2,3,3,"a","a",'a'}
print(s)
s.pop()
print(s)
s={1,1,2,2,3,3,"a","a",'a'}
s.clear()
print(s)

运行结果:

False
{0, 1, 2, 3, 4, 5, ‘s’}

{0, 1, 2, 3, 4, 5, ‘o’, ‘s’}

{‘a’, 1, 2, 3}
{1, 2, 3}
set()

字符串

字符串的驻留机制

1
2
3
4
a='Python'
b="Python"
c='''Python'''
print(a,id(a),b,id(b),c,id(c))

运行结果:

Python 2116166832240 Python 2116166832240 Python 2116166832240

有驻留的情况:

字符串的长度为0或1时·符合标识符的字符串

字符串只在编译时进行驻留,而非运行时

[-5,256]之间的整数数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> s1=''
>>> s2=''
>>> s1 is s2
True
>>> s1='aa%'
>>> s2='aa%'
>>> s1==s2
True
>>> s1 is s2
False
--------------------
>>> a='abc'
>>> b='a'+'bc'
>>> c=''.join(['ab','c'])
>>> a,b,c
('abc', 'abc', 'abc')
>>> a is b
True
>>> a is c
False

sys中的intern方法强制驻留

1
2
3
4
5
6
>>> import sys
>>> a='asd%'
>>> b='asd%'
>>> a =sys.intern(b)
>>> a is b
True

然而pycharm对字符串进行了优化处理(会驻留)

注:在需要进行字符串拼接时建议使用str类型的join方法,而非+,因为join()方法是先计算出所有字符中的长度,然后再拷贝,只new一次对象,效率要比”+”效率高

字符串的查询

1
2
3
4
5
s='hello,hello'
print(s.index('lo'))
print(s.find('lo'))
print(s.rindex('lo'))
print(s.rfind('lo'))

运行结果:

3
3
9
9

大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
s='Hello this is Shyee'
print("s:"+s,id(s))
a=s.upper()
b=s.lower()
c=s.swapcase()
d=s.capitalize()
e=s.title()
print("upper:",a,id(a))
print("lower:",b,id(b))
print("swapcase:",c,id(c))
print("capitalize:",d,id(d))
print("title:",e,id(e))

运行结果:

s:Hello this is Shyee 1336088248112
upper: HELLO THIS IS SHYEE 1336088256560
lower: hello this is shyee 1336088256720
swapcase: hELLO THIS IS sHYEE 1336088256800
capitalize: Hello this is shyee 1336088258240
title: Hello This Is Shyee 1336088258320

对齐操作

1
2
3
4
5
6
7
s='Hello this is Shyee'
print(s.center(22,'*'))#居中
print(s.center(15,'*'))#参数小于字符串长度,打印字符串
print(s.ljust(22,'-'))#第二个参数默认空格
print(s.rjust(22,"#"))
print(s.zfill(22))#默认左填零对齐
print('-123'.zfill(10))

运行结果:

Hello this is Shyee*
Hello this is Shyee
Hello this is Shyee—
###Hello this is Shyee
000Hello this is Shyee
-000000123

拆分

1
2
3
4
5
6
7
8
9
10
11
s='Hello this is Shyee'
a=s.split()#默认从左以空格分割
print(a)
a=s.split(sep='s')#指定分割符
print(a)
a=s.split(sep=' ',maxsplit=2)#指定最大分割次数
print(a)
a=s.rsplit()#从右侧
print(a)
print(s.rsplit(sep='s'))
print(s.rsplit(sep=' ',maxsplit=2))

运行结果:

[‘Hello’, ‘this’, ‘is’, ‘Shyee’]
[‘Hello thi’, ‘ i’, ‘ Shyee’]
[‘Hello’, ‘this’, ‘is Shyee’]
[‘Hello’, ‘this’, ‘is’, ‘Shyee’]
[‘Hello thi’, ‘ i’, ‘ Shyee’]
[‘Hello this’, ‘is’, ‘Shyee’]

字符串的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#判断是否是合法的标识符
print('hello,Shyee','hello,Shyee'.isidentifier())
print('hello','hello'.isidentifier())
print('中文_','中文_'.isidentifier())
print('中文_123','中文_123'.isidentifier())
print('hello Shyee','hello Shyee'.isspace())
print(" "," ".isspace(),"\t".isspace())
# 判断是否全由字母(汉字)组成
print('hello Shyee','hello Shyee'.isalpha())
print('helloShyee','helloShyee'.isalpha())
print('中文','中文'.isalpha())
# 判断是否全部是10进制的数字
print('123','123'.isdecimal())
print('123fh','123fh'.isdecimal())
# 判断是否全部有数字组成
print('123','123'.isnumeric())
print('四','四'.isnumeric())
print('ⅤⅢⅣ','ⅤⅢⅣ'.isnumeric())
# 判断是否全部是字母(汉字)和数字组成
print('123中文','123中文'.isalnum())
print('ⅤⅢⅣasd','ⅤⅢⅣasd'.isalnum())

运行结果:

hello,Shyee False
hello True
中文_ True
中文_123 True
hello Shyee False
True True
hello Shyee False
helloShyee True
中文 True
123 True
123fh False
123 True
四 True
ⅤⅢⅣ True
123中文 True
ⅤⅢⅣasd True