网站首页 > 知识剖析 正文
list和tuple
list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以添加和删除其中的元素。
例如:
>>> names = ['liyang', 'lishan', 'jimmy']
>>> names
['liyang', 'lishan', 'jimmy']
获取列表的长度,如:
>>> len(names)
3
list中索引是记录数组元素的位置,如
>>> names[0]
liyang
>>> names[1]
lishan
>>> names[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
当访问list索引超出了范围时,Python会报一个IndexError错误,最后一个元素的索引是len() - 1。
如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:
>>> names[-1]
jimmy
list是一个可变的有序表,所以,可以往list中追加元素到末尾:
>>> names.append("xiaoqiang")
>>> names
['liyang', 'lishan', 'jimmy',"xiaoqiang"]
需要删除list指定位置的元素,用pop(i)方法,其中i是索引位置:
>>> names.pop(0)
liyang
>>> names
['lishan', 'jimmy',"xiaoqiang"]
需要删除list最后一位元素是,则直接通过pop()方法:
>>> names.pop()
xiaoqiang
>>> names
['lishan', 'jimmy']
tuple
tuples是有序列表官方称呼为元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,它是一个定长类型的有序列表。例如
>>> names = ('liyang', 'lishan', 'jimmy')
>>> names
('liyang', 'lishan', 'jimmy')
此时,names这个tuple不能变了,它没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用names[0],names[-1],但不能赋值成另外的元素。
这个时候我们思考一下不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果是这样的话,能用tuple代替list就尽量用tuple。
tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
>>> t = (1, 2, 3)
>>> t
(1, 2, 3)
若想定义空tuple
>>> t = ()
>>> t
()
dict和set
dict
Python内置了字典:dict的支持,dict全称dictionary,使用键-值(key-value)存储,具有极快的查找速度。假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:
>>> names = ['liyang', 'lishan', 'jimmy']
>>> scores = [80, 81, 82]
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。例如:
>>> d = {'liyang': 80, 'lishan': 81, 'jimmy': 82}
>>> d['liyang']
80
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了2万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
dict就是第二种实现方式,给定一个名字,比如’liyang’,dict在内部就可以直接计算出liyang对应的存放成绩的“页码”,也就是80这个数字存放的内存地址,直接取出来,所以速度非常快。
你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:
>>> d['liyang'] = 88
>>> d['liyang']
88
且多次赋值,前一次key的value值会被覆盖,如
>>> d['liyang'] = 72
>>> d['liyang']
72
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,用{x,y,z,…} 且列出每个元素:
>>> s = {1, 2, 3}
>>> s
{1, 2, 3}
重复元素在set中会被自动过滤:
>>> s = {1, 2, 3, 3}
>>> s
{1, 2, 3}
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
通过remove(key)方法可以删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
条件判断
if
计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。
比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现:
age = 20
if age >= 18:
print('your age is', age)
根据Python的缩进规则,如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做。
if...else
也可以给if添加一个else语句,意思是,如果if判断是False,不要执行if的内容,去把else执行了:
age = 3
if age >= 18:
print('your age is', age)
else:
print('your age is', age)
if 后面可以跟Python内置函数进行语句判断,如:
strs = "字符串"
if isinstance(strs, str):
print("字符串类型")
else:
print("其它类型")
语法糖
if 还有一个语法糖的写法,如:
age = 30
result = "年龄大于20" if age>20 else "年龄小于20"
print(result)
循环迭代
for...in
Python的循环有两种,一种是for…in循环,依次把list或tuple中的每个元素迭代出来,例如:
names = ['liyang', 'lishan', 'jimmy']
for name in names:
print(name)
打印出来的内容依次为:
liyang
lishan
jimmy
这里看到了,只能打印出list的元素,如果想打印出list key怎么办呢,可以通过如下方式进行迭代:
names = ['liyang', 'lishan', 'jimmy']
for key, name in enumerate(names):
print("key:{},value:{}".format(key, name))
打印出来的内容依次为:
key:0,value:liyang
key:1,value:lishan
key:2,value:jimmy
key=0、1、2就是list被迭代出来的key索引值。
如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list,如range(101)就可以生成0-100的整数序列,计算如下:
sum = 0
for x in range(101):
sum = sum + x
print(sum)
打印出的内容为:
5050
for…in 不仅可以迭代list,可以迭代dict,举例子如下:
d = {"name": "jimmy", "age": 21, "sex": "男"}
for key, value in enumerate(d):
print("dict-key:{}-value:{}".format(key, value))
打印出来的内容为:
dict-key:0-value:name
dict-key:1-value:age
dict-key:2-value:sex
while
while循环,当条件满足,就会不断循环,条件不满足时退出循环。比如我们要计算100以内所有奇数之和,可以用while循环这样实现:
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break
如果要提前结束循环,可以用break语句:
n = 1
while n <= 100:
if n > 5: # 当n = 6时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('end')
猜你喜欢
- 2025-05-25 应该早点了解 Python 中的 5 件事
- 2025-05-25 如何在Python中按值对字典进行排序?
- 2025-05-25 Python多进程:释放多核CPU的洪荒之力
- 2025-05-25 一天快速入门 Python
- 2025-05-25 python零基础不要错过,python字典的所有类型
- 2025-05-25 Python 100个函数及代码!码住
- 2025-05-25 Python速查表
- 2025-05-25 必知必会的15个Python知识点
- 2025-05-25 Python函数参数和返回值类型:让你的代码更清晰、更健壮
- 2025-05-25 Python语言的12个基础知识点小结
- 05-25应该早点了解 Python 中的 5 件事
- 05-25如何在Python中按值对字典进行排序?
- 05-25Python多进程:释放多核CPU的洪荒之力
- 05-25一天快速入门 Python
- 05-25python零基础不要错过,python字典的所有类型
- 05-25Python 100个函数及代码!码住
- 05-25Python速查表
- 05-25必知必会的15个Python知识点
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)