领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

python基础知识(二)

nixiaole 2025-05-25 14:42:34 知识剖析 2 ℃

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')
最近发表
标签列表