Python基础-05

目录

1.列表

1.1定义

特别注意!!!

1.2基础操作

1.2.1创建空列表

1.2.2获取元素

1.2.3添加元素

1.2.4删除元素

1.2.5定位元素

1.2.6遍历列表

2.内存图

2.1修改列表元素

2.2修改列表变量

2.3切片

练习1

练习2

练习3

3.浅拷贝与深拷贝

4.列表VS字符串

练习


1.列表

1.1定义

由一系列变量组成的可变序列容器(字符串是指由一系列字符组成的不可变序列容器)

特别注意!!!

列表不能一边循环一边删除!!!如果一定要这么做可以倒着来。

练习:删除已知列表中大于10的元素

# 经典错法:
data_list = [9, 25, 12, 8]
for item in data_list:
    if item > 10:
        data_list.remove(item)
print(data_list)    # [9, 12, 8]
​
# 倒着来,正确做法
data_list = [9, 25, 12, 8]
for item in data_list[::-1]:
    if item > 10:
        data_list.remove(item)
print(data_list)    # [9, 8]

1.2基础操作

1.2.1创建空列表

list01 = []         # 根据数据构建列表
list_01 = list()    # 根据容器构建列表
​
list01=["悟空",100,True]
list_01 = list("我是齐天大圣")        # ['我', '是', '齐', '天', '大', '圣']

1.2.2获取元素

# 索引和切片的作用是定位元素
list01 = ["悟空", 100, True, "八戒", None, 666, '999', False]
# 索引
print(list01[2])
# 切片
print(list01[-4:])      # 取后四个

1.2.3添加元素

list01 = ["悟空", 100, True, "八戒", None, 666, '999', False]
list01.append("鲁智深")        # 在末尾添加
list01.insert(0,"唐三藏")      # 在指定位置添加

1.2.4删除元素

list01 = ["悟空", 100, True, "八戒", False]
# 根据元素删除
list01.remove("八戒")
# 根据位置删除
del list01[2]

特别注意:用for循环遍历列表并删除满足条件的元素时,后一个会替换前一个,所以一边循环一边删除会报错。如果一定要这么做,可以倒着来。

1.2.5定位元素

定位元素可以增删改查。

list01 = ["悟空", 100, True, "八戒", False]
#           0      1     2     3      4
​
# 切片
del list01[1:3]
print(list01)
​
# 修改
list01[1:3]=["鲁智深","武松",666,"999"]
​
# 删除
list01[1:3] = []

1.2.6遍历列表

list01 = ["悟空", 100, True, "八戒", False]
# 遍历列表中的所有元素
for item in list01:
    print(item)
​
# 倒序获取所有元素
# 不建议,因为list01[::-1]是在重新创建新列表
# 通过切片拿元素,会重新创建新列表,所有不建议使用
for item in list01[::-1]:
    print(item)
​
# 建议通过索引来做:
list01 = ["悟空", 100, True, "八戒"]
#           0      1    2      3
# 倒序:3  2   1   0 或者 -1 -2 -3 -4
​
for i in range(len(list01) - 1, -1, -1):
    print(list01[i])
​
for j in range(-1, -len(list01) - 1, -1):
    print(list01[j])

2.内存图

2.1修改列表元素

list01 = ["张无忌", "赵敏"]
list02 = list01
list01[0] = "无忌"
print(list02)  # ['无忌', '赵敏']

Python基础-05_第1张图片 

 

2.2修改列表变量

list01 = ["张无忌", "赵敏"]
list02 = list01
list01= ["无忌"]
print(list02)  # ['张无忌', '赵敏']

Python基础-05_第2张图片 

 

2.3切片

注意:通过切片获取元素会创建新列表。

list01 = [800, 1000]
list02 = list01[:]      # 切片创建新列表(相当于拷贝列表)
list01[0] = 900
print(list02)  # [800, 1000]

Python基础-05_第3张图片 

 

list01 = [800, 1000]
list02 = list01[:]      # 切片创建新列表(相当于拷贝列表)
list01 = [500]
print(list02)  # [800, 1000]

Python基础-05_第4张图片 

 

练习1

list01 = [800, [1000,500]]
list02 = list01[:]      # 切片创建新列表(相当于拷贝列表)
list01[0] = 900
print(list02)  #  [800, [1000,500]]
# 内存图如下:

Python基础-05_第5张图片 

练习2

list01 = [800, [1000,500]]
list02 = list01
list01[1][0] = 900
print(list02)  #  [800, [900,500]]
# 内存图如下:

Python基础-05_第6张图片 

练习3

list01 = [800, [1000,500]]
list02 = list01[:]
list01[1][0] = 900
print(list02)  #  [800, [900,500]]
# 内存图如下:

Python基础-05_第7张图片 

3.浅拷贝与深拷贝

  • 浅拷贝:复制过程中,只复制一层变量,不会复制深层变量绑定的对象。

    默认就是浅拷贝,深拷贝更费内存。

    list01 = [800, [1000, 500]]
    list02 = list01[:]
    list03 = list01.copy()
    # list02与list03完全相同

  • 深拷贝:复制整个依赖的变量(一大家子全部复制)

    深拷贝之后,无论发生什么变化,原先拷贝变量的对象都不变,深拷贝比较费内存,但要清楚自己的目标,只要值得,费内存也是可以的。

    import copy
    ​
    list01 = [800, [1000, 500]]
    list02 = copy.deepcopy(list01)
    list01[1][0] = 900
    print(list02)   # [800, [1000, 500]]

Python基础-05_第8张图片 

 

4.列表VS字符串

  • 列表和字符串都是序列,元素之间有先后顺序关系。

  • 字符串是不可变的序列,列表是可变的序列。

  • 字符串中每个元素只能存储字符,而列表可以存储任意类型的数据。

  • 列表和字符串都是可迭代对象。

  • 函数:

    1. 列表 →字符串:将多个字符串拼接为一个

      # "连接符".join(列表)
      list01=["孙悟空","猪八戒","沙和尚"]
      result = "***".join(list01)     
      print(result)    # 孙悟空***猪八戒***沙和尚
      ​
      # -----------------------------------------
      # 需求:根据逻辑拼接一个字符串,"0123456789"
      # 优点:每次循环只向列表添加字符串,没有创建列表对象
      data = []
      for i in range(10):
          data.append(str(i))
      string = "".join(data)
      print(string)
      ​
      # 缺点:每次循环形成一个新的字符串对象,替换变量引用result
      data = ""
      for i in range(10):
          data += str(i)  # 字符串拼接
      print(data)
      ​
      # -------------------------------------------------
      # 练习:在控制台中循环输入字符串,如果输入空字符串则停止,最后打印所有内容
      list_temp = []
      while True:
          content = input("请输入内容:")
          if not content:
              break
          list_temp.append(content)
      result = "".join(list_temp)
      print(result)

    2. 字符串 → 列表:将一个字符串拆分为多个

      # "字符串".split("分隔符")
      string = "a-b-c-d"
      data_list = string.split("-")   
      print(data_list)    # ['a', 'b', 'c', 'd']
      ​
      # 练习:英文单词翻转
      # How are you ---→ you are How
      str_input = input("Please input your message in English:")
      list_input = str_input.split(" ")
      list_input.reverse()
      result = " ".join(list_input)
      print(result)

练习

1.在控制台中录入西游记中自己喜欢的任务,输入空字符串,打印所有任务(一行一个)

like_list = []
while True:
    name = input("请输入在西游记中您喜欢的人物:")
    if name:
        like_list.append(name)
    else:
        break
for item in like_list:
    print(item)
​
# 老师讲解
like_list = []
while True:
    name = input("请输入在西游记中您喜欢的人物:")
    if name =="":
        break
    like_list.append(name)
​
for item in like_lise:
    print(item)

2.在控制台中录入所有学生成绩,录入空字符串说明已录完,打印所有成绩,计算最高分、最低分及平均分

score_list = []
while True:
    score = input("请输入学生成绩(回车表示已录完):")
    if not score:
        break
    score = float(score)
    score_list.append(score)
print(score_list)
​
total = 0
min_score = score_list[0]
max_score = score_list[0]
​
print("所有学生成绩为:")
for item in score_list:
    print(item)  # 打印所有学生成绩
    total += item
    if item < min_score:
        min_score = item
    if item > max_score:
        max_score = item
print()
print("平均分为:", total / len(score_list),sep="")
print("最高分为:",max_score,sep="")
print("最低分为:",min_score,sep="")
​
​
# 优化版:
score_list = []
while True:
    score = input("请输入学生成绩(回车表示已录完):")
    if not score:
        break
    score = float(score)
    score_list.append(score)
​
print("所有学生的成绩为:")
for item in score_list:
    print(item)
​
mean_score = sum(score_list)/len(score_list)
max_score = max(score_list)
min_score = min(score_list)
text = "平均分为{},最高分为{},最低分为{}".format(mean_score,max_score,min_score)
print(text)

3.在控制台中录入所有学生姓名,如果姓名重复则提示"姓名已存在",不添加,如果录入空字符串则倒序打印所有学生

student_list = []
while True:
    name = input("请输入学生姓名:")
    if name == "":
        break
    if name in student_list:
        print("该姓名已存在")
    else:
        student_list.append(name)
​
print("学生名单为:")
for i in range(1,len(student_list)+1):
    i *= (-1)
    print(student_list[i])

4.已知某数据列表,将列表中大于30的数字存入另一个列表

data_list = [54, 25, 12, 42, 35, 17]
result = []
for item in data_list:
    if item > 30:
        result.append(item)
print(result)
# 内存图如下:

Python基础-05_第9张图片 

5.在控制台中录入五个数字,并打印最大值(不使用内置函数max)

data_list = []
for i in range(5):
    data = float(input("请输入数字:"))
    data_list.append(data)
print(data_list)
max_data = data_list[0]
for item in data_list:
    if item > max_data:
        max_data = item
print("最大值为:", max_data)
​
# 老师讲:如果输入数字是负数会有问题
max_number = 0
for i in range(5):
    number = int(input("请输入第%d个数字:" % (i + 1)))
    if number > max_number:
        max_number = number
print("最大值为:", max_number, sep="")

6.已知某列表,请输出其最大值(不适用内置函数max)

data_list = [54, 25, 12, 42, 35, 17]
max_data = data_list[0]
for item in data_list:
    if item > max_data:
        max_data = item
print("最大值为:", max_data, sep="")

7.已知某列表,删除列表中大于10的元素

删除列表元素会影响列表的长度,进而会影响列表的for循环,不能边循环边删除

data_list = [9, 25, 12, 8]
​
for num in data_list[::-1]: # 切片会创建新列表,浪费内存
    if num > 10:
        data_list.remove(num)
print(data_list)
​
# -----------------------------------------------
data_list = [9, 25, 12, 8]
for i in range(len(data_list)-1,-1,-1):
    if data_list[i] > 10:
        del data_list[i]
print(data_list)    # [9, 8]

Python基础-05_第10张图片 

8.计算某已知列表的最小值(不使用内置函数min)

data_list = [9, 25, 12, 8]
result = data_list[0]
for item in data_list:
    if item < result:
        result = item
print(result)

9.彩票-双色球:

红球:6个,1--33之间的整数,且不能重复

蓝球:1个,1--16之间的整数

(1)随机产生一注彩票[6个红球1个蓝球]

(2)在控制台中购买一注彩票,并提示:

“请输入第1个红球号码:”

”请输入第2个红球号码:“

“号码不在范围内”

“号码已经重复”

“请输入蓝球号码:”

import random
​
target = random.sample(range(1, 34), 6)
# 随机产生6个红球号码
blue = random.randint(1, 18)
# 随机产生一个蓝球号码
target.append(blue)
# 确定中奖号码
print(target)
print()
​
print("红球:1-33之间的整数")
buy_in = []
count = 1
while count < 7:
    red_in = int(input("请输入第%d个红球号码:" % count))
    if red_in in buy_in:
        print("该号码已存在,请重新输入!")
    elif red_in < 1 or red_in > 33:
        print("号码不在范围内,请重新输入!")
    else:
        buy_in.append(red_in)
        count += 1
print()
​
print("蓝球:1-17之间的整数")
blue_in = int(input("请输入蓝球号码:"))
buy_in.append(blue_in)
print(buy_in)
print()
​
success = 0
for num in range(7):
    if buy_in[num] == target[num]:
        success += 1
​
if success == 7:
    print("恭喜您中奖啦!!!")
else:
    print("很遗憾,本次您未能中奖!")
    
# 老师讲解-------------------------------------------------------
import random
​
target_ticket = []
# 产生6个不重复的红球号码
while len(target_ticket) < 6:
    random_number = random.randrange(1, 33)
    if random_number not in target_ticket:
        target_ticket.append(random_number)
# 产生一个蓝球号码
target_ticket.append(random.randrange(1, 16))
print(target_ticket)  # 中奖号码
​
list_ticket = []
while len(list_ticket) < 6:
    number = int(input("请输入第%d个红球号码:" % (len(list_ticket) + 1)))
    if number < 1 or number > 33:
        print("号码不在范围内")
    elif number in list_ticket:
        print("号码已经重复")
    else:
        list_ticket.append(number)
​
while True:
    number = int(input("请输入蓝球号码:"))
    if 0 < number <= 16:
        list_ticket.append(number)
        break
    print("号码不在范围内")
print(list_ticket)
​
if list_ticket != target_ticket:
    print("很遗憾未能中奖!")
else:
    print("恭喜您中奖啦!!!")

你可能感兴趣的:(Python教程1000节,python)