目录
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)建议使用双引号
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
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'
序列:由一系列字符组成的不可变序列容器,存储的是字符的编码值
字节:计算机存储的最小单位,等于8位bit,最大为十进制255。
字符:单个的数字,文字,符号
字符集:存储字符与二进制序列的对应关系(编码与解码,ASCII编码)
ASCII编码:有100多字符,8个比特位最多可以表示255个字符,所以每个字符1个字节。
GBK编码:21003个中文,需要15个比特位全部表示,由于计算机中存储是以8个比特位为间隔,所以需要1个中文需要2个字节
一般情况下使用UTF-8编码。
+ 拼接
* 重复
> < >= <= == 比较运算,比较编码值,依次比较两个容器中元素,一旦不同则返回比较结果
print("悟空"+"猴子") print("悟空" * 3) print("悟空" > "八戒") print("12w" == "16w") # 单位一致,进行比较 print('12W' == "1200000") # 单位不一致,结果错误
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)+"$")
索引
定位单个元素,编号为0到len()-1
容器[整数]
正向索引
反向索引 len()-1等价于-1
0 等价于 -len()
切片,越界不报错
定位多个元素
容器名[开始:结束:[间隔]],不包括结尾,间隔默认为1,可省略
容器名[开始:结束]
容器名[:结束],开始可以不写,默认为1,但冒号不能省略
容器名[:],开始和结束都可以不写,结束默认为尾,默认包括所有元素
容器名[-3:],倒数3个字符
定义:使用一个变量,管理多个数据,擅长于处理单一维度数据
# 列表名 = [数据1,数据2] list_name = ["王丽","王红","丽红"] # 列表名= list(容器) list_lq = list("王丽") # 相当于类型转换
## 添加 # 追加,只能放在末尾:列表名.append(数据) list_name.append("李红") # 插入:列表名.insert(位置,数据),前面的数据往后移动
list_name = ["王丽","王红","丽红"] # 读取单个元素 print(list_name[0]) # 修改单个元素 list_name[0] = "王丽丽" # 读取多个元素 # 通过切片读取的原理会创建新容器 print(list_name[-2:]) # 修改多个元素 # 通过切片修改的原理会将右侧容器元素依次存入左侧 list_name[-2:] = ["ww","ll"] print(list_name)
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("丽丽")
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)
list_name = ["李琦","周义杰","毛绍祺"] # 列表一份 data01 = list_name data02 = list_name[0] # 切片会重新创建,列表二份 data03 = list_name[-2:] # 因为是两个列表,所以互不影响 data03[0] = "义杰" # 因为一份,所以互相影响 data01[0] = "琪琪" print(list_name)
画图举例1:
画图举例2:
自己画图:
深浅拷贝 拷贝:复制/备份的过程,防止数据意外破坏 浅拷贝:复制第一层数据,共享深层数据 优点:占用内存较小 缺点:当深层数据被修改时,互相影响 适用性:优先 深拷贝:复制所有层数据 优点:绝对互不影响 缺点:占用内存较大 适用性:深层数据会被修改
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)
此处: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) # ?
# 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("哈哈哈,少侠你已经破产,无资格进行游戏")
"""
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}")