详见第五章
https://liaoxuefeng.com/books/python/advanced/iterate/index.html
1.运算符
1.1 算数运算
+
-
*
/
//
%
1.2 比较运算
>
<
>=
<=
==
!=
is 判断是否是同一个对象,一般用来判断是否是空(None)
not is 判断是否不是同一个对象
a = None
print(a is None)
1.3 赋值运算
=
此外a = a + 1也可以写成 a += 1
同理-= = / ...也是一样的。
1.4 逻辑运算
and
or
not
计算规则:相同运算符之间,从左往右算;不同的组合,优先括号,再not,再and,最后是or。
组合逻辑运算时需要根据优先级用括号括起来。
注:对于数字来说,0可以表示F,非0可以表示T,但是输出结果都是数字,根据运算顺序来,比如
print(0 and 2)
# 结果是0,因为前面是0,所以不用算后面的数了,结果一定为F
print(32 and 4)
# 结果是4,因为前面是T,后面的也要算,输出结果是后面的数字
print(33 or 28)
# 结果是33
1.5 成员运算
in 是否存在于xxx
not in 是否不存在于xxx
下面几章对重要数据类型做说明。
2.bool类型
所有的数字,非0都是True,0是False
所有的字符串,只有空字符串是False,其他都是True
所有的列表,只有空列表是False,其他都是True
None是False
print(bool("")) #False
print(bool(" ")) #空格也是True
print(bool([])) #False
print(bool([""])) #列表里有东西,即便东西是空字符串,也为True
print(bool(None)) #False
0,"",[],(),{} ,set(), b'', None都表示False,python中所有表示空的都是False,可以和if或者while结合使用,如:
info = []
if info:
print("采集到了")
else:
print("没采集到")
或
info = []
if not info:
print("没采集到")
3.字符串类型(重要)
3.1 字符串索引切片
打印s中的第1个字符:
s = "python是世界上最好的编程语言"
print(s[0]) # 结果是p
注:索引是从0开始计算的,0表示正数第一个,-1表示倒数第一个
切片规则[start: end],左闭右开,即start能取到,end取不到。
start如果不写,表示从头开始取;end同理。
如果要跳着取可以使用[start:end:step],其中step定义步长,step如果是正数则表示从左到右,负数表示从右到左。
s = "python是世界上最好的编程语言"
print(s[1: 4]) # 结果是yth
print(s[: 4])
print(s[4:])
print(s[::2]) #表示从头开始取到尾,每2个取1个
判断一句话是否是回文(从左往右和从右往左是一样的),这时候就可以使用此功能进行翻转
s = "上海自来水来自海上"
s1 = s[::-1]
if s == s1:
print("是回文")
else:
print("不是回文")
3.2 字符串各种操作
大前提:python中的字符串是一个不可变的数据类型,不是说变量不可变,而是说数据是不可变的(相应的内存地址存了这个字符串)
因此字符串操作必须进行赋值,如:
s = "wwj"
s1 = s.capitalize()
print(s)
print(s1)
查看字符串都有哪些操作?
print(dir(str))
3.2.1 strip()
用来去掉字符串左右两端的空白(空格,水平制表符\t,回车\r,换行\n):
s = " q w e r "
s = s.strip()
print(s) # 结果是q w e r
用来去掉字符串左右两端的其他字符串:
s = "_sb_qwer_sb_"
s = s.strip("_sb_")
print(s) # 结果是qwer
3.2.2 replace()
替换:
s = "sb很爽"
s = s.replace("sb" , "上班")
print(s) # 结果是上班很爽
去掉空白符:
s = s.replace(" " , "").replace("\n" , "").replace("\r" , "").replace("\t" , "")
如果用正则re则可以写成这样:
import re # 导入正则表达式模块
kongbai = re.compile(r"\s") #编译一个正则表达式模式,\s匹配任何空白字符,r表示使用原始字符串,防止转义符被误解
r = kongbai.sub("" , s) #使用编译好的正则表达式对象,进行替换操作,sub方法会找到字符串s中所有匹配空白字符的部分并替换成""
print(r)
注:如果只需要单次替换,直接使用下面的写法更简洁:
re.sub(r"\s", "", s)
编译正则表达式 (re.compile) 的优势在于多次重复使用时提高效率。
3.2.3 split()
用于字符串切割。
s = "wwj_wxz_wyx"
result = s.split("_") # 用下划线切割
print(result) # 结果是列表['wwj', 'wxz', 'wyx']
3.2.4 startswith
判断是否以什么开头
s = "张福永"
print(s.startswith("张")) # True
3.2.5 upper
将字符串转换为大写,一般用于忽略用户输入的大小写的时候
while True:
r = input("请输入(输入Q退出)")
if r.upper() == "Q":
break
print("你输入的是", r)
3.2.6 join()
用于字符串拼接
lst = ["wwj", "wxz", "wyx"] # 定义一个列表
s = "_".join(lst) # 将列表中的元素用_进行拼接
print(s)
3.2.7 len()
用于计算长度(字符数),但不是字符串独有的。
之前的格式都是形如“字符串.操作”的形式,但len只用len即可,属于内置函数。
s = "张福永"
print(len(s))
3.2.8 find()和index
查找子串在字符串中的位置
s = "java是最好的"
r = s.find("是")
print(r) # 也是从0开始,结果为4
r = s.find("是")
print(r) # 结果也为4
注:find()如果不存在则返回-1,index()如果不存在则直接报错
3.2.9 isdigit()
判断字符串是否是数字组成的。
用于将字符串转换成数字之前校验,避免将int()无法转换的内容执行而报错。
注:缺陷是无法判断小数
3.3 for循环取字符串所有字符
s = "wwj wxz wyx"
for item1 in s:
print(item)
4.列表类型(重要)
4.1 列表的索引和切片
主要作用是用来存储大量数据。python中使用[ ]表示列表(数组),
创建方式有两种:直接写[ ],或list()
lst = ["192.168.1.1", "192.168.1.2"]
列表对存储的数据没有类型的要求。
列表也具有索引和切片,逻辑和字符串一致,提取数据直接用索引就可以了。
lst = ["192.168.1.1", "192.168.1.2", "192.168.1.3" ,"192.168.1.4"]
ip = lst[0]
print(ip)
print(lst[1: 3]) #切片和字符串一致,左闭右开
print(lst[: : -1]) #从头到尾开始取,倒着取,步长是1,即倒着显示
注:列表是一个可以变化的数据类型,这点区别于字符串类型。
4.2 列表的操作
4.2.1 新增数据
append() 、insert()、extend().
append()是在原有基础的末尾追加,最常用。
注:append()没有返回值。
lst = []
lst.append("wwj")
lst.append("wxz")
lst.append("xlh")
print(lst)
insert()是在特定位置插入
lst.insert(2,"wyx")
print(lst)
extend()可以合并列表
lst1 = ["wwj","wxz","wyx"]
lst2 = ["xlh","xyc","xjc"]
lst1.extend(lst2) # 把2合并到1里
print(lst1)
4.2.2 修改数据
用索引进行修改:list[index]="新数据"
lst1 = ["wwj","wxz","wyx"]
lst1[1] = "zfy"
print(lst1)
4.2.3 删除数据
list.pop(index) 或 remove("值")
lst1 = ["wwj","wxz","wyx"]
lst1.pop(1)
print(lst1)
查看被删的是谁:
lst1 = ["wwj","wxz","wyx"]
rm = lst1.pop(1)
print(lst1)
print(rm)
注:如果pop()不指定索引,则删的是最后一项。
remove()示例:
lst1 = ["wwj","wxz","wyx"]
lst1.remove("wxz")
print(lst1)
注:remove不返回任何东西;如果remove的值出现多次,则仅删除第一次出现的。一般不会做数据删除,基本都是改标识符让用户看不到。
4.2.4 查询数据
普通查询(直接用索引)
lst1 = ["wwj","wxz","wyx"]
item = lst1[2]
print(item)
循环遍历(最常用)
lst1 = ["wwj","wxz","wyx"]
for item in lst1
print(item)
这种循环的缺陷是看不见索引。
想用for循环拿到索引如何实现?
需要用到range()函数,用于计数。
如:
for i in range(5): #意思是i从0到4(取不到5)
for i in range (5,10): #意思是i从5到9(取不到10)
for i in range (5,10, 2): #意思是i从5到9(取不到10),且步长为2,即5 7 9;所以range()逻辑和切片逻辑类似。
注:while循环也可以实现,一般while用于无法判定循环次数的情况,for用于固定循环次数的情况。两种都要掌握
取索引+元素,将x开头的改成w开头的,示例:
lst = ["wwj","wxz","wyx","xlh","xyc","xjc"]
for i in range(len(lst)):
item = lst[i]
if item.startswith("x"):
item = "w" + item[1:] # 赋值给item变量
lst[i] = item # 修改列表
# print(i, item)
print(lst)
4.2.5 range()
range()不仅用于让for循环数数,还经常用于快速生成列表
range(n)表示0~n,取不到n
range(m, n)表示m~n,取不到n
range(m, n, p)表示m~n,取不到n,步长为p
lst = list(range(555,666))
print(lst)
4.2.6 其他操作
lst = [11,22,33]
print(lst.index(22)) # 打印列表中数据元素的位置
lst.reverse() # 让列表翻转
print(lst)
lst.sort() #排序,数字是可以排序的,字符串规则可能不一样
print(lst)
5.元组类型(不做重点)
可理解为不可变的列表,也能索引和切片,但不能进行增删改操作。
在python中用()表示元组,元组末尾一般会写个逗号,用于和算术优先级里的括号区分
如:(1,)
空元组用tuple
此外下面这种也是元组,即小括号省略
a = 1,2,3,4
print(a) # 显示(1,2,3,4)
python提供了解包的语法帮助快速取出元组中的数据
a = 1,2
b = a[0] #传统模式,用索引定位
c = a[1]
print(b,c)
d, f = a #注意解包出来的数量必须完全一致
print(d,f) #结果与用索引定位相同
还有写成这样的:
a,b = 1,2
元组中如果套了一个列表则也可以修改:
t = (11,22,33,["wwj","wxz"])
t[3].append("wyx")
print(t)
6.字典类型(重要)
列表取元素很难,没有索引就无法定位到元素。
而字典就非常容易,也非常快,是k-v形式:
dic = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
dic['Michael']
通过key即可获取value。
- 字典有两种方式,一个是{},一个是dict()。
- 字段的key:不能重复、相同key后存进去的value会把之前的冲掉;必须是不可变的数据类型(因为hash值就变了),即可哈希的
6.1 新增数据
dick[key] = value
dic = {}
dic["一号床"] = "wwj"
dic["二号床"] = "wxz"
dic["三号床"] = "wyx"
print(dic)
(不用考虑字典顺序)
6.2 给字典改数据
(接上一段)
dic["三号床"] = "zfy"
print(dic)
即冲掉即可。
6.3 给字典删数据
根据key来删
dic.pop(key)
6.4 查询
- 普通查询
print(dic['三号床']) #如果key不存在则报错,但这种情况使用较多,因为我们都是知道key的
print(dic.get("三号床")) #如果key不存在则返回none
print(dic.get("三号床"),"naonao") #如果key不存在则返回默认值,此例为naonao
- 循环遍历(不推荐)
for key in dict:
value = dict[key]
例:
for k in dic:
print(k, dic[k])
可以拿到所有的key - value。
另外还有一种方法只能拿到value(无法通过values拿到keys):
for v in dic.values():
print(v)
一次性取所有values并转换成列表:
print(list(dic.values()))
还有一个同时拿k,v的方法:
for k, v in dic.items():
print(k, v)
6.5 字典和列表的嵌套
dic = {
"name": "naonao",
"age": 18,
"weight": 90,
"ex": {
"name": "wjn",
"age": 18,
"weight": 50,
"ex":{
"name": "wsn",
"age": 21,
"weight": 95
}
}
"dad":[
{"name":"wwj","age":18},
{"name":"wxz","age":18}
]
}
查找naonao的ex的ex的名字(一层一层往里找):
print(dic['ex']['ex']['name'])
修改naonao的ex的体重:
dic["ex"]["weight"] += 10
print(dic)
获取naonao所有dad的名字:
for item in dic['dad']:
print(item['name'])
总的来说一层一层扒即可。
练习:统计一个字符串中,每个字符出现的次数。
7.set集合类型(不做重点)
可当成只存储key的字典。
两种方式:
{},只有key没有value,
set() 空集合只能用这种方式
1.数据是不重复的(重复的话打印出来也只出来第一个)
2.数据必须是不可变的数据类型
7.1 增加数据
s.add("key")
print(s)
7.2 查找
for 循环遍历
for item in s
print(item)
7.3交并差集
基本用不上
7.4去重(最常用)
lst = [11,22,33,11,22,33]
s = set(lst) #把列表丢给集合
print(s)
想转回列表:
s = list(set(lst))
注意顺序是乱的








网友评论