python第二天

作者:

在

列表(List)

列表是一个有序的可变集合,可以存储不同类型的元素。列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据。而且列表是有序的,有索引值,可切片,方便取值。

###  定义列表
fruits = ["apple", "banana", "cherry"]
print(fruits)

# Output:
['apple', 'banana', 'cherry']

增加元素

# 1. 按照索引的位置去增加
fruits.insert(1, "kiwi")

# 2. 在最末尾添加
fruits.append("orange")

# 3. 用迭代的方式去添加
fruits.extend(['a','b','c'])        
# 可以添加列表、字典等,把其中的元素依次添加到末尾,而append会把括号当成一个整体添加到末尾

# Output:
['apple', 'kiwi', 'banana', 'cherry', 'orange', 'a', 'b', 'c']

删除元素

# 1. 按照索引位置去删除
fruits.pop()        # 默认是删除最后一个,可以加上索引。并且有返回值,返回值为删除的元素
fruits.pop(1)

想得到返回值:poped_fruits=fruits.pop(1)    可以pop(index)得到任意单元素变量


 # 2. 清空列表
fruits.clear()

# output: [] 

修改元素

# 1. 按照索引位置 ,修改某个元素的值
fruits = ["apple", "banana", "cherry"]
fruits[1] = "orange"
print(fruits)

# Output:
['apple', 'orange', 'cherry']

# 2. 按照切片范围修改
fruits[0:2] = ['kiwi','orange']
print(fruits)

# Output:
['kiwi', 'orange', 'cherry']

查找元素

# 1. 用变量名.index("元素名") ,返回元素的索引
fruits = ["apple", "banana", "cherry"]
index_of_apple = fruits.index("apple")
print(index_of_apple)

# Output:
0

# 2. 用变量名.count("元素名")方法,返回元素出现的次数
count_of_cherry = fruits.count("cherry")
print(count_of_cherry)

# Output:
1

列表的切片

切片:切出==新的列表== ,按照索引位置切片

li = [1,2,4,5,4,2,4]
sub_li = li[2:5]
print(sub_li)

# Output:
[4, 5, 4]

排序和反序方法

# 1. 对列表进行排序
li.sort( )
print(li)

# 按照首字母顺序和数字大小排列

#2. 将列表中的元素反向存放
li.reverse()
print (li)

# Output:

[1, 2, 2, 4, 4, 4, 5]
[5, 4, 4, 4, 2, 2, 1]

元组(Tuple)

有序的==不可变集合==, 即==只读列表==,里面==数据不可被修改==

定义元组

tuple = (1,2,3,'a','b','c')
print(tuple)
print(tuple[1])

# 可以删除元素吗?
tuple.pop()

# 报错里面的元素不可-增或删-,pop()方法用不了

可变元组

tuple 其实==不可变的是地址空间==,如果地址空间里存的是List,Dict,那么==列表或字典里的元素可增改==,列表或字典不可删除

tuple = (1, 2, 3, [1, 4, 7])
print(tuple)
tuple[3][2] = 100
print(tuple)

# Output:
(1, 2, 3, [1, 4, 7])
(1, 2, 3, [1, 4, 100])

<img src=”https://li-zheng-blog-2026.oss-cn-shanghai.aliyuncs.com/blog/%E5%85%83%E7%BB%84%E7%A9%BA%E9%97%B4%E5%9C%B0%E5%9D%80.png” style=”zoom: 80%;” />

字典(Dict)

字典是 python 中唯一的==映射==类型,采用键值对(key-value)的形式存储数据。python 对 key 进行哈希函数运算,根据计算的结果决定 value 的存储地址,所以字典是==无序存储==的,且key必须是可哈希的。可哈希表示==key== 必须是不可变类型,如:==数字、字符串、元组==。

不过在 Python 3.6 版本以后,字典会保留插入顺序,变成有序数据结构。

而且键是具有唯一性的,==每个键只能出现一次==,但是值没有限制,在一个字典中可以出现多个相同的值

定义字典

dic = {'name':'nls','age':18,'job':'teacher'}
print(dic)
print(dic['name'])
print(dic['age'])
print(dic['job'])

# Output:
{'name': 'nls', 'age': 18, 'job': 'teacher'}
nls
18
teacher

==注意==:键不可变且只出现一次不能有相同的key,但value不唯一

dic = {'name':'nls','age':18,'job':'teacher'}

# 1. 直接通过键值对来增加
dic['hobby'] = 'study'        # 如果键已经存在,那么就会替换原来的值

print(dic)

# Output: {'name': 'nls', 'age': 18, 'job': 'teacher', 'hobby': 'study'}

删除键值

dic = {'name':'nls','age':18,'job':'teacher'}

# 1. 删除指定的键,并且返回对应的值
name = dic.pop('job')
hobby = dic.pop('hobby','None')        # 可以在后面加上一个异常处理,如果key不存在,就输出后面的内容
print(dic)
print(name)
print(hobby)

# Output:
{'name': 'nls', 'age': 18}
teacher
None

# 2. 删除最后插入的键值对
dic_pop = dic.popitem()
print(dic_pop)

#返回一个元组:('job','teacher')


# 3. 清空字典
dic.clear()
print(dic)

# Output: {}

修改键值

dic = {'name':'nls','age':18,'job':'teacher'}
dic['age'] = 25

print(dic)

# Output:
{'name': 'nls', 'age': 25, 'job': 'teacher'}

查找键值

dic = {'name':'nls','age':18,'job':'teacher'}
# 1. 直接通过键名获取,如果不存在会报错
value = dic['name']
print(value)


# 2. IN关键字,存在返回True,反之False
exists = "name" in dic
print(exists)

# Output:
True

其他操作

dic = {'name':'nls','age':18,"phone":['1888888888','0511-10101010']}
# 字典里面的value也可以是容器类型的数据,比如列表,字典等等...但是key必须是不可变的
print(dic)

# 1. 对键和值进行迭代操作
for i in dic.items():
    # 将键和值作为元组列出
    print(i)


# Output:
('name', 'nls')
('age', 18)
('phone', ['1888888888', '0511-10101010'])


# 2. 使用keys()和values()方法获取键值
keys = dic.keys()
print(keys)            # dict_keys(['name', 'age', 'phone']) 
value = dic.values()
print(value)          # dict_values(['nls', 18, ['1888888888', '0511-10101010']])

# 想将其转化为列表
key_list=list(keys)
val_list=list(value)

# ['name','age','phone']
# ['nls',18,['1888888888','0511-10101010']]

==注意==:直接取键或值的列表print( list( dict.keys( ) ) )

​ print( list( dict.values( ) ) )

['name','age','phone']
['nls',18,['1888888888','0511-10101010']]

集合(Set):无序,去重,{ }

集合是无序的,不重复,确定性的数据集合,它里面的==元素是不可变==,但是集合本身是可变的(所以集合做不了字典的键)。以下是集合最重要的两点:

  • ==去重==,把一个列表变成集合,就==自动去重==了。set( ) 括号里放List,Dict,Tuple,Str,
  • 关系测试,测试两组数据之前的交集、差集、并集等关系。

add 增加元素

set1 = {1,2,3,'a','b','c'}
# 1. 使用add()方法为集合增加元素,因为无序所以set没有append( )方法
set1.add('Apple')
print(set1)

# Output:
{'a', 1, 2, 3, 'c', 'Apple', 'b'}

# 2. 使用update()方法迭代的去增加
set1.update('Helloworld')
# update接收的参数应该是可迭代的数据类型,比如字符串、元组、列表、集合、字典。这些都可以向集合中添加元素,但是整型、浮点型不可以
set1.update([4,5,6])
print(set1)

# Output:
{1, 2, 3, 4, 5, 6,'a','b','c','H','e','l','o','w','r','d'}

==注意==:[4,5,6]里面元素是一个一个加进去的

​ 'Helloworld'这个字符串里的单个字符是一个一个加进去的,并且去重了,集合是不重复的

remove 删除元素

set1 = {1,2,3,'a','b','c'}
# 1. 使用remove()方法删除元素,因为无序所以不能pop(index)按索引删除元素
set1.remove('a')

print(set1)

# Output:
{1, 2, 3, 'c', 'b'}

关系测试

交集

取出两个集合共有的元素

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}

print(set1 & set2)     #  &=and

# Output:
{3, 4, 5}

反交集:交集的补集

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}

print(set1 ^ set2)    # 全集-交集

# Output:
{1, 2, 6, 7}

并集

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}

print(set1 | set2)  #  | = set1 + set2

# Output:
{1, 2, 3, 4, 5, 6, 7}

差集

第一个集合去除二个集合的共同元素

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}

print(set1 - set2)

# Output:
{1, 2}

子集与超集

当一个集合的所有元素都在另一个集合里,则称这个集合是另一个集合的子集,另一个集合是这个集合的超集

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)  #  set1 是子集, set2是超集


print(set2 > set1)

frozenset不可变集合

set1 = {1,2,3,4,5,6}

set2 = frozenset(set1)
print(set2)

set2.add(7) # 不可以修改,会报错,frozenset冻结了集合

# Output:
# 报错

==数据结构总结==

数据结构 字符串str ” “ 列表list [ ] 元组 ( ) 字典Dict{ } 集合 Set { }
描述 字符的序列 有序的,可变 [ ] 有序的,不可变,( ) 无序的,键值对,{ } 无序的,可变集合set( )
特性 不可变 可变,支持重复 不可变,支持重复 可变,键唯一 无序,可变,==不支持重复==

数据结构是计算机存储、组织数据的方式。选择合适的数据结构,可以显著提升算法的效率。简单来说,它定义了数据如何存放以及数据之间有何关系。


一:为什么要学习数据结构? 它的核心价值在于权衡与优化。同一个问题可以用不同数据结构解决,但效率天差地别。

提高效率:良好的数据结构能显著提升算法的时间(如查找、排序)和空间效率。例如,在100万条记录中查找一个用户,哈希表(O(1))比数组遍历(O(n))快数十万倍。

组织复杂数据:现实世界的数据关系复杂(如组织架构、社交网络),需要树、图等结构来建模。

支持特定操作:有些问题需要特殊的存取方式,比如撤销操作天然适合“后进先出”的栈结构。

二:如何选择合适的数据结构? 没有完美的数据结构,只有最合适的。选择时主要考虑以下三点:

核心操作:你的程序主要进行查找、插入、删除还是排序?

数据量级:数据是固定的几十个,还是百万级动态增长?

数据关系:数据间是一对一的线性关系,还是一对多的层次、多对多的网状关系?

一个经典的选择场景:实现一个网页的“最近浏览记录”功能,要求快速访问最近5条记录,且新记录要淘汰最旧的。这个需求恰好符合队列的先进先出特性,并用固定大小的数组实现即可。

流程控制

判断语句

语法:

if 条件:
    满足条件后要执行的代码

==注意==:只有条件== ==True==时才可执行 if 板块体内缩进代码

多分支判断

if 条件:
    满足条件执行代码
elif 条件:
    上面的条件不满足就走这个
elif 条件:
    上面的条件不满足就走这个
elif 条件:
    上面的条件不满足就走这个    
else:
    上面所有的条件不满足就走这段


# 成绩判断程序
# 提示用户输入成绩
score = int(input("请输入成绩(0-100):"))

# 多分支判断成绩
if score >= 90 and score <= 100:
    print("优秀")
elif score >= 60 and score < 90:
    print("良好")
elif score >= 0 and score < 60:
    print("不及格")
else:
    print("输入错误,请输入0到100之间的成绩。")

==注意==:只有一个分支会运行

循环语句 – while

语法:

while 条件:
     循环体

# 循环条件可以直接是True/False或者1/0,也可以是某个语句...

如果条件为真,那么循环体则执行 ; 如果条件为假,那么循环体不执行

示例:猜数字小游戏

print('猜数字游戏开始')
num = 54
while True:
    guess = int(input("您猜数字是什么?(输入0-100的数字):"))
    if guess < num:
        print("您猜小了")
        continue
    elif guess > num:
        print("您猜大了")
        continue
    break

print("您猜对了!")

# Output:
猜数字游戏开始
您猜数字是什么?(输入0-100的数字):10
您猜小了
您猜数字是什么?(输入0-100的数字):50
您猜小了
您猜数字是什么?(输入0-100的数字):60
您猜大了
您猜数字是什么?(输入0-100的数字):54
您猜对了!

==注意==: continue 会跳过 单分支条件判断,break会跳出循环体while终止循环

循环终止语句

break

用于完全结束一个循环,跳出循环体执行循环后面的语句

continue

和 break 有点类似,区别在于 continue 只是终止本次循环,接着还执行后面的循环,break 则完全终止循环

while …… else

while 后面的 else 作用是指,当 while 循环正常执行完,中间没有被 break 中止的话,就会执行 else 后面的语句

  • 语法:
while condition:
    # 循环体
    if some_condition:
        break
else:
    # 循环正常结束时执行的代码

循环语句for

for 循环:用户按照顺序循环可迭代对象的内容

语法:

for variable in iterable:
    # 循环体
    # 执行的代码

遍历列表

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# Output:
apple
banana
cherry

遍历字符串

word = "helloworld"
for letter in word:
    print(letter)

# Output:
h
e
l
l
o
w
o
r
l
d

enumerate

enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate 将其组成一个索引序列,利用它可以同时获得==索引==和==值==。

li = ['甲','乙','丙','丁']
for i in enumerate(li):
    print(i)

for index,value in enumerate(li):
    print(index,value)

for index,value in enumerate(li,100):      #  从哪个数字开始索引
    print(index,value)

# Output:
(0, '甲')
(1, '乙')
(2, '丙')
(3, '丁')
0 甲
1 乙
2 丙
3 丁
100 甲
101 乙
102 丙
103 丁

range

指定范围,生成指定数字

for i in range(1,10):
    print(i)

for i in range(1,10,2):  # 步长,取奇数
    print(i)

小游戏案例

import random
# random产生随机值或者从给定值中随机选择

# 可选择的选项
options = ["石头", "剪子", "布"]

print("欢迎来到石头剪子布游戏!")
print("请从以下选项中选择:")
for i, option in enumerate(options):
    print(f"{i + 1}. {option}")

# 玩家选择
player_choice = int(input("请输入你的选择(1-3):")) - 1

# 计算机随机选择
computer_choice = random.randint(0, 2)

print(f"n你选择了:{options[player_choice]}")
print(f"计算机选择了:{options[computer_choice]}")

# 判断胜负
if player_choice == computer_choice:
    print("平局!")
elif (player_choice == 0 and computer_choice == 1) or 
     (player_choice == 1 and computer_choice == 2) or 
     (player_choice == 2 and computer_choice == 0):
    print("你赢了!🎉")
else:
    print("你输了!😢")