变量命名规则
1、变量由字母,数字下划线搭配而成
2、不可以数字开头,更不能全是数字
3、不能是python关键词
4、不要用中文
5、名字要有意义
6、不要太长
7、要区分大小写
注释规则
注释规则
注释不会被python识别
"#" 跟单行注释
'''或者"""多行注释
数据类型
int整数类型
整数类型可以进行+-*/等数学运算
str字符串类型
用"" ''引起来的都是表示字符串
字符串可做+*运算
+表示拼接,字符串只能和字符串相加
*表示重复,能让字符串重复出现输出
bool布尔类型
False假
True真
False和True都是python关键字
输入与输出
输入
# 输入:程序界面(交互式)输入数据到程序中
input('请输入整数:') # 输入的都是字符串,需要数值得自行转换
输出
# 输出:程序数据输出到程序界面
print()
变量
变量:存储数据的容器
变量:(一般用来)封装(存储)数据,便于修改和复用
本质上真正的容器是数据(结构)本身,变量只是指向容器的门牌号码(指针)。
格式化输出
# 老的格式化方案
# %s表示在字符串中占位,稍后会填充字符串(任何内容)
# %d表示在字符串中占位整数(digit)
# %f表示在字符串中占位小数(float)%f.2(表示小数点后两位)%f.3(表示
#小数点后三位)以此类推
# 新的格式化方案f-string(适用于python3.5以上)
name = "小明"
addr = "中国"
hooby = "学习"
print(f"我叫{name},来自{addr},喜欢{hooby}")
#一种较为麻烦的格式化输出,也能用到
name = "小明"
age = 18
print("我叫{},我今年{}岁了".format(name,age))
基本运算符
#算术运算
a = 10
b = 20
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a // b) #求商
print(a % b) #求余数
print(a ** b) #a的b次方
比较运算(简单)
print(a > b) #大于
print(a < b) #小于
print(a == b) #等于(比较对象是否相等)
print(a != b) #不等于号
print(a >= b) #大于等于
print(a <= b) #小于等于
#赋值运算
a = 10
b = 20
a = b #赋值计算,把b赋值给a
a += b #相当于a = a + b
a -= b #相当于a = a - b
#类似还有a *= b a /= b a %= b
#逻辑运算(重点)——>布尔值
#and 并且,左右两端同时为真,结果才能是真,有一个假,结局就是假的
#or 或者,左右两端有个一是真的,结局就是真的
#not 非,不。非真即假,非假即真
print(True and False)
print(True or False)
print(not True)
当出现and,or,not,()混合使用时
运算顺序()——>not——>and——>or
print(True or (True and False) and not False)
逻辑运算非常规情况:出现数字逻辑运算怎么办
非零当成True
零当成False
记住or就行了,and与or相反
如果没有零,or运算取前边的值,and取后边的值
编码与解码
基础知识
Ascil:8bit,主要存放的是英文,数字,特殊符号
Gbk:16bit,主要存放中文和亚洲字符,兼容Ascil
Unicode:16bit和32bit两个版本,平常我们用的是16bit这个版本。全世界所有国家的文字信息,缺点:浪费空间(数据和传输)
utf-8:可变长度Unicode,英文:8bit,欧洲文字:16bit,中文:24bit一般数据传输的时候用
以上所有编码都要兼容Ascil
编码
s = "中国" #内存中使用的是unicode编码
bs = s.encode("utf-8")
print(bs) #b'\xe4\xb8\xad\xe5\x9b\xbd' bytes类型
print(type(b'\xe4\xb8\xad\xe5\x9b\xbd')) #每个/x是一个字节
解码
s = "中国" #内存中使用的是unicode编码
bs = s.encode("utf-8")
bss = bs.decode("utf-8") #用谁来编码就用谁来解码,不同的编码之间不能直接转换
print(s)
要先编码再解码
索引和切片(字符串,列表,字典,元组等等都能索引和切片)
索引
s = "我喜欢你"
s1 = s[0] #[]这个符号是str的索引号,[-1]就表示倒数第一个字符,[0]表示第一个字符,以此类推
print(s1)
print(s[2])
切片
切片的语法:
s[ start : end : step ]
start:起始位置
end:结束位置(取不到)
step:步长,每几个出来一个,如果是负数就倒着数
例如
s = "我爱我的祖国"
print(s[2:6]) # 规则是"顾头不顾尾",即[2:6]能取到2取不到6
print(s[2:]) # 中括号后面什么都不写表示直接切到末尾
print(s[:]) # 中括号前面什么都不写表示从头开始切
# 切片默认从左往右切,如果非要从右往左切需要加上第三个参数
s = "123456789"
print(s[9:0:-1]) # -表示倒着切,-1表示倒着一切一个
print(s[1:9:2]) # 第三个参数2表示每两个数出一个
str相关
字符串是不可变对象,任何操作对字符串来说是不会有任何影响的
大小写
s = "i am liming.I LOVE YOU"
s1 = s.capitalize() # 首字母大写,后面都是小写
print(s1)
s2 = s.lower() #全变成小写
print(s2)
s3 = s.upper() #全变成大写
print(s3)
查找
startswith() #判断字符串是否以xxx开头
endswith() #判断字符串是否以xxx结尾
count() #判断字符串中出现多少个xxx
find() #查找字符串,返回索引,查不到返回-1,不会报错
index() #查找字符串,返回索引与find本质区别是index找不到会报错
list列表(增、删、改、查)
列表用[]表示,每一项要用','隔开,不限制长度
列表里边什么都能放
增
#列表的追加用append,使用最多
s = [1,2,3,4,5,6,7,8]
s.append(9)
print(s)
#列表数据插入用insert
s = [1,2,3,4,5,6,7,8]
s.insert(1,9) #括号内第一个位置和索引一样,表示位置,第二个位置是插入的内容
print(s)
#迭代新增用extend
s = [1,2,3]
s1 = [4,5,6]
s.extend(s1)
print(s)
删
#列表删除remove
s = [1,2,3]
s.remove(1)
print(s)
# 列表删除pop,默认删除列表最后一个值,但可以指定位置,方法与索引一样
s = [1,2,3,4,5,6]
s.pop()
print(s)
s1 = s.pop(0)
print(s1)
# 列表删除del
s = [1,2,3,4,5,6]
del s[0]
print(s)
# 列表清空clear
s = [1,2,3]
s1 = s.clear()
print(s1)
改
#列表修改
s = ["1","2"]
s[1] = "3"
print(s)
# 结果是['1','3']
查
# 列表查询,range()
for i in range(10):
print(i)
for s in range(5,10,2):
print(s)
其他操作
使用for循环拿到索引和元素
# 使用for循环,拿到索引和元素
s = ["哈哈","呵呵","嘿嘿"]
for i in range(len(s)):
print(i)
print(s[i])
在列表中批量修改内容
#在列表中批量修改内容
s = ["王一","王二","张三","李四","王五"]
for i in range(len(s)):
item = s[i]
if item.startswith("王"): #判断是否姓王
s[i]="姓王的" #修改内容
print(s)
排序
s = [25,84,666,991,355,541,24,5,1]
s.sort() #默认从小到大排序
print(s)
s.sort(reverse=True) #reverse为翻转,这种方法可以实现从大到小排序
print(s)
tuple元组
元组和列表操作大致一样
但是元组不能修改
例如
s = ("我","你","他")
s[1] = "您"
#执行该程序就会报错,因为元组不能修改
#当元组里面只有一个元素时
#应当这样写
s = (1, )
#这样才是元组
元组也能循环
s = (1,2,3,4,5,6)
for i in s :
print(i)
dict字典(增、删、改、查)
字典用{}表示,列表用[]表示
例如,通过key找value值
s = {"key1":"values1","key2":"values2","key3":"values3"}
print(s["key1"])
不可哈希的数据类型不能当字典的key值,int,str,bool,tuple可哈希,其他都不可哈希
增
第一种:字典[ 新key ] = 新值
d = {1:"haha",2:"heihei"}
d[3] = "hehe"
print(d)
第二种:key必须不存在才能添加
d = {1:"haha",2:"heihei"}
d.setdefault(4,"huhu")
print(d)
删
变量.pop("key")
变量.clear()
del 变量[ key ]
改
d = {1:"haha",2:"heihei"}
d[1] = "hehe" #d[老key] = 新值
print(d)
查
d = {1:"wo",2:"ni",3:"ta"}
print(d[1]) #当查询的key不存在时程序会报错
print(d.get(1)) #当查询的key不存在时程序返回none
练习
#练习,把(11,22,33,44,55,66,77,88,99)大于50的放一起,小于50的放一起
lst = [11,22,33,44,55,66,77,88,99]
item = {}
for i in lst:
if i > 50:
if item.get("bigger")==None: #如果key"bigger"不存在
item["bigger"]=[] #那就创建key"bigger"
else:
item["bigger"].append(i) #然后把循环得出大于50的值塞进去
if i < 50:
if item.get("smaller")==None:
item["smaller"]=[]
else:
item["smaller"].append(i)
print(item)
简化版
#用setdefault来写
lst = [11,22,33,44,55,66,77,88,99]
result = {}
for i in lst:
if i > 50:
result.setdefault("bigger",[]).append(i)
else:
result.setdefault("smaller",[]).append(i)
print(result)
文件操作
用open()打开文件格式("文件路径",打开模式mode="r",encoding="utf-8")../表示返回上级目录
r操作,只读模式
1.read()
f = open("文件名字",mode="r",encoding="utf-8")
print(f.read()) #默认读取全部内容,文件大的话容易爆内存,有风险
2.readline()
f = open("文件名字",mode="r",encoding="utf-8")
print(f.readline()) #一次读取一行内容,中间会有空行
print(f.readline())
print(f.readline())
3.for循环(重点)
f = open("文件名字",mode="r",encoding="utf-8")
for line in f: #一次循环输出一行
print(line.strip()) #+strip()可以去掉空行
4.前面一行单独读取后面用for循环
f = open("文件名字",mode="r",encoding="utf-8")
first = f.readline()
print(first)
print("==============")
for line in f:
print(line.strip())
w模式
只写模式,只能写不能读,重新创建文件
f = open("文件名字",mode="w",encoding="utf-8")
f.write("写的内容")
f.write("\n") #反斜杠\n表示换行
f.write("写的内容")
a模式
append,追加写,不会重新创建文件,但是如果文件不存在可以重新创建
f = open("文件名字",mode="a",encoding="utf-8")
f.write("hello")
b模式
bytes,二进制 一般处理非文本文件,不能指定encoding
# rb 读取字节
# wb 写入字节
# 可用于复制非文本文件
f1 = open("非文本内容",mode="rb")
f2 = open("位置",mode="wb")
for line in f1:
f2.write(line)
# 爬取资源要用的到
with语句
with语句,可以省掉末尾.close,省去繁琐步骤
类似于
with open("草稿.txt",mode = "r",encoding="utf-8")as f1,