Python变量与常量、数据类型、文件处理
Python内容概要
- python基础
- 变量
- 数据类型
- 函数
- 面向对象
- 异常处理
- 网络编程
- 并发编程
- MySQL数据库
- 前端
- django框架
本篇内容概要
- 编程语言python
- 变量与常量
- 数据类型
- 文件处理
参考博客
https://www.cnblogs.com/Dominic-Ji/
https://www.cnblogs.com/xiaoyuanqujing/
编程语言与编程
"""
编程语言
语言
汉语、英语、日语。。。
人与人之间沟通交流的媒介
编程语言
人与计算机之间沟通交流的媒介
学习编程语言其实就是在学习一门外语
学python就类似于学一门火星语
学会了就能够跟火星人沟通
编程
人将自己的思维逻辑和想法用计算机能够听懂的语言表达出来的过程
"""
python解释器
# 在IT行业千万不要轻易的尝试新版本的软件
python解释器版本
2.X
最高的只有2.7
2020年之后不再维护更新
所以不要用2.X版本
3.X
习惯用3.6版本
# 去官网下载
点击安装的时候,最后一步记得勾选
add to path添加到环境变量如果没勾问题也不大
python IDE开发工具
1.vscode
2.pycharm
在下载pycharm的时候需要选择下载专业版
不要下载社区版
pycharm是收费的每年也就几百刀
任何收费的到了咋这里都可以破解
1.淘宝买一个激活码
2.百度搜索激活码
3.将我分享给你的压缩包解压
然后先点击pycharm试用
将文件里面的一个jar程序的文件拖入pycharm即可
然后点击安装重启即可
4.分享一个实时获取激活码的网站
http://idea.medeming.com/jets/
下载拷贝选择active code粘贴即可
注释
注释是代码之母
python的注释有两种
1.单行注释
# 单行注释
2.多行注释
'''
多行注释1
多行注释2
多行注释3
'''
"""
多行注释1
多行注释2
多行注释3
"""
变量
变量即变化的量
程序的运行其实就是一些列数据的变化
本质就是一系列变量的变化过程
变量的定义
username = 'jason'
age = 18
"""
变量名 赋值符号 变量的值
在内存中申请一块内存空间将jason存储进去
之后给jason绑定一个变量名username
后期如果你想要访问内存里面的jason那么只需要通过username即可
"""
# 要想访问到内存里面的数据就必须借助于变量名
变量的命名规范
1.数字、字母、下划线三者组合
2.数字不能开头
3.一定要做到见名知意
4.不能用关键字
变量的命名风格
1.下划线 python推荐
user_name = 'jason'
2.大驼峰 js推荐
UserName = 'jason'
3.小驼峰
userName = 'jason'
常量
在python中没有真正意义上的常量
在python中我们是墨守成规的将全大写的变量名看成是常量
HOST = '127.0.0.1'
PORT = 22
在js中有真正意义上的常量
const pi = 3.1415926242342342
undefined
pi
3.1415926242342342
pi = 666
VM204:1 Uncaught TypeError: Assignment to constant variable.
at <anonymous>:1:4
数据类型
- 整型
- 浮点型
- 字符串
- 列表
- 字典
- 布尔值
- 元组
- 集合
"""
不同的数据应该有对应不同的数据类型来存储和处理
.txt
.pdf
.mp4
...
"""
ps:如何查看数据类型
type(变量名/数据)
整型int
就是整数
作用:年龄、出生年份
age = 18
year = 2020
浮点型float
就是小数
作用:身高、体重
height = 183.1
weight = 75.1
字符串类型str
带有描述性性质的信息
作用:姓名、地址、个人简介
username = 'jason' # 单引号
addr = "安徽芜湖" # 双引号
info1 = '''你好坏哦 我好喜欢'''
info2 = """去你妹的""" # 三引号
# 常见方法
# 1 索引取值
# print(info[0]) # j 索引都是从0开始的
# 2 切片操作
# print(info[0:3]) # jas 顾头不顾尾
# 3 步长
# print(info[0:5:2]) # jsn 从0到5位置2个取一个
# 4 切割
# res = 'frank|123|DBJ'
# res1 = res.split('|')
# print(res1) # ['frank', '123', 'DBJ']
# 5 替换
res = 'frank is NB and age is 18 frank frank frank heiheihei'
# res1 = res.replace('frank','jason')
# print(res1) # jason is NB and age is 18 jason jason jason heiheihei
res1 = res.replace('frank','jason',2)
print(res1) # jason is NB and age is 18 jason frank frank heiheihei
列表类型list
names = 'jason,egon,frank,haoda'
"""
能够存储多个数据,数据与数据之间逗号隔开
数据可以是任意数据类型
"""
name_list = ['jason','frank',12,11.11]
# 1 索引取值
# print(name_list[0])
# print(name_list[0:3])
# print(name_list[0:3:2])
# 2 尾部追加值
# name_list.append('egon')
# print(name_list) # ['jason', 'frank', 12, 11.11, 'egon']
# 3 指定位置插入
# name_list.insert(0,'xxoo')
# print(name_list) # ['xxoo', 'jason', 'frank', 12, 11.11]
# 4 扩展列表
name_list.extend(['tony','tom','jerry','kevin'])
print(name_list) # ['jason', 'frank', 12, 11.11, 'tony', 'tom', 'jerry', 'kevin']
字典类型dict
info_dict = {
'username':'jason',
'password':123,
'hobby':['study','read','run']
}
"""
字典在构造数据的时候是按照key:value的形式
key
一般情况下是对value的描述性信息(字典的key一般情况下都是字符串类型)
value
真正的数据(字典的value可以是python任意数据类型)
"""
# 1 字典内部的k:v是无序的 也就意味着没法使用索引取值但是却可以按照key取值
# print(info_dict['username']) # jason 我们不推荐使用该方法取值
# print(info_dict['gender']) # 字典的key不存在的情况下会直接报错
# res = info_dict.get('username')
# print(res) # jason
# res1 = info_dict.get('gender')
# print(res1) # None
# 扩展
# res1 = info_dict.get('gender','你要找的这个键不存在')
# print(res1) # 你要找的这个键不存在
# res2 = info_dict.get('username','你要找的这个键不存在')
# print(res2) # jason
# 2 添加键值对
# info_dict['gender'] = 'male' # 不存在则新增
# print(info_dict) # {'username': 'jason', 'password': 123, 'hobby': ['study', 'read', 'run'], 'gender': 'male'}
# info_dict['username'] = 'frank' # 存在则修改
# print(info_dict)
print(info_dict.items()) # 直接获取字典里面所有的键值对 组织称列表的形式
print(info_dict.keys()) # 直接获取字典里面所有的key
print(info_dict.values()) #直接获取字典里面所有的value
"""
dict_items([('username', 'jason'), ('password', 123), ('hobby', ['study', 'read', 'run'])])
dict_keys(['username', 'password', 'hobby'])
dict_values(['jason', 123, ['study', 'read', 'run']])
"""
布尔值bool
作用:用来判断事物对错
True
False
多用于逻辑判断中 流程控制
# 布尔值默认为False的有哪些
0、None、''、[]、{}
元组tuple
就把它看成是一个不可变的列表即可
元组也可以存放多个数据、数据与数据之间逗号隔开
区别在于列表里面的元素可以修改但是元组里面的不可以
t = (111,222,333)
t = (111,222,333,222,222,222,222,222,222)
l = [111,222,333]
# l[0] = 666
# print(l)
# 1 索引取值
# print(t[0])
# print(t[0:3])
# print(t[0:3:2])
# 不可修改
# t[0] = 666 # 直接报错
# 统计元素出现的个数
# res = t.count(222)
# print(res) # 7
# 获取元素对应的索引值
print(t.index(222)) # 1
集合类型set
"""
1.去重
2.关系运算
共同好友...
"""
s1 = {1,2,3,4,5} # 集合内不可能出现相同的元素
# s = {1,2,3,4}
# print(type(s))
# s = {1,2,3,4,3,3,3,3,3,3,3,3}
# print(s)
f1 = {'jason','egon','tony','jerry'} # 用户1的所有好友姓名
f2 = {'jason','frank','oscar','tony'} # 用户2的所有好友姓名
# 1 求两个用户的共同好友
# res = f1 & f2 # 交集
# print(res) # {'jason', 'tony'}
# 2 求用户1的独有好友
# res = f1 - f2
# print(res) # {'egon', 'jerry'}
# 3 求用户2的独有好友
# res = f2 - f1
# print(res) # {'frank', 'oscar'}
# 4 求两个用户各自独有的好友
# res = f1 ^ f2
# print(res) # {'oscar', 'jerry', 'frank', 'egon'}
# 5 父集 子集
print(f1 > f2)
与用户交互
1.输入
input
username = input('请输入你的用户名>>>:')
print(username,type(username)) # input获取到的用户输入都是字符串类型
2.输出
print
格式化输出
"""
亲爱的XXX你好
您的话费是XXX
余额是XXX
"""
%s占位符
res = '亲爱的%s,你的话费是%s,余额是%s'
print(res%('jason',50,100000000000000))
运算符
- 数学运算
+ - * /
- 逻辑运算
与 and 或 or 非 not """ 三者结合使用的情况下会有优先级的问题 但是我们在写程序的时候应该人为的区分优先级 就是用括号提前划分出优先级 """
- 增量赋值
x = 1 x = x + 1 # x += 1 x = x - 1 # x -= 1 x = x * 1 # x *= 1 x = x /1 # x /= 1
- 解压赋值
name_list = ['jason','egon','frank','haoda'] # jason_name = name_list[0] # egon_name = name_list[1] # frank_name = name_list[2] # haoda_name = name_list[3] # a,b,c,d = name_list # 解压赋值 # print(a,b,c,d) # a,b,c = name_list # 少一个不行 # print(a,b,c) # a,b,c,d,e = name_list # 多一个不行 # print(a,b,c) # a,*_,b = name_list # *号会将多余的元素组织称列表交给后面的变量名 # print(a,b,_) # jason haoda ['egon', 'frank'] a,b,*_ = name_list print(a,b,_) # jason egon ['frank', 'haoda']
流程控制
"""
流程控制主要分为三类
1.顺序结构
从上往下的顺序依次执行即可
2.分支结构
根据条件作出不同的响应
3.循环结构
重复的做/执行事情/一段代码
"""
# 分支结构
# 1.女孩子的年龄 如果小于35叫小姐姐
# age = 40
# if age < 35:
# print('小姐姐加个微信')
# a = 1
# b = 2
"""
在python中是利用代码的缩进来表示代码的从属关系
缩进量一般推荐四个空格
多行子代码属于一个关键字的时候 那么它们必须保持相同的缩进量
"""
# 2.女孩子的年龄 如果小于35叫小姐姐 否则叫不好意思认错人了
# age = 28
# if age < 35:
# print('小姐姐加个微信')
# else:
# print('认错人了 赶紧跑')
# 成绩评判
"""
大于90 优秀
大于80 良好
大于70 一般
大于60 及格
其他 挂科
"""
score = input('score>>>:')
# 将字符串的数字转为整型的数字
score = int(score)
if score > 90:
print('优秀')
elif score > 80:
print('良好')
elif score > 70:
print('一般')
elif score > 60:
print('及格')
else:
print('挂科 交钱重修')
"""
if elif else 三者只会走一个
"""
# 登录功能
username = input('username>>>')
password = input('password>>>')
if username == 'jason' and password == '123':
print('来宾三位')
else:
print('没钱滚蛋')
# 循环结构
"""
while 条件:
代码块1
代码块2
代码块3
1.需要先判断条件是否成立 如果成立则依次执行代码块1、2、3
2.代码块执行完毕之后 会再次回到while的开头再次判断条件是否成立
如果成立继续执行代码1、2、3
3.一旦条件不成立之后 就会结束循环体的执行
"""
while True:
username = input('username>>>')
password = input('password>>>') # 好看的前端界面
if username == 'jason' and password == '123': # 连接数据库查询
print('登录成功')
while True:
cmd = input('please input your command>>>:')
print('正在执行您的命令%s'%cmd)
else:
print('用户名或密码错误')
# while + break
"""直接结束本层循环"""
while True:
username = input('username>>>')
password = input('password>>>') # 好看的前端界面
if username == 'jason' and password == '123': # 连接数据库查询
print('登录成功')
while True:
cmd = input('please input your command>>>:')
if cmd == 'quit':
# 结束当前循环体
break # 只能结束上方离它最近的那个while循环
print('正在执行您的命令%s'%cmd)
break
else:
print('用户名或密码错误')
# while + continue
"""结束本次循环 直接开始下一次"""
l = [11,22,33,44,55,66,77,88,99,100]
# 统计元素个数
# print(len(l)) # 10 列表包含10个元素
count = 0
while count < len(l):
if l[count] == 66:
# 先将count加1
count += 1
# 结束本次循环 直接开始下一次循环
continue
print(l[count])
count += 1
# while + else
count = 0
while count < 10:
print(count)
if count == 6:
break
count += 1
else: # 当while循环没有被break主动打断的情况下 正常的结束了才会走else
print('while循环寿正终寝了')
# for循环
"""
for循环能够做的事情while循环都能做
但是for循环的语法更加的简单
"""
for i in range(1,11): # [1,2,3,4,5,6,7,8,9,10] 顾头不顾尾
print(i)
"""
for循环不需要你给出结束的条件
它的内部一旦将取的值全部取完 会自己结束
"""
# s = 'jason 666 '
# for i in s: # 将字符串里面的一个个的字符取出赋值给for后面的变量名i
# print(i)
# l = [111,222,333,444]
# for i in l:
# print(i)
d = {'username':'jason','password':123,'hobby':[111,222,333]}
for i in d:
print(i)
"""
字典默认暴露给外界的只有key for循环也只能获取到key 答案B
A
'username':'jason'
B
'username'
C
'jason'
D
报错 不支持
"""
ps:
for+break
for+continue
for+else
规律跟while一直
文件处理
# 什么是文件
"""
其实文件是操作系统暴露给我们操作计算机硬盘的快捷方式
"""
# 文件操作
# file_obj = open('a.txt',mode='r',encoding='utf-8')
# res = file_obj.read() # 读取文件内容
# print(res)
# file_obj.close()
# with上下文管理
with open('a.txt',mode='r',encoding='utf-8') as file_obj:
print(file_obj.read())
打开文件的三种模式
mode参数
r
只读
w
只写
a
追加写
# r
# 文件不存在直接报错
# with open('b.txt',mode='r',encoding='utf-8') as file_obj:
# print(file_obj.read())
# with open('a.txt',mode='r',encoding='utf-8') as file_obj:
# print(file_obj.read()) # 只能读不能写
# w
# 文件不存在自动创建
# with open('b.txt',mode='w',encoding='utf-8') as file_obj:
# pass
"""w模式会先清空当前文件 之后再写入"""
# with open('a.txt',mode='w',encoding='utf-8') as file_obj:
# file_obj.write('是不是有点懵逼?\n')
# file_obj.write('是不是有点懵逼?\n')
# file_obj.write('是不是有点懵逼?')
# a
# 文件不存在自动创建
# with open('c.txt',mode='a',encoding='utf-8') as file_obj:
# pass
# 文件存在不会清空文件内容
with open('a.txt',mode='a',encoding='utf-8') as file_obj:
file_obj.write('\n赶紧下课吧 坚持不住了\n')
file_obj.write('赶紧下课吧 坚持不住了\n')
file_obj.write('赶紧下课吧 坚持不住了\n')
文件的操作模式
mode
rt text文本
wt
at
t不写默认就是文本模式
t
t不写默认就是文本模式
b
以二进制模式打开文件
用b就可以打开所有的文件
"""
计算机基于电工作的,电信号只有高低电平
所以计算机只识别二进制数 010101010101
"""
# with open('a.txt','rb') as f:
# data = f.read()
# print(data.decode('utf-8')) # 解码
"""
在python中有一个bytes类型,你直接把它看成是二进制数据即可
"""
# with open('b.txt','wb') as f:
# f.write('真架不住了'.encode('utf-8')) # 编码
'''
编码 encode
将人类能够识别的字符按照指定的编码 编码成二进制数据
解码 decode
将二进制数据按照指定的编码 解码成人类能够读懂的字符
'''
with open('b.txt','ab') as f:
# f.write('真架不住了'.encode('utf-8')) # 编码
# f.write('hello world'.encode('utf-8')) # 编码
f.write(b'hello world 666') # 编码
利用b拷贝图片
# 1 先获取拷贝源
# 2 创建一个新文件将文件内容写入
with open(r'111.jpg','rb') as f:
data = f.read()
with open(r'222.jpg','wb') as f:
f.write(data)
控制文件内光标的移动
f.seek(offset,whence)
whence
0
相对于文件开头
1
相对于当前位置
2
相对于文件末尾
# 1、2只能在b模式下使用
offset
偏移量
是以字节为单位(bytes)的
1bytes = 8bitbit
1024bytes = 1KB
1024KB = 1MB
...
utf-8默认用3bytes表示一个中文
用1bytes表示一个英文/数字
with open(r'a.txt','r',encoding='utf-8') as f:
print(f.read())
f.seek(4,0)
print(f.read())
文件修改
1.覆盖写
2.先创建一个新的临时文件 将修改的文件内容写入
之后将源文件删除 将新文件重命名为源文件
with open(r'a.txt','r',encoding='utf-8') as f:
data = f.read()
# 字符串的替换
data = data.replace('frank','haoda')
with open(r'a.txt','w',encoding='utf-8') as f:
f.write(data)
# 需要掌握
with open(r'a.txt','r',encoding='utf-8') as f:
for line in f: # 一行一行的读取文件内容
print(line)
import os
with open(r'a.txt','r',encoding='utf-8') as f1,open(r'a.backend.txt','w',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('haoda','frank'))
os.remove(r'a.txt')
os.rename(r'a.backend.txt',r'a.txt')