python 基础第六篇
回顾上周所有内容
python基础
- Python是一门解释型. 弱类型语言
- print("内容", "内容", end="\n") 打印语句
- 变量: 程序运行过程中产生的中间值. 存储在内存中.供后面的程序调用
- 变量的数据类型:
int, 整数
str, 字符串
bool, True,False
5. 命名规则:
- 由数字,字母,下划线组成
- 不能是纯数字或者数字开头
- 不能是关键字
- 不能太长
- 要有意义
- 不要用中文
- 区分大小写
- 推荐使用驼峰和下划线命名
- input() 用户输入
- if 判断
if 条件:
代码块
else:
代码块
if 条件:
代码块
elif 条件2:
代码块
..
else:
二. while循环
while 条件:
循环体
else:
代码块
流程:
判断条件是否为真. 如果真.执行循环体. 再次判断条件是否真. ....直到条件为假. 执行else. 退出循环
break 直接打断循环.
continue 停止当前本次循环. 继续执行下一次循环
格式化输出:
%s 字符串
%d 数字
运算符:
逻辑运算
1. and. 两端同时为真. 结果才是真.
2. or 或者. 两端有一个是真. 结果就是真
3. not 取反.
() => not => and => or
x or y
如果x非零, x, 否则 y
编码:
- ASCII. 8bit, 1byte
- GBK, 16bit, 2byte
- unicode, 32bit,4byte
- UTF-8, 英文:8bit, 1byte, 欧洲: 16bit, 2byte, 中文: 24bit, 3byte
3. 基本数据类型
- int 数字. bit_length() 二进制长度
- bool 空:False, 非空:True
- str, 字符串不可变
索引切片: 由0开始
[起始位置: 结束位置: 步长]
操作:
- upper() 变成大写
- strip() 去掉空格(两端)
- replace() 替换
- split() 切割
- startswith() 以xxx开头(判断)
- find() 找xxx字符串在原字符串中出现的索引位置. 找不到返回-1
- count() 数数
- format() 格式化输出
- len() 求长度
4. 列表:
由[]表示
有索引和切片
常用操作:
增加:append(), insert(), extend()
删除:pop() remove() del, clear()
修改:索引切片修改
查询:
for 变量 in 可迭代对象:
循环体
else:
操作:
sort(reverse=True) 排序
reverse() 翻转
len() 长度
count() 数数
元组:
tuple, 只读列表, 由()组成. 不可变的
索引和切片. for循环
解构, 解包
a, b = 1, 2
range(10) 0-9
range(5, 10) 5-9
range(5,10,3) 5,8
5. dict 字典
由{}表示. 存储key:value 键值对. 根据key来计算hash值.找到对应的内存地址.
key必须是可hash的. 不可变的. int, str, 元组, bool
操作:
增加:
dict[key] = value
setdefault(key, value)
删除: pop(key), del , popitems(), clear()
修改: dict[key] = value
查询:
dict[key], get(key, 默认值),
setdefault() 先执行新增那个流程. 然后.获取到key对应的值
常规操作:
keys() 获取所有的key.返回的像个列表
values() 获取所有value
items() 获取所有的key,value.装成元组. 返回列表[(key,value), (key,value)]
通过items()获取的是k,v
for k,v in dict.items():
直接循环遍历. 拿到的是key
for k in dict:
二. 今日主要内容
1. is 和 == 区别
id()函数
== 判断两边的值
is 判断内存地址
回顾编码:
1. ASCII: 英文, 特殊字符, 数字, 8bit, 1byte
2. GBK: 中文 16bit, 2byte. 兼容ASCII
3. unicode: 万国码, 32bit 4byte. 兼容ASCII
4. UTF-8: 长度可变的unicode. 英文:8bit, 欧洲:16bit, 中文:24bit 3byte
python2 只能用ASCII
python3 有unicode, 默认的编码就是unicode
内存里用的是unicode. 硬盘和网络传输用的是utf-8或者GBK
2. encode() 编码. 获取到的是编码之后的结果. bytes
3. decode() 解码. 把bytes编程我们熟悉的字符串
万恶之源-再谈编码
1. is和==的区别
1. id()
通过id()我们可以查看到一个变量表示的值在内存中的地址
s = "alex 是 大 xx"
abc = id(s) # 得到内存地址
print(abc)
lst = ["大阳哥", "佳琪哥", "小花生", "燃哥"]
print(id(lst)) # 就是一个内存地址. 毫无意义
lst = ["周杰伦", "燃哥"]
lst1 = ["周杰伦", "燃哥"]
print(id(lst))
print(id(lst1))
s = "燃哥"
s1 = "燃哥"
# 小数据池. 会对字符串进行缓存, 为了节省内存
print(id(s))
print(id(s1))
tu = ("燃哥", "周杰伦")
tu1 = ("燃哥", "周杰伦")
print(id(tu), id(tu1))
dic = {"a": "b", "c":"d"}
dic1 = {"a": "b", "c":"d"}
print(id(dic), id(dic1))
a = 10
b = 10
print(id(a), id(b))
布尔也有,
a = True
b = True
print(id(a), id(b))
-5
a = 257
b = 257
print(id(a), id(b))
a = "小威"
b = "小威"
print(id(a), id(b))
1. id() 查看内存地址
2. str 有小数据池的
== is id
== 判断. 左右两端是否相等和一致, 比较的是内容
is 判断. 判断的是内存地址 id()的值来判断 内存地址
lst = ["马化腾", "小威"]
lst2 = ["马化腾", "小威"]
print(lst == lst2) # True
print(lst is lst2) # False
s = "alex"
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
print("1111111111")
s2 = "alex"
print(s == s2) # True
print(s is s2) # True. 小数据池
s1 = "@akljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdklakljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdkl"
s2 = "@akljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdklakljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdkl"
print(id(s1), id(s2))
s = "abc中def"
print(s.title())
小数据池(常量池): 把我们使用过的值存储在小数据池中.供其他的变量使用.
小数据池给数字和字符串使用, 其他数据类型不存在.
对于数字: -5~256是会被加到小数据池中的. 每次使用都是同一个对象.
对于字符串:
- 如果是纯文字信息和下划线. 那么这个对象会被添加到小数据池
- 如果是带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的
- 如果是单个字符*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加到小数据池中
注意(一般情况下): 在py文件中. 如果你只是单纯的定义一个字符串. 那么一般情况下都是会
被添加到小数据池中的. 我们可以这样认为: 在使用字符串的时候, python会帮我们把字符串
进行缓存, 在下次使用的时候直接指向这个字符串即可. 可以节省很多内存.
这个问题千万不要纠结. 因为官方没有给出一个完美的结论和定论.所以只能是自己摸索.
以下内容摘自官网中关于id()的描述
Return the “identity” of an object. This is an integer which is
guaranteed to be unique and constant for this object during its
lifetime. Two objects with non-overlapping lifetimes may have the
same id() value.
CPython implementation detail: CPython implementation detail: This is the address of the object in
memory.
说了这么多. 这个id()和is有什么关系呢. 注意. is比较的就是id()计算出来的结果. 由于id是帮我
们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址.
最终我们通过is可以查看两个变量使用的是否是同一个对象.
== 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.不是内存地址
总结:
is 比较的是地址
== 比较的是值
二. 编码的补充
1. python2中默认使用的是ASCII码. 所以不支持中文. 如果需要在Python2中更改编码.
需要在文件的开始编写:
2. python3中: 内存中使用的是unicode码.
编码回顾:
1. ASCII : 最早的编码. 只有英文大写字母, 小写字母, 数字, 某些特殊字符. 没有中文,
8个01代码, 8个bit, 1个byte
2. GBK: 中文国标码, 其中包含了ASCII编码和中文常用编码. 16个bit, 2个byte
3. UNICODE: 万国码, 其中包含了全世界所有国家⽂字的编码. 32个bit, 4个byte, 包含了
ASCII
4. UTF-8: 可变长度的万国码. 是unicode的一种实现. 最短字符占8位
1.英文: 8bit 1byte
2.欧洲文字:16bit 2byte
3.中文:24bit 3byte
综上, 除了ASCII码以外, 其他信息不能直接转换.
在python3的内存中. 在程序运行阶段. 使用的是unicode编码. 因为unicode是万国码. 什么内
容都可以进行显示. 那么在数据传输和存储的时候由于unicode比较浪费空间和资源. 需要把
unicode转存成UTF-8或者GBK进行存储. 怎么转换呢. 在python中可以把文字信息进行编码.
编码之后的内容就可以进行传输了. 编码之后的数据是bytes类型的数据.其实啊. 还是原来的
数据只是经过编码之后表现形式发生了改变而已.
bytes的表现形式:
1. 英文 b'alex' 英文的表现形式和字符串没什么两样
2. 中文 b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式
字符串在传输时转化成bytes=> encode(字符集)来完成
s = "alex马"
想要存储.必须进行编码
encode() 编码之后的内容是bytes类型的数据
30个字节 10个字. 每个字3个字节
b'\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a\xe7\x9a\x84\xe5\x84\xbf\xe5\xad\x90\xe8\xa2\xab\xe7\xbb\x91\xe6\x9e\xb6\xe4\xba\x86'
bs = s.encode("UTF-8") # 把字符串编码成UTF-8的形式
print(bs)
#英文:编码之后的结果是英文本身
#中文:编码之后UTF-8 下. 一个中文3个字节
记住: 英文编码之后的结果和源字符串一致. 中文编码之后的结果根据编码的不同. 编码结果
也不同. 我们能看到. 一个中文的UTF-8编码是3个字节. 一个GBK的中国编码是2个字节.
编码之后的类型就是bytes类型. 在网络传输和存储的时候我们python是保存和存储的bytes
类型. 那么在对应接收的时候. 也是接收的bytes类型的数据. 我们可以使用decode()来进行解
码操作. 把bytes类型的数据还原回我们熟悉的字符串:
s = "饿了么"
bs = s.encode("GBK") # b'\xb6\xf6\xc1\xcb\xc3\xb4' GBK 一个中文:2个字节
print(bs)
s = "中"
print(s.encode("utf-8"))
print(s.encode("GBK"))
decode()解码
编码和解码的时候都需要制定编码格式.
bs = b'\xb6\xf6\xc1\xcb\xc3\xb4' # 从别人那里读到的 GBK
# # 编程人认识的东西
s = bs.decode("GBK") # 解码之后是字符串, 用什么编码就用什么解码
# print(s)
# GBK => utf-8
bs = b'\xb6\xf6\xc1\xcb\xc3\xb4'
# 先解码成unicode字符串
s = bs.decode("GBK")
# 在把字符串编码成UTF-8
bss = s.encode("UTF-8")
print(bss)
作业:
一,老男孩好声音选秀比赛评委在打分的时候呢, 可以进行输入. 假设, 老男孩有10个评委.
让10个评委进行打分, 要求, 分数必须大于5分, 小于10分.
count = 1
while count <= 10:
print("%s号评委" % (count))
s = int(input("开始打分(分数必须大于5分, 小于10分):"))
if s <= 5 or s >= 10:
print("不符合评分要求,请重新打分:")
continue
count += 1
二. 电影投票. 程序先给出一个目前正在上映的电影列表. 由用户给每一个电影投票.
最终 将该用户投票信息公布出来 lst = ['金某梅', '解救吾先生', '美国往事', '西西里的美丽传说']
结果: {'金某梅': 99, '解救吴先生': 80, '美国往事': 6, '西西里的美丽传说': 23}
lst = ['金某梅', '解救吾先生', '美国往事', '西西里的美丽传说']
dic = {}
a = 0
for i in lst:
print(lst[a])
s = int(input("请为该电影打分:"))
dic[lst[a]] = s
a += 1
print(dic)
三.念数字. 给出一个字典. 在字典中标识出每个数字的发音. 包括相关符号. 然后由
用户输入一个数字. 让程序读出相对应的发音(不需要语音输出. 单纯的打印即可)
dic = {
"-":"fu",
"0":"ling",
"1":"yi",
"2":"er",
"3":"san",
"4":"si",
"5":"wu",
"6":"liu",
"7":"qi",
"8":"ba",
"9":"jiu",
".":"dian"
}
a = 0
s = input("请输入一个数字:")
for i in s:
if i in dic.keys():
print(dic[i],end = " ")
四.车牌区域划分, 现给出以下车牌. 根据车牌的信息, 分析出各省的车牌持有量. (升级题)
car = ['鲁A32444','鲁B12333','京B8989M','黑C40678','黑C46555','沪B25041']
locals = {'沪':"上海",'黑':'黑龙江','鲁':'山东','鄂':'湖北','湘':'湖南','京':'北京'}
dic = {}
li = []
for i in range(len(car)):
for a in locals:
if car[i][0] in a:
li.append(locals[a])
for b in li:
dic[b] = li.count(b)
print(dic)
五.干掉主播. 现有如下主播收益信息, 按照要求, 完成相应操作:
1.计算各位主播收益的平均值.
zhubo = {'卢本伟':122000,'冯提莫':189999,'金老板':99999,'吴老板':25000000,'alex':126}
sum = 0
for i in zhubo.values():
sum = sum + i
a = sum / len(zhubo)
print("这些主播的平均收入是:%s" % (a))
2.干掉收益小于平均值的主播.
for i in list(zhubo):
if zhubo[i] < a:
del zhubo[i]
print(zhubo)
3.干掉卢本伟.
del zhubo["卢本伟"]
print(zhubo)