9.python高阶内容(上)_基础
2022.12.27 python高阶内容(上)_基础
9.1 字符串的高阶玩法
9.1.1 %百分号模式
%d
:整数%i
:整数%s
:字符%f
:小数
【方式1】:前面用格式占位,后面用具体的内容
name = "莫烦Python"
age = 18
gender = "男"
print("我的名字是 %s !我 %d 岁了,我是 %s 的~" % (name, age, gender))
我的名字是 莫烦Python !我 18 岁了,我是 男 的~
【方式2】:用字典形式,就不用一一对应了
第一种是需要一一对应的,但变量多了,有时顺序会弄错。
name = "莫烦Python"
age = 18
gender = "男"
print("我的名字是 %(nm)s !我 %(age)d 岁了,我是 %(gd)s 的~" % {"nm": name, "age":age, "gd":gender})
我的名字是 莫烦Python !我 18 岁了,我是 男 的~
【小数练习】:%.几
就是几位小数;%几d
就是一共占几位,没有前面空格补齐
print("%f" % (10/3))# 后面不限制
print("%.2f" % (10/3))# 后面限制 2 个位置
3.333333
3.33
print("%4d" % (1/3)) # 前面补全最大 4 个位置
print("%5d" % 12) # 前面补全最大 5 个位置
0
12
9.1.2 format
format
是%
之后发明的 用法一样,解决的不知道具体类型是什么也想用此方式,只需要占位{}
就行
【只用{}
占位】
name = "莫烦Python"
age = 18
height = 1.8
print("我的名字是 %s !我 %d 岁了,我 %f 米高~" % (name, age, height))
print("我的名字是 {} !我 {} 岁了,我 {} 米高~".format(name, age, height))
我的名字是 莫烦Python !我 18 岁了,我 1.800000 米高~
我的名字是 莫烦Python !我 18 岁了,我 1.8 米高~
【用{序号}】:解决的是有些内容想用多次,这时候必须都用序号,少任一个都报错
name = "莫烦Python"
age = 18
height = 1.8
#0号信息用了2次
print("我的名字是 {0} !我 {1} 岁了,我 {2} 米高~我是{0}".format(name, age, height))
我的名字是 莫烦Python !我 18 岁了,我 1.8 米高~我是莫烦Python
【用某个信息用多次的另一种方法】:命名
name = "莫烦Python"
age = 18
height = 1.8
print("我的名字是 {nm} !我 {age} 岁了,我 {ht} 米高~我是{nm}".format(nm=name, age=age, ht=height))
我的名字是 莫烦Python !我 18 岁了,我 1.8 米高~我是莫烦Python
【小数问题】
print("我 {:.3f} 米高".format(1.12345))
print("我 {ht:.1f} 米高".format(ht=1.12345))
print("我 {:3d} 米高".format(1))
print("我 {:3d} 米高".format(21))
我 1.123 米高
我 1.1 米高
我 1 米高
我 21 米高
txt = "You scored {:%}"
print(txt.format(2.1234))
txt = "You scored {:.2%}"
print(txt.format(2.1234))
You scored 212.340000%
You scored 212.34%
9.1.3 f格式化字符串
比format更简单,在字符串前加f,那么{x}就是占位信息
name = "莫烦Python"
age = 18
height = 1.8
print(f"我的名字是 {name} !我 {age} 岁了,我 {height} 米高~")
我的名字是 莫烦Python !我 18 岁了,我 1.8 米高~
score = 2.1234
print(f"You scored {score:.2%}")
print(f"You scored {score:.3f}")
print(f"You scored {12:5d}")
You scored 212.34%
You scored 2.123
You scored 12
9.1.4 修改字符串
内容很简单,我举一个例子
"帮我替换掉莫烦".replace("莫烦", "沫凡")
'帮我替换掉沫凡'
" 我不想要前后的空白,但是 中间\n的可以有\n ".strip()
'我不想要前后的空白,但是 中间\n的可以有'
print("你|帮|我|拆分|一下|这句话".split("|"))
print("|".join(["你","帮", "我", "重组", "一下", "这句话"]))
['你', '帮', '我', '拆分', '一下', '这句话']
你|帮|我|重组|一下|这句话
9.2 Python的偷懒用法
9.2.1 Lambda: 更直接的 Function(函数)
add = lambda a, b: a+b
print(add(1,2))
3
lambda
函数:冒号:
前面是未知数,后面是函数主体,那么引用它就是实数要和未知数一一对应
9.2.2 for的复杂用法
举几个列子
l = [i*2 for i in range(10)]
print(l)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
d = {"index"+str(i): i*2 for i in range(10)}
print(d)
{'index0': 0, 'index1': 2, 'index2': 4, 'index3': 6, 'index4': 8, 'index5': 10, 'index6': 12, 'index7': 14, 'index8': 16, 'index9': 18}
9.2.3 一些能少行的操作
done = False
a = 1 if done else 2
print(a)
2
如果判断对了,输出前面的 错了 就输出后面的
9.2.4 一行for+判断
l = [i*2 for i in range(10) if i%2==0]
print(l)
[0, 4, 8, 12, 16]
d = {"index"+str(i): i*2 for i in range(10) if i % 2 == 0}
print(d)
{'index0': 0, 'index2': 4, 'index4': 8, 'index6': 12, 'index8': 16}
9.2.5 enumerate
enumerate
,列举序数和内容的
l = [11,22,33,44]
for count, data in enumerate(l):
if count == 2:
data += 11
l[count] = data
print(l)
[11, 22, 44, 44]
count
拿到了序数,data
拿到了内容
【自定义enumerate
中的序数】
l = [11,22,33,44]
d = {}
for count, data in enumerate(l, start=5):
d[count] = data
print(d)
{5: 11, 6: 22, 7: 33, 8: 44}
9.2.6 Zip同时迭代
我要同时处理两个列表,一个是姓名一个是分数,并把它们做成一个字典,你会怎么做?
name = ["a", "b", "c"]
score = [1,2,3]
d = {}
for i in range(3):
d[name[i]] = score[i]
print(d)
{'a': 1, 'b': 2, 'c': 3}
种写法对于我来说,还是比较累赘的。怎么搞?直接上 zip
:
name = ["a", "b", "c"]
score = [1,2,3]
d = {}
for n, s in zip(name, score):
d[n]=s
print(d)
{'a': 1, 'b': 2, 'c': 3}
name = ["a", "b", "c"]
score = [1,2,3]
bonus = [1,0,1]
d = {}
for n, s, b in zip(name, score, bonus):
d[n]=s+b
print(d)
{'a': 2, 'b': 2, 'c': 4}
9.2.7 reverse & reversed
翻转列表
【方法1】
l = [1,2,3]
_l = []
for i in range(len(l)):
_l.append(l[-i-1])
print(_l)
[3, 2, 1]
【方法2】
l = [1,2,3]
_l = [l[-i-1] for i in range(len(l))]
print(_l)
[3, 2, 1]
【方法3】:revers
自己翻转
l = [1,2,3]
l.reverse()
print(l)
[3, 2, 1]
【方法4】:reversd用在 for 循环里的翻转迭代器
l = [1,2,3]
for i in reversed(l):
print(i)
3
2
1
【方法5】深拷贝
l = [1,2,3]
_l = l[::-1]
print(l)
print(_l)
[1, 2, 3]
[3, 2, 1]
l[2]=4
print(l)
print(_l)
[1, 2, 4]
[3, 2, 1]
9.3 复制的"玄学":深拷贝和浅拷贝
有两种拷贝,浅拷贝就相当于起个别名,改一个另一个也改;深拷贝相当于完全另一个个体,改一个另一个不受影响
9.3.2 切片为深拷贝
可看9.2.7
方法5
9.3.2 copy
【一般情况是深拷贝】
l = [1,2,3]
_l = l.copy()
_l[0] = -1
print(_l)
print(l)
[-1, 2, 3]
[1, 2, 3]
【特殊是浅拷贝】:Python 他在创造之初,就有这么个约定,列表中直接存放的数值,字符,和存 class 实例,列表,字典不同。 对数值字符的复制,直接是复制的值,而不是一个投影。
l = [[1],[2],3]
_l = l.copy()
_l[0][0] = -1
print(_l)
print(l)
[[-1], [2], 3]
[[-1], [2], 3]
【浅拷贝变深拷贝deepcopy
】
from copy import deepcopy
l = [[1],[2],3]
_l = deepcopy(l)
_l[0][0] = -1
print(_l)
print(l)
[[-1], [2], 3]
[[1], [2], 3]
浅复制的优势就是快。复制是需要内存和时间的,浅拷贝没有真正复制