-
int ==> 整数. 主要⽤用来进⾏行行数学运算
-
str ==> 字符串串, 可以保存少量量数据并进⾏行行相应的操作
-
bool==>判断真假, True, False
-
list==> 存储⼤大量量数据.⽤用[ ]表⽰示
-
tuple=> 元组, 不可以发⽣生改变 ⽤用( )表⽰示
-
dict==>字典,保存键值对,⼀一样可以保存⼤大量量数据
- set==> 集合, 保存⼤大量量数据. 不可以重复. 其实就是不保存value的dict
三. 布尔值(bool)
取值只有True, False. bool值没有操作.
转换问题: str => int int => str
int => bool bool=>int
str => bool bool => str
int(str) str(int)
bool(int). 0是False 非0是True int(bool) True是1, False是0
bool(str) 空字符串串是False, 不空是True str(bool) 把bool值转换成相应的"值"
四. 字符串串(str)
把字符连成串串. 在python中⽤用', ", ''', """引起来的内容被称为字符串串.
4.1 切片和索引
1. 索引.索引就是下标.切记,下标从0开始
s1 = "python最⽜牛B"
print(s1[0])
print(s1[1])
print(s1[-1])
print(s1[-2])
2. 切片,我们可以使⽤用下标来截取部分字符串串的内容 语法: str[start: end]
规则: 顾头不顾腚, 从start开始截取. 截取到end位置. 但不包括end
print(s2[0:3]) 从0到3不包括3
print(s2[4:])如果想直接最后直接最后
print(s2[-1:-5])从负一到负五 默认都是往从左往右所以怎么也不能这么数 一会可以有什么步数什么的
print(s2[1:5:2]) 从1到5隔两个一取,3就是3个一取,负2就反着走从右往左走也隔两个一取,正负决定取向方向,数决定几个一取
4.2 字符串串的相关操作⽅方法 字符串特别牛逼,永不可变,任何对字符串的操作都没卵用,都要再打一个字符串
s1=“我才是真正的彭于晏”
s1.capitalize () 这样的话什么卵用没有, capitalize 这是大小写转换 这老师不靠谱是真不行啊,妈的实践验证,这是首字母小写变成大写 大写不变,后面的所有大写变小写 小写不变 这个猜测是针对人名的吧
ret=s1.lower()我仅有的一点英语知识,所有字母小写
ret=s1.upper()所有字幕大写
ret=s1.sawpcase()这个是真正的大小写转换
ret = s1.casefold() 这个和lower 是一样的 就是这个牛逼一点说是什么东欧字母都支持 但是是不长用的
s3 = "alex eggon,taibai*yinwang_麻花藤
ret=s3。title()
Alex Eggon,Taibai*Yinwang_麻花藤 所有被特殊字符隔开的首字母都大写
s4 = "alex⽼老老男孩wusir " # Alex⽼老老男孩Wusir
print(s4.title()) 这个中文也算特殊字符
2 切来切去
s5 = "周杰伦"
ret = s5.center(10, "*") 拉长10个字符吧原字符改到里面 算原字符10个字符
print(ret)
改变tab字符长度那个不管了
s7 = " alex wusi r”
ret = s7.strip( ) 这个是去掉左右两端的括号
print(ret)
lstrip 左边的空格 rstrip 右边的空格
s7 = "abcdefgabc"
print(s7.strip("abc")) 没有内容默认去空格 有内容去内容
s8 = "sylar_alex_taibai_wusir_eggon"
ret = s8.replace('alex', '⾦金金⻆角⼤大王') 这个是替换 一定要记得元字符串不可改
ret = s8.replace('i', 'SB', 2 ) 老套路 步长把i换成sb换2次
s9 = "alex,wusir,sylar,taibai,eggon"
lst = s9.split(",") 字符串切割根据,切,括号里是啥根据啥切 print(lst)
s12 = "我叫%s, 今年年%d岁了了, 我喜欢%s" % ('sylar', 18, '周杰伦') # 之前的写法print(s12)
s12 = "我叫{}, 今年年{}岁了了, 我喜欢{}".format("周杰伦", 28, "周润发") # 按位置格式化print(s12)
s12 = "我叫{0}, 今年年{2}岁了了, 我喜欢{1}".format("周杰伦", "周润发", 28) # 指定位置print(s12)
s12 = "我叫{name}, 今年年{age}岁了了, 我喜欢{singer}".format(name="周杰伦", singer="周润 发", age=28)
s13 = "我叫sylar, 我喜欢python, java, c等编程语⾔言."
ret1 = s13.startswith("sylar")
print(ret1) 这是判断是不是括号内的开头 endwith 是否以括号内结尾
ret7 = s13.count("a") print(ret7) count 是查找括号里的 出现的 次数
ret5 = s13.find("sylar") print(ret5) find 是查找括号里的东西所在位置
ret6 = s13.find("tory") print(ret6) find 查找 找不到返回-1
ret7 = s13.find("a", 8, 22) # 切⽚片找
print(ret7) 查找8到22 查找a在哪
ret8 = s13.index("sylar") # 求索引位置. 注意. 如果找不不到索引. 程序会报错
print(ret8) 解释的很明白了,索引是0开始的 和后面的len不一样
s14 = "123.16"
s15 = "abc"
s16 = "_abc!@"
print(s14.isalnum())
print(s15.isalnum())
print(s16.isalnum()) 是否由字母和数字组成的
print(s14.isalpha())
print(s15.isalpha())
print(s16.isalpha()) 是否由字母组成
print(s14.isdigit())
print(s14.isdecimal())
print(s14.isnumeric()) # 这个⽐比较⽜牛B. 中⽂文都识别.print(s15.isdigit())
print(s16.isdigit()) 是否由数字组成,不包括小数点
6. 计算字符串串的⻓长度
s18 = "我是你的眼, 我也是a"
ret = len(s18) # 计算字符串串的⻓长度print(ret)
注意: len()是python的内置函数. 所以访问⽅方式也不⼀一样. 你就记着len()和print()⼀一样就⾏行行 了了
这尼玛哪一样了? 也不也是print打印出来吗? 就记得len是求长度就完了 也好使,而且不是从0开始数的
7. 迭代
我们可以使⽤用for循环来便便利利(获取)字符串串中的每⼀一个字符 语法:
for 变量量 in 可迭代对象:
pass
可迭代对象: 可以一个⼀个往外取值的对象 就是固定公式你肿么破,至于这个可迭代对象,我还搞不清楚 现在学的 字符串 数字元组啊,什么的都是 可迭代吧。
in有两种⽤用法:
1. 在for中. 是把每⼀一个元素获取到赋值给前⾯面的变量量. 2. 不不在for中. 判断xxx是否出现在str中.
# 练习, 计算在字符串串"I am sylar, I'm 14 years old, I have 2 dogs!"s20 = "I am sylar, I'm 14 years old, I have 2 dogs!"
count = 0
for c in s20:
if c.isdigit(): count = count + 1
print(count) 第17个是数字,一直打0到第17开始是1一直都是1 就是查找数字在s20里出现的次数
这样的话第三天的完了,let's,go
第四天的也没什么特难的,都是英语难
⼀一. 列列表
1.1 列列表的介绍
列列表是python的基础数据类型之⼀一 ,其他编程语⾔言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素⽤用' , '隔开⽽而且可以存放各种数据类型:
lst = [1, '哈哈', "吼吼", [1,8,0,"百度"], ("我","叫", "元", "组"), "abc", {"我 叫":"dict字典"},{"我叫集合","集合"}]
列列表相比于字符串串. 不仅可以存放不同的数据类型. ⽽而且可以存放⼤大量量的数据. 32位python可以存放: 536870912个元素, 64位可以存放: 1152921504606846975个元素.⽽而且列列 表是有序的(按照你保存的顺序),有索引, 可以切⽚片⽅方便便取值.
2.2 列列表的索引和切片 列列表和字符串串⼀一样也拥有索引:
lst = ["麻花藤", "王剑林林", "⻢马芸", "周鸿医", "向华强"]
print(lst[0]) # 获取第⼀一个元素
print(lst[1])
print(lst[2])
lst[3] = "流动强" # 注意. 列列表是可以发⽣生改变的. 这⾥里里和字符串串不不⼀一样
print(lst) # ['麻花藤', '王剑林林', '⻢马芸', '流动强', '向华强'] 这个修改比较简单
s0 = "向华强"
s0[1] = "美" # TypeError: 'str' object does not support item assignment 不不 允许改变
print(s0) 这边的话是个坑,这个的话 s0是字符串,字符串不可改
lst = ["麻花藤", "王剑林林", "⻢马芸", "周鸿医", "向华强"]
print(lst[0:3]) # ['麻花藤', '王剑林林', '⻢马芸']
print(lst[:3]) # ['麻花藤', '王剑林林', '⻢马芸']
print(lst[1::2]) print(lst[2::-1])
print(lst[-1:-3:-2])
# ['王剑林林', '周鸿医'] 也有步⻓长
# ['⻢马芸', '王剑林林', '麻花藤'] 也可以倒着取
# 倒着带步⻓长 这个和昨天的序列一样,简单 序列加步长
⼆二. 列列表的增删改查
1. 增, 注意, list和str是不⼀一样的. lst可以发⽣生改变. 所以直接就在原来的对象上进⾏行行了了操作
lst = ["麻花藤", "林林俊杰", "周润发", "周芷若"]print(lst)
lst.append("wusir")
print(lst) append在这组序列的最后面加一个
lst = ["麻花藤", "张德忠", "孔德福"]
lst.insert(1, "刘德华") # 在1的位置插⼊入刘德华. 原来的元素向后移动⼀位 可选序列 和上边的比应该是一个可以选序列一个不可选,
print(lst)
lst = ["王志⽂文", "张⼀一⼭山", "苦海海⽆无涯"]
lst.extend(["麻花藤", "麻花不不疼"])
print(lst) 迭代添加就是智能添,把里面的元素一个个添加,而append就是无脑在后面加一个
2. 删除
pop, remove, clear, del 只有这几种 后文一点一点讲解用法
lst = ["麻花藤", "王剑林林", "李李嘉诚", "王富贵"]
print(lst)
deleted = lst.pop() # 删除最后⼀一个 不选数默认最后一个
print("被删除的", deleted) 这个pop括号里选的啥(序列)就删除哪个元素,
print(lst)
el = lst.pop(2) # 删除2号元素
print(el)
print(lst)
lst.remove("麻花藤") # 删除指定元素 只能指定元素不能写序列
lst.remove("哈哈") # 删除不不存在的元素会报错
print(lst)
del lst[1:3] del lst【1】 只删除一个也行
print(lst) 删除序列1到2 3 顾头不顾尾
3. 修改 索引切片修改
lst = ["太⽩白", "太⿊黑", "五⾊色", "银王", "⽇日天"]
lst[1] = "太污" # 把1号元素修改成太污
print(lst)
lst[1:4:2] = ["麻花藤", "哇靠"] # 切片修改也OK. 如果步⻓不是1, 要注意. 元素的个 数 这个也和之前的一样
rint(lst)
lst[1:4] = ["李李嘉诚个⻳龟⼉儿⼦子"] # 如果切⽚没有步长或者步长是1. 则不⽤关心个数 就是吧1到3所有的都换一遍
print(lst)
4. 查询,列列表是⼀一个可迭代对象,所以可以进⾏行行for循环
只有这一种查询方式
for el in lst: print(el) 只有这一种查询方式 使用方法 把想查询的东西 在下面再写一行
for el in lst:
if el== “想查询的”
然后这行再写打印它啊 加减啊 首字母大小写啊 判断是不是什么开头啊 这一般不用了 你都知道你要输入的,也可能用户输入的
5. 其他操作
lst = ["太⽩白", "太⿊黑", "五⾊色", "银王", "⽇日天", "太⽩白"]
c = lst.count("太⽩白") # 查询太⽩白出现的次数 这个查询也没什么改变
print(c)
lst = [1, 11, 22, 2]
lst.sort() # 排序. 默认升序
print(lst)
lst.sort(reverse=True) # 降序
print(lst) 升序降序都要打的reverse 默认是f的 你要想倒序就要改成t
lst = ["太⽩白", "太⿊黑", "五⾊色", "银王", "⽇日天", "太⽩白"]
print(lst)
lst.reverse() 180 度 倒序
print(lst)
l = len(lst) # 列列表的⻓长度print(l) 这个排序永远没有0的 就是1正常不反人类数的
三. 列列表的嵌套 采⽤用降维操作.
⼀一层⼀一层的看就好.
lst = [1, "太⽩白", "wusir", ["⻢马⻁虎疼", ["可⼝口可乐"], "王剑林林"]]# 找到wusir
print(lst[2])
# 找到太⽩白和wusir
print(lst[1:3])# 找到太⽩白的⽩白字
print(lst[1][1])
# 将wusir拿到. 然后⾸首字⺟母⼤大写. 再扔回去
s = lst[2]
s = s.capitalize() 这都没什么难的,就是把之前的记住这都好用
lst[2] = s
print(lst)
# 简写
lst[2] = lst[2].capitalize()print(lst) 序列可以直接更改 所以简单点
# 把太⽩白换成太⿊黑
lst[1] = lst[1].replace("⽩白", "⿊黑") 替换单词一样
print(lst)
# 把⻢马⻁虎疼换成⻢马化疼
lst[3][0] = lst[3][0].replace("⻁虎", "化") 当替换列表中的东西时这么用 多维吗 将为操作
print(lst[3][0])
lst[3][1].append("雪碧")print(lst) 这条有点多余了
四. 元组和元组嵌套
元组: 俗称不可变的列列表.⼜又被成为只读列列表, 元组也是python的基本数据类型之⼀一, ⽤用⼩小括
号括起来, ⾥里里⾯面可以放任何数据类型的数据, 查询可以. 循环也可以. 切片也可以. 但就是不能 改.
tu = (1, "太⽩白", "李李⽩白", "太⿊黑", "怎么⿊黑")
print(tu)
print(tu[0])
print(tu[2])
print(tu[2:5]) # 切⽚片之后还是元组
# for循环遍历元组
for el in tu:
print(el) 自从学了for循环用的太多了这个早记得了
# 尝试修改元组
# tu[1] = "⻢马⻁虎疼" # 报错 'tuple' object does not support item assignment
tu = (1, "哈哈", [], "呵呵")
# tu[2] = ["fdsaf"] # 这么改不不⾏行行
tu[2].append("麻花藤") # 可以改了了. 没报错
tu[2].append("王剑林林")
print(tu) 元素不可变这里指的是元组里的元素不可变,再里面的子元素可变 例如列表 子元素如果是元素还是不可变,再循环下去没试
元组中如果只有⼀一个元素. ⼀一定要添加⼀一个逗号, 否则就不是元组
print(type(tu))
元组也有count(), index(), len()等⽅方法. 可以⾃自⼰己测试使⽤用
五. range
range可以帮我们获取到⼀一组数据. 通过for循环能够获取到这些数据.
for num in range(10):
print(num)
for num in range(1, 10, 2):
print(num)
for num in range(10, 1, -2):
print(num)# 反着来, 和切⽚片⼀一样 这个range 和普通的for 变量 in 迭代对象,最大的区别就是 r一般对应数字假如1,2,3 打印出的是每一行一个数 1 2 3 而第二个for 是每一次都把123打出来了
⼀一. 字典的简单介绍
字典(dict)是python中唯⼀一的⼀一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是
唯⼀一的. 在保存的时候, 根据key来计算出⼀一个内存地址. 然后将key-value保存在这个地址中.这种算法被称为hash算法, 所以, 切记, 在dict中存储的key-value中的key'必须是可hash的,如果你搞不懂什什么是可哈希, 暂时可以这样记, 可以改变的都是不可哈希的,那么可哈希就意味着不可变. 这个是为了了能准确的计算内存地址⽽而规定的.
已知的可哈希(不可变)的数据类型: int, str, tuple, bool不可哈希(可变)的数据类型: list, dict, set
语法 :
{key1: value1, key2: value2....}
注意: key必须是不可变(可哈希)的. value没有要求.可以保存任意类型的数据
dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅 哥', '美⼥女女'], (1, 2, 3): '麻花藤'}
print(dic[123])
print(dic[True])
print(dic['id'])
print(dic['stu'])
print(dic[(1, 2, 3)])
# 不不合法
# dic = {[1, 2, 3]: '周杰伦'}
# dic = {{1: 2}: "哈哈哈"}
dic = {{1, 2, 3}: '呵呵呵'}
# list是可变的. 不不能作为key # dict是可变的. 不不能作为key # set是可变的, 不不能作为key
dict保存的数据不是按照我们添加进去的顺序保存的。是按照hash表的顺序保存的。而hash表不是连续的,所以不能进行切片工作,它只能通过key来获取dict中的数据
二. 字典的增删改查和其他相关操作
1. 增加
dic = {}
dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增⼀一个key-value的组 合进dict
dic['age'] = 18 强行添加没啥说的 刚才翻了一下上边那么多 没研究明白 记得之前也有强行添加类的啊
print(dic)
# 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值
dic.setdefault('李李嘉诚') # 也可以往⾥里里⾯面设置值. 后面没设置值显示值为None
dic.setdefault("李李嘉诚", "房地产") # 如果dict中已经存在了了. 那么setdefault将不不会 起作⽤用
print(dic)
2. 删除
ret = dic.pop("jay") pop和前文一样bj4 print(ret)
del dic["jay"] del同上 print(dic)
# 随机删除.
ret = dic.popitem() pycharm也不知道该说是修复了,还是说优化了,还是说bug 只删除最后一个了 不是随机删除了
# 清空字典中的所有内容dic.clear() 这个clear 这很干净
3. 修改
dic = {"id": 123, "name": 'sylar', "age": 18}
dic1 = {"id": 456, "name": "麻花藤", "ok": "wtf"}
dic.update(dic1) # 把dic1中的内容更更新到dic中. 如果key重名. 则修改替换. 如果不不存 在key, 则新增.
print(dic)
print(dic1) dic打印出来的是全的,dic1就是个弟弟 端茶倒水的
4. 查询 查询⼀一般⽤用key来查找具体的数据.
print(dic['name'])
# print(dic['sylar']) # 报错 如果有这个key直接打出来了 没有这个key就报错
prit(dic.get("ok"))
print(dic.get("sylar")) # None 这个最大的优点就是 如果没有这个不会报错会出None
print(dic.get("sylar", "⽜牛B")) # ⽜牛B 这个就是如果没有就输出自己打的value2值
5. 其他相关操作
dic = {"id": 123, "name": 'sylar', "age": 18, "ok": "科⽐比"}
print(dic.keys()) # dict_keys(['id', 'name', 'age', 'ok']) 不不⽤用管它是什什么.当 成list来⽤用就⾏行行
for key in dic.keys(): 就是list 了 无脑背吧
print(key)
print(dic.values()) # dict_values([123, 'sylar', 18, '科⽐比']) ⼀一样. 也当list来⽤用
for value in dic.values(): 同上
print(value)
print(dic.items()) # dict_items([('id', 123), ('name', 'sylar'), ('age', 18), ('ok', '科⽐比')]) 这个东⻄西也是list. 只不不过list中装的是tuple 把list里面全变成tuple了
for key, value in dic.items(): # ?? 这个是解构
print(key, value)
# 解构
a, b = 1, 2print(a, b)
(c, d) = 3, 4 print(c, d)
e, f = [1, 2, 3] print(e, f)
# 解构的时候注意数量量必须匹配
1. is 和 == 的区别
#小数据池
# 数字小数据池的范围 -5 ~ 256
# 字符串中如果有特殊字符他们的内存地址就不一样
# 字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致
# 黑框框 == 终端
# a = 'alex@'
# a1 = 'alex@'
# print(a is a1) # Fales
# n = 5//2
# n1 = 2
# print(n is n1) #True
# a = 'a'*21
# b = 'a'*21
# print(a is b) False
# a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
# b = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
# print(a is b) Ture
# n = -6
# n1 = -6
# print(n is n1) #False
# n = -5
# n1 = -5
# print(n is n1) #True
# n = 257
# n1 = 257
# print(n is n1) #True
#总结:
# == 比较 比较的俩边的值
# is 比较 比较的是内存地址 id()
2. 编码和解码
ascii 码:
不支持 中文
支持 英文 数字 符号
8位 一个字节
gbk码 国标:
支持 中文,英文,数字,符号
英文 16位 二个字节
中文 16位 二个字节
unicode 万国码
支持 中文,英文,数字,符号
英文 32 位 四个字节
中文 32位 四个字节
utf-8 长度可变的万国码 最少用8位
英文 8位 一个字节
中文 24位 三个字节
Python3中 程序运行阶段 使用的是unicode 显示所有的内容
bytes类型
传输和存储都是使用bytes
pycharm 存储的时候默认是使用utf-8
总结:
is 和 == 区别
is 比较内存地址
id() ---- 获取内存地址
小数据池:
数字的小数据池范围是 -5 ~ 256
字符串:
字符串中不能包含特殊符号 + - * / @ 等等
字符串单个字符*20以内内存地址都是一样的,单个字符*21以上内存地址不一致
注意: pycharm是个坑, 一个py文件中所有相同的字符串 一般都是使用一样的内存地址
== 比较俩边的值
编码和解码
encode(编码方式) ---- 拿到明文编码后对应的字节
decode(编码方式) -----将编码后的字节解码成对应的明文
注意: 用什么进行编码就要什么进行解码 不然后会懵逼!