Python系统学习1-5-容器

目录

1、字符串

字符串字面值

转义字符:改变原有含义的特殊字符

格式化字符串

注意f-string使用

2、序列

编码

3、通用操作

1、数学运算符

2、成员运算符

3、索引

4、切片

4、列表

(1)创建

(2)添加(追加和插入)

(3)定位元素,利用索引或者切片

(4)删除元素:根据位置或根据元素值

(5)遍历列表元素,全部遍历或者根据条件遍历

(6)列表:内存分配

  在列表添加时,append直接将元素添加在末尾,insert则需将该位置及之后的数据地址后移,再放现在数据的地址。

在列表删除时,del和remove都需要将后面元素进行前移。

在列表遍历时,注意for item in 列表 和 for i in range(len(列表))

 画图homework

homework1

homework2


1、字符串

字符串是不可变的数据

原因:如果在原有内存中修改,很可能破坏其他数据的空间

现象:每次需要修改字符串时,都会创建新数据,替换变量中存储的地址

字符串字面值

(1)建议使用双引号

name01 = "悟空"

(2)冲突后使用单引号

name02 = '悟空'

(3)三引号,所见皆所得包括三单和三双,

print("""三 单 引号""")

转义字符:改变原有含义的特殊字符

print("我是\"花果山\"悟空")
print("我是\n花果山")
# 当引号中是文件位置时
# print("E:\aonth01\bay04-8月5日")
# 或者 双斜杠
print("E:\\aonth01\\bay04-8月5日")
#或者 加r,代表原始字符
print(r"E:\aonth01\bay04-8月5日")

格式化字符串

适用性:在字符串中插入变量
语法:字符串%(变量)
占位符:%s s代表str,原样输出
       %.1f  保留一个小数,支持四舍五入
       %.2d  保留两位整数,不足两位时,左侧用零填充
print("%.1f" % 1.29456) ¥ 1.2
# 不足两位时,左侧用零填充
print("%.2d:%.2d" % (9,5)) # 09:05

注意f-string使用

Python3.6及之后,可以使用f-string进行字符串格式控制。

f-string用大括{ }表示被替换字段,其中直接填入替换内容即可。

>>> name = "Huang Wei"
>>> f"Hello, my name is {name}"
#   'Hello, my name is Huang Wei'

f-string宽度与精度相关格式描述符:保留小数点位数
① 语法格式如下
在这里插入图片描述

>>> a = 123.456
# 只指定width
>>> f"{a:10}"
'   123.456'
# 只指定0width
>>> f"{a:010}"
'000123.456'
# 使用width.precision
>>> f"{a:8.1f}"
'   123.5'
>>> f"{a:8.2f}"
'  123.46'
>>> f"{a:.2f}"
'123.46'
# 在width后面,直接加f,表示补足小数点后的位数至默认精度6
>>> f"{a:2f}"
'123.456000'

2、序列

序列:由一系列字符组成的不可变序列容器,存储的是字符的编码值

字节:计算机存储的最小单位,等于8位bit,最大为十进制255。

字符:单个的数字,文字,符号

字符集:存储字符与二进制序列的对应关系(编码与解码,ASCII编码)

编码

Python系统学习1-5-容器_第1张图片

 ASCII编码:有100多字符,8个比特位最多可以表示255个字符,所以每个字符1个字节。

GBK编码:21003个中文,需要15个比特位全部表示,由于计算机中存储是以8个比特位为间隔,所以需要1个中文需要2个字节

Python系统学习1-5-容器_第2张图片

一般情况下使用UTF-8编码。

3、通用操作

1、数学运算符

+ 拼接
* 重复
> < >= <= == 比较运算,比较编码值,依次比较两个容器中元素,一旦不同则返回比较结果

print("悟空"+"猴子")
print("悟空" * 3)
print("悟空" > "八戒")
print("12w" == "16w")  # 单位一致,进行比较
print('12W' == "1200000")  # 单位不一致,结果错误

2、成员运算符

in,not in 判断元素是否在容器中

print("悟空" in "孙悟空")

编程练习:

"""
# 请输入整数:8
$$$$$$$$
$ $
$ $
$ $
$ $
$ $
$ $
$$$$$$$$
"""
# num = int(input("请输入数字:"))
# print("$"*num)
# for i in range(1,num-2):
#     print("$"+" "*(num-2)+"$")
# print("$"*num)

# 优化
# """
num = int(input("请输入数字:"))
for i in range(num):
    if i == 0 or i==num-1:
        print("$" * num)
    else:
     print("$"+" "*(num-2)+"$")

3、索引

索引
定位单个元素,编号为0到len()-1
容器[整数]

正向索引
反向索引 len()-1等价于-1
         0  等价于 -len()

4、切片

切片,越界不报错
定位多个元素
容器名[开始:结束:[间隔]],不包括结尾,间隔默认为1,可省略
容器名[开始:结束]
容器名[:结束],开始可以不写,默认为1,但冒号不能省略
容器名[:],开始和结束都可以不写,结束默认为尾,默认包括所有元素
容器名[-3:],倒数3个字符

4、列表

定义:使用一个变量,管理多个数据,擅长于处理单一维度数据

(1)创建

#  列表名 = [数据1,数据2]
list_name = ["王丽","王红","丽红"]
# 列表名= list(容器)
list_lq = list("王丽")  # 相当于类型转换

(2)添加(追加和插入)

## 添加
# 追加,只能放在末尾:列表名.append(数据)
list_name.append("李红")
# 插入:列表名.insert(位置,数据),前面的数据往后移动

(3)定位元素,利用索引或者切片

list_name = ["王丽","王红","丽红"]
# 读取单个元素
print(list_name[0])
# 修改单个元素
list_name[0] = "王丽丽"
# 读取多个元素
# 通过切片读取的原理会创建新容器
print(list_name[-2:])
# 修改多个元素
# 通过切片修改的原理会将右侧容器元素依次存入左侧
list_name[-2:] = ["ww","ll"]
print(list_name)

(4)删除元素:根据位置或根据元素值

list_name = ["王丽","王红","丽红"]
## 删除
# 根据定位删除:del 容器名[索引或切片],后面的数据往前移动
del list_name[1]
print(list_name)
del list_name[0:1]
print(list_name)
# 根据元素删除
# 如果不知道是否存在,先判断
# list_name.remove("丽丽") # 报错
if "理理" in list_name:
    list_name.remove("丽丽")

(5)遍历列表元素,全部遍历或者根据条件遍历

list_name = ["王丽丽","王红","丽红"]
# 打印所有姓名是2个字的元素
for item in list_name:
    if len(item) == 2:
        print(item)
# 将所有姓名是2个字的元素改为空字符串
# for item in list_name:  错误
#     if len(item) == 2:
#         item = ""  # 修改的是变量item,与列表无关
# print(list_name)  

for i in range(len(list_name)):
    if len(list_name[i]) == 2:
        list_name[i] = ""
print(list_name)

(6)列表:内存分配

list_name = ["李琦","周义杰","毛绍祺"]
# 列表一份
data01 = list_name
data02 = list_name[0]
# 切片会重新创建,列表二份
data03 = list_name[-2:]
# 因为是两个列表,所以互不影响
data03[0] = "义杰"
# 因为一份,所以互相影响
data01[0] = "琪琪"
print(list_name)

画图举例1:

Python系统学习1-5-容器_第3张图片

 画图举例2:

Python系统学习1-5-容器_第4张图片

自己画图: 

 Python系统学习1-5-容器_第5张图片

  在列表添加时,append直接将元素添加在末尾,insert则需将该位置及之后的数据地址后移,再放现在数据的地址。

Python系统学习1-5-容器_第6张图片

在列表删除时,del和remove都需要将后面元素进行前移。

Python系统学习1-5-容器_第7张图片

在列表遍历时,注意for item in 列表 和 for i in range(len(列表))

Python系统学习1-5-容器_第8张图片

Python系统学习1-5-容器_第9张图片

Python系统学习1-5-容器_第10张图片

5、列表的深拷贝与浅拷贝

深浅拷贝
    拷贝:复制/备份的过程,防止数据意外破坏
    浅拷贝:复制第一层数据,共享深层数据
        优点:占用内存较小
        缺点:当深层数据被修改时,互相影响
        适用性:优先
    深拷贝:复制所有层数据
        优点:绝对互不影响
        缺点:占用内存较大
        适用性:深层数据会被修改
list_name = ["李琪", ["周义杰", "毛绍祺"]]
data01 = list_name[:]  # 触发浅拷贝
data01[0] = "琪琪"  # 修改第一层(2份),互不影响
data01[1][0] = "义杰"  # 修改深层(1份),互相影响
print(list_name)

# 准备深拷贝工具
import copy

list_name = ["李琪", ["周义杰", "毛绍祺"]]
data01 = copy.deepcopy(list_name)# 执行深拷贝
data01[0] = "琪琪"  # 修改第一层(2份),互不影响
data01[1][0] = "义杰"  # 修改深层(2份),互不影响
print(list_name)

 Python系统学习1-5-容器_第11张图片

 Python系统学习1-5-容器_第12张图片

 画图homework

此处:list02=list01,属于赋值,传递列表地址,不属于拷贝

"""
    画出下列代码内存图
"""
import copy

list01 = ["北京", ["上海", "深圳"]]
# 赋值:传递列表地址(1份)
list02 = list01
# 浅拷贝:复制第一层(2份),共享深层(1份)
list03 = list01[:]
# 深拷贝:复制所有层(2份)
list04 = copy.deepcopy(list01)
# 互不影响
list04[0] = "北京04"
list04[1][1] = "深圳04"
print(list01)  # ?
# 互相影响
list02[0] = "北京02"
list02[1][1] = "深圳02"
print(list01)  # ?
# 修改第一层,互不影响
list03[0] = "北京03"
# 修改深层,互相影响
list03[1][0] = "上海03"
print(list01)  # ?

Python系统学习1-5-容器_第13张图片

homework1

# 4. 赌大小游戏
#     # 准备随机数工具
#     import random
#
#     number1 = random.randint(1,6)
#     number2 = random.randint(1,6)
#     玩家的身家初始10000,实现下列效果:
#         少侠请下注: 30000
#         超出了你的身家,请重新投注。
#         少侠请下注: 8000
#         你摇出了5点,庄家摇出了3点
#         恭喜啦,你赢了,继续赌下去早晚会输光的,身家还剩18000
#         少侠请下注: 18000
#         你摇出了6点,庄家摇出了6点
#         打平了,少侠,在来一局?
#         少侠请下注: 18000
#         你摇出了4点,庄家摇出了6点
#         少侠,你输了,身家还剩 0
#         哈哈哈,少侠你已经破产,无资格进行游戏
import random
start_energy = 10000
while start_energy > 0:
    test_energy = int(input("少侠请下注:"))
    if test_energy > start_energy:
        print("超出了你的身家,请重新投注。")
        # continue
    else:  # 上一行的continue和此行的else只需要一个,最好用continue
        number1 = random.randint(1, 6)
        number2 = random.randint(1, 6)
        print("你摇出了%d点,庄家摇出了%d点" % (number1,number2))
        if number1 > number2:
            start_energy += test_energy
            print("恭喜啦,你赢了,继续赌下去早晚会输光的,身家还剩%d" % start_energy)
        elif number1 < number2:
            start_energy -= test_energy
            print("少侠,你输了,身家还剩 %d" %start_energy)
        else:
            print("打平了,少侠,再来一局?")
    if start_energy == 0:
        print("哈哈哈,少侠你已经破产,无资格进行游戏")

homework2

"""
5. (选做)一个小球从100m高度落下,每次弹回原高度一半.
   计算:
    -- 总共弹起多少次?(最小弹起高度0.01m)
    -- 全过程总共移动多少米?
   提示:
       数据/算法
"""
# height = 100
# count = 0
# distance_sum = 0
# while height > 0.01:  错误
# while height/2 > 0.01: # 这里的0.01是弹起的高度,所以这里判断也应该使用弹起的方式
#     distance_sum += height + height/2
#     print(height + height/2)
#     height /= 2
#     count +=1
# print(distance_sum)
# print(count)

# 优化
height = 100
count = 0
distance_sum = height
while height/2 > 0.01: # 这里的0.01是弹起的高度,所以这里判断也应该使用弹起的方式
    distance_sum += height/2 *2 # 累加起/落距离
    height /= 2
    count += 1
print(f"全过程总共移动{distance_sum:.2f}米")
print(f"弹跳次数为:{count}")

你可能感兴趣的:(学习)