Loading

Python基础1 (基本数据类型 文件)

Python简介

应用领域

web开发(写网站从无到有)人工智能 爬虫(大批量爬取网络中的数据)金融分析 云计算

Python2 和 Python3 的区别

Python2 源码不统一 重复代码

Python3 源码统一 没有重复代码

Python2的input获取到的是什么类型就是什么类型

Python3的input获取到的全都是字符串

Python2不支持中文 print可以不加括号

编程语言

编译型和解释型 静态语言和动态语言 强类型定义语言和弱类型定义语言

编译型(代表 C)

优点: 运行速度快 缺点:开发效率慢

解释型(代表 Python)

优点:开发效率快 缺点:运行速度慢

Python的优缺点

优点

  1. 简单易懂

  2. 开发效率非常高,类库(第三方库)特别多

  3. 高级语言,无需考虑内存等底层细节

  4. 可移植性,可跨平台

  5. 可扩展性,在Python中把部分程序用C或C++编写

  6. 可嵌入性,Python可嵌入C或C++

    缺点

  7. 速度慢

  8. 代码不能加密

  9. 线程不能利用多CPU

Python的种类

Cpython(Python转C语言)    Jyhton (Python转java)  IronPython (Python转C#)

PyPy(Python转Python编译)(特殊) 

Python的入门

变量 -- 输出

a = 1         # 声明变量
a             # 变量的名字
=             # 赋值
1             # 值
变量定义的规则
1.变量由数字,字母,下划线组成
2.不能以数字开头
3.不能使用python中关键字 (and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lanbda,not,or,pass,print,raise,return,try,while,with,yield)
4.不能使用中文和拼音
5.区分大小写
6.变量名要具有描述性
7.推荐写法
    7.1驼峰体 
    7.2下划线 age_of_oldboy = 98  (官方推荐)
变量的小高级
age = 18
age1 = 19
age2 = age      # age2 = 18
age = 20
print(age,age1,age2)     #20 19 18  一个变量名只能代指一个值
a = 4
b = a + 6   #在声明变量的时候先执行等号右边的内容
print(b)          # 10

常量

常量:ID = 11012013014066      常量就是不变的量

常量名全部大写

注释

单行注释 # 
多行注释 """ """  ''' ''' 
被注释的内容是不是会执行的

基础数据类型

type(类型)

数字: 用于计算和比较(int)

字符串:在python中只要是用引号引起来的就是字符串(str)

加法 -- 同是字符串才能相加

乘法 -- 只能和数字进行相乘

''' I'm   "meet" '''    #引号配合使用
a = 'alex'
b = 'wusir'
print(a+b)    # alexwusir  字符串拼接   注意:只能和字符串相加
a = '坚强'
print(a*8)    #坚强坚强坚强坚强坚强坚强坚强坚强 字符串乘   注意:只能和数字相乘

布尔值:返回真假值 用于判断(bool)

True   真
False  假

程序交互

注意:input获取到的内容全都是字符串

int() -- 将字符串中的数字转换成整型

type() -- 查看数据类型

if

if 判断条件:
    执行语句……
else:
    执行语句……
if 判断条件1:
    执行语句1……
elif 判断条件2:
    执行语句2……
elif 判断条件3:
    执行语句3……
else:
    执行语句4……

while 循环

while -- 关键字 (死循环)

while 条件:

循环体

while 判断条件(condition):
    执行语句(statements)……

while else

while True:    
	print(111)    
	break
else:    
	print(222)
	
while True:    
	print(111)   
	break
	print(222)

总结:

打断循环的方式:    
1.自己修改条件   
2.breakbreak -- 打破当前循环 (终止当前循环)
continue -- 跳出当前循环继续下次循环(将
continue伪装成循环体中的最后一个行代码)break和
continue相同之处:他们以下的代码都不执行

for 循环

for iterating_var in sequence:
   statements(s)

字符串格式化

print "My name is %s and weight is %d kg!" % ('Zara', 21) 
My name is Zara and weight is 21 kg!

运算符

算术运算符

符号 名称
+ 加
- 减
* 乘
/ 除
% 模
** 幂运算
// 整除

赋值运算符

符号 名称
+= 加等于
-= 减等于
*= 乘等于
/= 除等于
//= 整除等于
**= 幂等于
%= 模等与

比较运算符

== 判断等号两端的值是否相同

is判断判断内存地址是否相同

符号 名称
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于

成员运算符

符号 名称
in 在
not in 不在

逻辑运算符

符号 名称
and 与 前后都为真取后者,前后都为假取前者,一真一假取假
or 或 前后都为真取前者,前后都为假取后者,一真一假取真
not 非

成员运算符

in 存在 not in 不存在

编码初识

ascii (老美)不支持中文

gbk (国标) 英文 8位 中文16位

unicode (万国码)英文2字节 16 位 中文4字节 32位

utf-8 (可变长的编码) 英文1字节8位 欧洲文2字节16位 亚洲3字节24位

linux -- utf-8

mac -- utf-8

windows -- gbk

单位转换:

1字节 = 8位

1Bytes = 8bit

1024Bytes = 1KB

1024KB = 1MB

1024MB = 1GB

**1024GB = 1TB ** TB就够用了

1024TB = 1PB

1024PB = 1EB

整型以及布尔值转换

整型 -- 数字 (int)

整型(数字)用于比较和运算

计算机支持的数字范围

32位 -- -2 ** 31 ~ 2 ** 31 -1

64位 -- -2 ** 63 ~ 2 ** 63 -1

Python2和Python3在整型中的区别

python2 整型 int -- long(长整型) /获取的是整数 python3 整型 int / 获取的是浮点数(小数)

二进制和十进制

456  ----- 十进制数0101 ----- 二进制数除此之外还有:十六进制  八进制  二进制

bool() 布尔值

print(bool(1))  # 数字非零的就是True 零就是Falseprint(bool("")) # 字符串不为空就是True(有空格也是不为空) ,字符串中没有任何内容就是False

字符串详解

在python中引号引起来就是字符串

字符串是用来存储少量数据

name = "m e a t"
# meat 每一个字母叫做一个元素           
# 0 1 2 3    从左向右           #-4-3-2-1    从右向左          
# 索引(下标) 通过索引可以精确的定位到某个元素print(name[-1])  
# t

切片

name = " 今天是个 好日子"      
# 0 1 2 3 4 5 6       
#-7-6-5-4-3-2-1a = name[0]       
#今b = name[1]       
#天print(a+b)   
#今天print(name[0:2])  
# 顾头不顾尾  name[起始位置:终止位置]print(name[:])  
# 某个位置不指定的时候默认取最后或最前print(name[2:5]) 
# 是个好print(name[-4:-1])
# 个好日print(name[-2:-5])    
# 输出为空print(name[-2:-5:-1])
# [起始位置:终止位置:步长] 步长默认为1 例:name = "大黑哥吃大煎饼"print(name[1:5])    
#黑哥吃大print(name[-2:-6:-1])  
#哥吃大煎print(name[-6:6])    
#黑哥吃大取第1.3.5.7位置的字a = name[0]b = name[2]c = name[4]d = name[6]print(a+b+c+d)运用步长:print(name[::2])      
#步长为2,所以每两个取一个print(name[100:105])  
#切片的时候起始位置和终止位置都超出的时候不会进行报错print(name[100]) 
#索引的时候索引值超出范围的时候会报错 练习:s = 'Python最NB'获取s字符串中前3个内容print(s[:3])获取s字符串中第3个内容print(s[2])获取s字符串中后3个内容print(s[-3:])获取s字符串中第3个到第8个print(s[2:-1])获取s字符串中第2个到最后一个print(s[1:])获取s字符串中第1,3,5个内容print(s[:5:2])获取s字符串中第2,4,6个内容print(s[1:6:2])获取s字符串中所有内容print(s)获取s字符串中第4个到最后一个,每2个取一个print(s[3::2])获取s字符串中倒数第5个到最开始,每3个取一个   print(s[-5::-3])

字符串的方法:

方法 描述 代码
upper() 将字符串转换为大写 "abc".upper()
lower() 将字符串转换为小写 "ABC".upper()
startswith() 查询以什么开头返回bool类型 "abc".startswith("a")"abc".startswith("b",1)
endswith() 查询以什么结尾返回bool类型 "abc".endswith("a")"abc".endswith("b",0,2)
count() 统计指定内容出现次数 "aaba".count("a")
strip() 去除两段的空格、换行符、制表符(可指定内容) print(" a ".strip()"abc".strip("a")
split() 以空格、制表符、换行符进行分割(可指定内容以及最大分割块)返回一个数组 "a b c ".split(maxsplit=2)
replace() 替换字符串中的内容,(可以指定替换次数) "abc".replace("b","c",1)
isalnum() 判断是否为子母、数字、中文 "a2三".isalnum()
isalpha() 判断是否为字母,中文 "a三".isalpha()
isdigit() 判断是否为阿拉伯数字 "12③".isalnum()
isdecimal() 判断是否为十进制的数字 ”123".isdecimal()
len() 获取字符串长度 "abc".len()
capitalize() 将字符串首字母大写 "abc".capitalize()
title() 将字符串每个单词首字母大写 "a b c".title()
swapcase() 将字符大小写反转 "aBc".swapcase()
center() 居中填充 "abc".center(15,"-")
find() 查找,当不存在的时候返回-1(返回值为下表) "abc".find("b")
index() 查找,当不存在提示错误 "abc".index("b")
join() 使用指定内容拼接 "^".join("abc")

S系列

s = "ALEX"s1 = s.upper()
#全部大写print(s1)s1 = s.lower()
# 全部小写print(s1)应用场景
s = input("验证码(AbC5)")
if s.upper() == "AbC5".upper():    
	print("验证码正确")
else:    
	print("验证码错误!")
以....开头:
s = "ALEX"s1 = s.startswith("A")
print(s1)      
#Trues1 = s.startswith("E",2,6)print(s1)      
#True以....结尾:
s = "ALEX"s1 = s.endswith("X")
print(s1)      #True
统计s = "alexdxjbx"s1 = s.count("x")print(s1)    
# 3脱: 字符串头尾两端的空格和换行符以及制表符n = input(">>>")if n.strip() == "alex":    print("1")else:    print("2")       
#输入"  alex  "  输出"1"s = "alexdsba"s1 = s.strip("a") 
# 可以指定内容取脱print(s1)     
# lexdsb分割:以空格和换行符以及制表符进行分割s = "aelxlaaa"s1 = s.split("l")  
# 可以通过指定方式进行切割   print(s1)       
# "ael","laaa"s = "aelxlaxaa"s1 = s.split("l",maxsplit=1)
# 存在多个可切割目标时,可用maxsplit来指定切割次数,maxsplit=1即切割次数为1print(s1)       
# "ael","laxaa"s = "aelxlaxaa"s1 = s.rsplit("l",maxsplit=1) 
# 存在多个可切割目标时,用maxsplit指定切割次数后,可在split前加"r"来更改切割优先方向print(s1)       
# "aelx","laaa"替换:s = "大黑哥吃肉夹馍"s1 = s.replace("肉夹馍","大煎饼")print(s1)          
# 大黑哥吃大煎饼s = "大黑哥吃肉夹馍,肉夹馍"s1 = s.replace("肉夹馍","大煎饼",1) 
# 指定替换的次数print(s1)          
#大黑哥吃大煎饼,肉夹馍补充

str:

不可变数据

1.首字母大写:

name = "alex"name1 = name.capitalize()print(name1)

2.每个单词首字母大写:

name = "alex wusir"print(name.title())

3.大小写反转

name = "Alex"print(name.swapcase())

4.居中 -- 填充

name = "alex"print(name.center(20,"-"))

5.查找

从左向右 只查找一个name = "alelx"print(name.find("b"))  #find查找不存在的返回-1 存在返回"0"print(name.index("b")) #index查找不存在的就报错,,存在的返回索引值

6.拼接

name = "al3x"print("_".join(name))  

7.格式化

① %s② f''③ name.format()name = "alex{},{},{}"print(name.format(1,2,3)) 
# 按照顺序位置进行填充name = "alex{2},{0},{1}"print(name.format("a","b","c"))
# 按照索引值进行填充name = "alex{a},{b},{c}"print(name.format(a=1,c=11,b=67)) 
# 按照关键字进行填充

8.字符串的 加 和 乘

开辟新的内存空间
name = "alex"name1 = "wusir"
print(name)print(name1)
print(name + name1) 

is系列

s = "12.3"print(s.isalnum())  
# 判断是不是字母,数字,中文print(s.isalpha())
# 判断是不是字母,中文print(s.isdigit()) 
# 判断字符串是不是全都是阿拉伯数字print(s.isdecimal())  
# 判断是否是十进制

列表

定义

列表--list--容器

有序,可变,支持索引.

列表:存储数据类型很多,字符串,数字, 布尔值,列表,集合,元祖,字典.

定义一个列表:

lst = ["dsb",123,True,"黑哥"]   
# 用逗号分隔的是一个元素获取对象的内存地址(id)print(lst[0])       
# dsbprint(id(lst[0]))    # 2354942210432 lst[0] = "dsb"print(lst)   
# ['dsb', 123, True, '黑哥']s = "alex"     
# 字符串是不可变数据s = "wusir" s[0] = "b"print(s)

列表的增,删,改,查

增加

方法 描述 代码
append() 在列表末尾追加 lis.append(4)
insert() 在列表指定位置插入值 lis.insert(0,0)
extend() 在列表末尾进行迭代添加 lis.extend("456")
lst = ["dsb",123,True,"黑哥"]lst.append("大煎饼") 
# 追加(在列表的最后位置追加一个内容)print(lst)         
# ["dsb",123,True,"黑哥","大煎饼"]lst.insert(2,"wusir")
# 插入  以后尽量不要使用(当数据量比较大的时候会影响效率) 
print(lst)           
# ["dsb",123,"wusir",True,"黑哥"]lst.extend("可迭代的内容") 
#迭代添加print(lst)           # ['dsb', 123, True, '黑哥', '可', '迭', '代',                        '的', '内', '容']

删除

方法 描述 代码
pop() 默认删除最后一个,可以通过下标指定删除 lis.pop(1)
remove() 通过元素的名字进行删除 lis.remove(2)
del 通过索引、切片、步长删除 del lis[::2]
clear() 清空列表 lis.clear()
lst = ["dsb",123,True,"黑哥"]lst.pop()   
# 弹--默认删除最后一个print(lst)   
# ['dsb', 123, True]lst.pop(2) 
# 通过指定索引进行删除print(lst)  
# ["dsb",123,"黑哥"]#通过pop删除,有返回值返回的是被删除的元素#lst = ["dsb",123,"dsb",True,"黑哥"]lst.remove("dsb")  
# 移除 -- 通过元素名字进行删除print(lst)      
# [123,"dsb",True,"黑哥"] del lst[0]      
# 通过索引删除print(lst)       
# [123,True,"黑哥"]del lst[0:3]      
# 通过切片删除print(lst)       
# ["黑哥"]del lst[0:3:2] 
# 通过步长删除print(lst)       
# [123, '黑哥']lst.clear()       
# 清空print(lst)    
# []

改

方法 描述 代码
= 通过索引、切片、步长进行修改 lis[::2] = "2","2"
lst = [123,"dsb",True,"黑哥"]lst[1] = "123"       
# 通过索引改变print(lst)      
# [123, '123', True, '黑哥']lst[1:2] = "12345"   
# 通过切片改变,且此方法改变结果为迭代方式print(lst)              
# [123, '1', '2', '3', '4', '5', True, '黑                           哥']                   lst[1:4] = 12,13,14,15  # 通过切片改变,但此方法不迭代print(lst)           
# [123, 12, 13, 14, 15]# 切片改变列表,元素可以超出切片的位数lst[1:4:2] = "12"/1,2   
# 通过步长改变,步长不为1的必须一一对应,多一个也不行,少一个也不行print(lst)         
# [123, '1', True, '2']

查

方法 描述 代码
for 遍历查询 for i in lst1:
lis[0:6:2] 通过索引、切片、步长进行查找 lis[0:6:2]
for 循环lst = ["dsb",123,"dsb",True,"黑哥"]for i in lst:    print(i)            # dsb                          123                          dsb                          True                          黑哥

列表的嵌套

lst = [1,"alex","春生","小东北","渣弟",["大黑哥",["常鑫",["自行车"],"大煎饼","掉井盖","三金"],"冯强","海峰",["太白金星","女神","吴超",["肖锋"]]]]用索引的方式找到"自行车"print(lst[-1][1][1][0])     
# "自行车"a = lst[-1][-1][-2]print(a)               
# 吴超# 不管什么类型,进行切片的时候获取到的都是原数据类型
# 取值通过索引进行取值,一层一层的进行查找
 

list

1.定义方式

lst = [1,"alex","春生","小东北","渣弟",["大黑哥",["常鑫",["自行车"],"大煎饼","掉井盖","三金"],"冯强","海峰",["太白金星","女神","吴超",["肖锋"]]]]用索引的方式找到"自行车"print(lst[-1][1][1][0])    
# "自行车"a = lst[-1][-1][-2]print(a)            
# 吴超# 不管什么类型,进行切片的时候获取到的都是原数据类型# 取值通过索引进行取值,一层一层的进行查找

2.其他方法

2.1 排序 (默认升序)
lst = [1,2,23,234,435,36,23,213421,421,4231,534,65]
lst.sort() 
print(lst)lst = ["你好","我好"]
lst.sort() 
print(lst)
2.2 反转
lst = [1,2,3,4453,5,6,7]print(lst[::-1])
lst.reverse()   
print(lst)lst =[1,2,3,4,5123,21345,231123,4,1235,234,123]lst.sort()lst.reverse()print(lst)
面试题:
拼接两个列表方式一:
lst.extend(lst1)print(lst)
方式二:
print(lst+lst1)
正题
lst = [1,2,3,4,5]
lst1=  lst 
* 5new_lst = lst 
* 5print(new_lst[0] is new_lst[-5])     
# True扩展lst = [[]]new_lst = lst
* 5new_lst[0].append(10)print(new_lst)
# [[10], [10], [10], [10], [10]]lst = [1,[]]new_lst = lst
* 5new_lst[0] = 10print(new_lst)
# [10, [], 1, [], 1, [], 1, [], 1, []]lst = [1,[]]new_lst = lst * 5new_lst[1] = 10print(new_lst)
# [1, 10, 1, [], 1, [], 1, [], 1, []]lst = [[]]new_lst = lst
* 5new_lst[0].append(10)print(new_lst)
# [[10], [10], [10], [10], [10]] 

元组

定义

元组 -- tuple

有序,不可变,支持索引

只能索引查看和for查看,不能进行增删改

元组用于存储一些比较重要的信息

元组在配置文件中会使用

元组就是不可变的列表

定义一个元组:

tu = (1,"alex",True,"大黑哥",[1,2,3])l
st = [1,"alex",True,"大黑哥",[1,2,3]]print(tu)            
# (1, 'alex', True, '大黑哥', [1, 2, 3])
tu = (1,"alex",True,"大黑哥",[1,2,3])
print(tu[0:6])      
# (1, 'alex', True, '大黑哥', [1, 2, 3])
for 循环
for i in tu:   
	print(i)         
# 1                       alex                         True                       大黑哥                       [1, 2, 3]

tuple

tu = ("12")     
# 数据类型是( )中数据本身print(type(tu))# <class 'str'>tu = (1,)       
# (1,) 是元组print(type(tu))  
# <class 'tuple'>元组 加 乘 不可变共用,可变也共用
 

range

定义

range -- 范围

print(list(range(0,10)))      # 顾头不顾尾

python2 和 python3 中的区别

Python3 中的 range 是一个可迭代对象,写的是怎样打印的时候就是怎样

Python2 中的 range 返回的是一个列表

range的使用

print(list(range(0,10,1)))     
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]                              
# 步长不写得时候默认为1  [0:10:1]print(list(range(10,-2,-1)))  
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1,                                    0, -1]                             
# 步长不写得时候默认为1  [10:-2:-1]print(list(range(10)))         # 步长不写得时候默认为1  [:10]

使用for循环和range

打印 
100 - 1for i in range (100,0,-1):    
	print(i)
打印 1 - 100的所有奇数
for i in range(1,101,2): 
	print(i)    打印
1 - 100的所有偶数
for i in range(2,101,2):   
	print(i)    
打印 1 - 100的所有被6整除的数
for i in range(6,101,6):  
	print(i)    
让用户输入姓名,并在第三次输入后停止输入,打印出所有输入的名字.使用
while 循环
lst = []flage = Truewhile flage:   
name = input("请输姓名:") 
# 请输姓名:agag    lst.append(name)        
# 请输姓名:garag    if len(lst) == 3:         
# 请输姓名:garg        flage = False         
# ['agag', 'garag', 'garg']print(lst)  使用 for 循环和rangelst = []for i in range(3):    lst.append(input("请输入姓名:"))print(lst)
# 请输入姓名:sssht
# 请输入姓名:shtst
# 请输入姓名:hst
# ['sssht', 'shtst', 'hst']

字典

定义

字典 -- dict

字典是无序的,可变的数据类型

字典:用于存储数据,存储大量数据,字典要比列表快,将数据和数据之间进行关联

定义一个字典:

dic = {"常鑫":10,"李文虎":80,"张宇":100}字典中逗号分隔叫做一个元素"常鑫"(键):10(值) -- 键值对dic = {"常鑫":10,"李文虎":80,"张宇":100,10:"大黑哥",True:123,(1,2,3):"大煎饼",[1,2]:"meet"}print(dic)          
#报错 列表字典集合可变不能为"键"

字典的键:

可哈希的 --- 不可变的数据类型 --- 避免哈希冲突使用了 开放寻址法

不可哈希的 --- 可变的数据类型

要求唯一 --- 如果有重复的后边值的将前面的值覆盖

字典的值:

可以任意

字典的增,删,改,查

增:

方法 描述 代码
强制添加 如果所添加的键已存在字典中则会将其的值替换 dic["1"] = 1
 1.dic = {"常鑫":10,"李文虎":80,"张宇":100}dic["李文虎"] = 89   
 print(dic)     
 # dic = {"常鑫":10,"李文虎":89,"张宇":100} 
 # 暴力添加 2.dic = {"常鑫":10,"李文虎":80,"张宇":100}dic.setdefault("大黑哥",50)      print(dic) 
 # {'常鑫': 10, '李文虎': 80, '张宇': 100, '大黑哥': 50}
 # "大黑哥"这个键去字典查询,没有就添加,有就不执行添加.

删除:

方法 描述 代码
del 删除指定键的值,如果未指定键则会删除整个字典 del dic["1"]
pop() 删除指定键的值 dic.pop("1")
clear() 清空字典 dic.clear()
popitem() 随机删除返回被删除键值对(python3.6默认删除最后一个)
 1.dic = {"常鑫":10,"李文虎":80,"张宇":100}del dic["常鑫"]prin(dic)     
 # {'李文虎': 80, '张宇': 100}# 通过字典的键删除键值对 
 2.dic = {"常鑫":10,"李文虎":80,"张宇":100}print(dic.pop("常鑫"))     
 # 10print(dic)                    
 # {'李文虎': 80, '张宇': 100}
 # 通过字典的键进行删除键值对 返回值:返回的是删除的值 
 3.dic = {"常鑫":10,"李文虎":80,"张宇":100}
 dic.clear()
 print(dic)    
 #{}# 清空

改:

方法 描述 代码
强制修改 如果所添加的键已存在字典中则会将其的值替换 dic["1"] = 1
update() 将指定字典更新入远的字典,如果指定字典的键与原字典相同则替换值,如果不同则进行添加 dic.update(dic2)
 1.dic = {"常鑫":10,"李文虎":80,"张宇":100}
 dic["常鑫"] = "dsb"print(dic)            
 # {'常鑫': 'dsb', '李文虎': 80, '张宇': 100}
 # 字典中没有某个键值对的时候就是添加,当键在字典中存在的时候就是修改
 # 有则改,无则加 
 2.dic = {"常鑫":10,"李文虎":80,"张宇":100}
 dic.update({"常鑫":50,"张宇":30})print(dic)      
 # {'常鑫': 50, '李文虎': 80, '张宇': 30}
 # update括号中的字典级别高于update前面的字典

查:

方法 描述 代码
for 通过for遍历字典的键 for i in dic:
get() 使用键查询对应的值,如果存在返回值,否则返回None,可以指定返回值 dic.get("1",1)
键查询 通过键查询其值,如果存在返回值,否则会提示错误 dic["1"]
setdefaule() 如果查询的键存在返回对应的值,键不存在时进行添加,值为设置的默认值。 a.setdefault(3,"222")

1.dic = {"常鑫":10,"李文虎":80,"张宇":100}for i in dic:    print(i) 
# 常鑫    
# 李文虎    # 张宇#循环获取的是字典中每个键值对的键
2.dic = {"常鑫":10,"李文虎":80,"张宇":100}print(dic.get("李文虎"))     
# 80# 通过键获取值,如果将不存在字典中返回Noneprint(dic["ck"])           
# 报错# 通过键获取值,如果将不存在字典中报错 

其他操作

方法 描述 代码
keys() 将字典中所有的键存放在一个高仿列表中 dic.keys()
values() 将字典中所有的值存放在一个高仿列表中 dic.values()
items() 将字典中的所有的键和值以元组的形式存放在一个高仿列表中 dic.items()
1.dic = {"1":3,"5":9,"李文虎":100}
for i in dic:    
	print(i,dic.get(i))             
	# 1 3# 5 9# 李文虎 100
	# 获取字典中所有的键和值
2.dic = {"1":3,"5":9,"李文虎":100}print(dic.keys())      
# dict_keys(['1', '5', '李文虎'])
# 高仿列表 -- dict_keys(['1', '5', '李文虎']) 支持for循环 不支持索引
3.dic = {"1":3,"5":9,"李文虎":100}
for i in dic.keys():    
	print(i)                   # 1                                # 5                                # 李文虎# 获取字典中所有的键 
4.dic = {"1":3,"5":9,"李文虎":100}
lst = []for i in dic:    
	lst.append(dic[i])print(lst)                       
#[3, 9, 100]# 获取字典中所有的值 
5.print(list(dic.values()))       
#[3, 9, 100]# 获取字典中所有的值 
6.dic = {"1":3,"5":9,"李文虎":100}
	print(dic.items())
	# dict_items([('1', 3), ('5', 9), ('李文虎', 100)])
7.dic = {"1":3,"5":9,"李文虎":100}
for i in dic.items():   
	print(i[0],i[1])          
    # 1 3                               # 5 9                               # 李文虎 100

随机删除:

dic = {"key":1,"key2":2,"key3":56}
	print(dic.popitem())       
# 返回的是被删除的键值对(键,值)print(dic)# python3.6 默认删除最后一个(bug)

批量添加:

dic = {}dic.fromkeys("123",[23]) 
# 批量添加键值对{"1":[23],"2":[23],"3":[23]}print(dic)dic = dict.fromkeys("123456789",1)\
# 批量添加键值对"键是可迭代对象",值 -- 会被共用dic["1"] = 18print(dic)
 

解构

a,b = 10,12
print(a)
print(b)                 # 10                           # 12      
a = 10b = 20a,b = b,aprint(a,b)             
# 20 10                         
a,b = [1,2]print(a,b)           
# 1 2a,b = (3,4)print(a,b)           
# 3 4a,_,b = (3,4,5)print(a,b)          
# 3 5  等号后边的值和前面的变量名要一一对应a = 10,12  
print(a)               
# (10,12)  本质就是一个元组
a,b = "23"print(a,b)    
# 2 3a,b = {"1":"a","2":"b"}print(a,b)    
# 1 2 dic = {"1":3,"5":9,"李文虎":100}
for i in dic.items():   
print(i)            
# ('1', 3)                         # ('5', 9)                         # ('李文虎', 100)       
dic = {"1":3,"5":9,"李文虎":100}for k,v in dic.items(): 
print(k,v)        
# 1 3                         # 5 9                         # 李文虎 100                         # 获取每个元素的键和值

集合 -- set

set() -- 空集合{} -- 空字典定义集合:set("alex")  # 迭代添加的

定义集合:

没有值的字典

无序 -- 不支持索引

天然去重

s = {1,"alex",False,(1,2,3),12,1,12,4,6,32,2,4}print(s)

面试题:

lst = [1,2,1,2,4,2,45,3,2,45,2345,]
print(list(set(lst)))s = {1,2,3,4}

集合的增删改查:

1.增:

方法 描述 代码
add() 添加一个值 se.add(1)
update() 迭代添加 se.update("abc")
增:s.add("67")     
# 只能添加一个print(s)s.update("今天")  
# 迭代添加print(s)

2.删

方法 描述 代码
pop() 随机删除,返回的是被删除的值 se.pop()
remove() 指定值删除 se.remove(2)
clear() 清空集合 se.clear()
print(s.pop())
# pop有返回值print(s)s.remove(3)   
# 指定元素删除print(s)s.clear()        
# 清空   -- set() 空集合print(s)

3.改

先删再加

4.查

方法 描述 代码
for 通过for循环遍历集合 for i in se:
for i in {1,2,3}:    print(i)

其他操作:

方法 描述 代码
& 交集 se1&se2
| 并集 se1|se2
- 差集 se1-se2
^ 反交集 se1^se2
> 父集 se1>se2
< 子集 se1<se2
frozenset() 冻结集合 frozenset(se)
s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7,1}print(s1 & s2) 
# 交集 {1, 5, 6, 7}print(s1 | s2)  
# 并集 {1, 2, 3, 4, 5, 6, 7}print(s1 - s2) 
# 差集 {2, 3, 4}print(s1 ^ s2) 
# 反交集     {2, 3, 4}print(s1 > s2)
# 父集(超集) Trueprint(s1 < s2) 
# 子集      Falseprint(frozenset(s1)) 
# 冻结集合 更不常用 
frozenset({1,2,3,4,5,6,7})
dic = {frozenset(s1):1}print(dic)   
#{frozenset({1, 2, 3, 4, 5, 6, 7}): 1}

数据类型之间转换

list  tupletuple liststr转 
list的方法:name = "alex"  
print(name.split())
list转 str的方法:
lst = ["1","2","3"]
print(''.join(lst)

数据类型总结

分类 数据类型
可变 list,dict,set
不可变 int,str,tuple,bool
有序 list,tuple,str,int,bool
无序 dict,set
取值方式
索引 str,list,tuple
直接 set,int,bool
键 dict

python的数据类型

可变:list ,dict ,set
不可变:int bool str tuple
有序:list,tuple,str,int,bool
无序:dict,set取值方式:
索引: str list tuple
直接: set ,int ,bool 
键: dict

以后会遇见的坑

for的死循环

lst = [1,2]for i in lst:   
lst.append(3)print(lst)# 打印不出内容

删除列表的坑

lst = [1,2,3,4]
for i in lst:    
	lst.pop()
	print(lst)
	# [1, 2]

lst = [1,2,3,4]
for i in lst:    
	lst.pop(0)print(lst)
# [3, 4]
lst = [1,2,3,4]
for i in lst:    
	lst.remove(i)
	print(lst)# [2, 4]

成功删除的方式

lst = [1,2,3,4,5]
for i in range(len(lst)):   
	lst.pop()print(lst)
	
lst = [1,2,3,4,5]
for i in range(len(lst)-1,-1,-1):  
	del lst[i]print(lst)
	lst = [1,2,3,4,5]
	
for i in range(len(lst)):    
	del lst[-1]
	print(lst)
	
lst = [1,2,3,4,5]
lst1 = lst.copy()
for i in lst1:   
	lst.remove(i)print(lst)

删除字典的坑

dic = dict.fromkeys("12345",1)
for i in dic:   
	dic.pop(i)
	print(dic)# 报错# 字典的迭代的时候改变了原来的大小(不能加不能删)

正确删除的方式

dic = dict.fromkeys("12345",1)
dic1 = dic.copy()
for i in dic1:    
	dic.pop(i)print(dic)
	# {}# 集合和字典都是迭代的时候不能改变原来的大小

二次编码

密码本:

ascii -- 没有中文

gbk -- 英文 8b(位) 1B(字节) 中文 16b 2B

unicode -- 英文16b 2B 中文32b 4B

utf-8 -- 英文8b 1B 欧洲16b 2B 亚洲24b 3B

name = "你好啊"s1 = name.encode("utf-8")
# 编码 s2 = name.encode("gbk") 
# 编码 s2 = s1.decode("utf-8")
# 解码print(s2.encode("gbk"))

小数据池 -- 缓存机制(驻留机制)

== 判断两边内容是否相等

a = 10b = 10print(a == b)

is 是

a = 10b = 10print(a is b)  is判断基于内存地址进行判断

代码块:

一个文件,一个函数,一个类,一个模块,终端中每一个行是一个代码块

数字:

在同一代码块下 只要内容相同就采用相同的内存地址(-5以后就不是)

数字在做乘法的时候范围 -5 ~ 256

数字在做乘法的时候不能使用浮点数

字符串:

在同一代码块下 只要内容相同就采用相同的内存地址

乘法的时候总长度不能超过20

乘法的时候中文,特殊符号乘以1或0

布尔值:

在同一代码块下 只要内容相同就采用相同的内存地址

小数据池:

数字:

-5 ~ 256

字符串:

在同一代码块下 只要内容相同就采用相同的内存地址

乘法的时候总长度不能超过20

乘法的时候中文,特殊符号乘以0

布尔值:

在同一代码块下 只要内容相同就采用相同的内存地址

小数据池的验证方法,必须脱离代码块才能进行验证

先执行代码块的规则,在执行小数据的规则 --(驻留机制)

必会:

== 判断等号两边的值是否相等

is 判断两边的内存地址是否相等

深浅拷贝 (复制)

面试必问 : 赋值,浅拷贝,深拷贝

赋值

lst = [1,2,3,[5,6,7]]lst1 = lstprint(lst1)     
#[1, 2, 3, [5, 6, 7]]print(lst)               
#[1, 2, 3, [5, 6, 7]]lst[-1].append(8)print(lst1)      
#[1, 2, 3, [5, 6, 7, 8]]print(lst)            
#[1, 2, 3, [5, 6, 7, 8]]

浅拷贝

lst = [1,2,3,[5,6,7]]lst1 = lst.copy()      
# 新开辟一个空间给lst1print(lst[-1])            
# [5, 6, 7]print(lst1[-1])            
# [5, 6, 7]浅拷贝的时候,只会开辟一个新的容器列表,其他元素使用的都是源列表中的元素
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst1[-1].append(8)print(lst)   
#[1, 2, 3, [5, 6, 7, 8]]
print(lst1)       
#[1, 2, 3, [5, 6, 7, 8]]
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst[3] = 567print(lst1)       
#[1, 2, 3, [5, 6, 7]]
print(lst)         
#[1, 2, 3, 567]
lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy() 
lst1.append(10)
print(lst)     
#[1,2,3,4,[5,6,7,[8, 9]]]
print(lst1)     
#[1,2,3,4,[5,6,7,[8,9]],10]
lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()
lst1[-1][-1] = "56"print(lst)       
#[1,2,3,4,[5,6,7,'56']]
print(lst1)              
#[1,2,3,4,[5,6,7,'56']]
lst = [[1,2,],90,6,7,[5,6]]
lst1 = lst.copy()lst1[-1] = 8print(lst)    
#[[1, 2], 90, 6, 7, [5, 6]]print(lst1)           
#[[1, 2], 90, 6, 7, 8]
dic = {"alex":[1,2,3,[5,6]]}
dic1 = dic.copy()dic["alex"][0] = "56"print(dic)  
#{'alex': ['56', 2, 3, [5, 6]]}print(dic1)         
#{'alex': ['56', 2, 3, [5, 6]]}

深拷贝

import copy            
# 导入lst = [1,2,3,[5,6,7]]lst1 = copy.deepcopy(lst)  
# 深拷贝lst[-1].append(8)print(lst)             
# [1, 2, 3, [5, 6, 7, 8]]print(lst1)             
# [1, 2, 3, [5, 6, 7]]
lst = [1,2,3,[5,6,7,[8,10,9]]]
import copylst1 = copy.deepcopy(lst)lst[-1][-1][1] = 5print(lst)   
# [1, 2, 3, [5, 6, 7, [8, 5, 9]]]    
print(lst1)      
# [1, 2, 3, [5, 6, 7, [8, 10, 9]]]

总结:

浅拷贝的时候只拷贝第一层元素

浅拷贝在修改第一层元素(不可变数据类型)的时候,拷贝出来的新列表不进行改变

浅拷贝在替换第一层元素(可变数据类型)的时候,拷贝出来的新列表不进行改变

浅拷贝在修改第一层元素中的元素(第二层)的时候,拷贝出来的新列表进行改变

深拷贝开辟一个容器空间(列表),不可变数据共用,可变数据数据类型(再次开辟一个新的空间),空间里的值是不可变的数据进行共用的,可变的数据类型再次开辟空间

文件操作

创建文件"asdf.txt"

open( )      
# 打开file           
# 文件的位置(路径)mode             
# 操作文件的模式encoding         
# 文件编码方式f               
# 文件句柄f = open("文件的路径(文件放的位置)",mode="操作文件的模式",encoding="文件的编码")     
# 内置函数f(文件句柄)f = open("asdf",mode="r",encoding="utf-8")print(f.read())f.close()

路径:

1.绝对路径 -- C:\user\meet\python24\asdf 2.相对路径

绝对路径方式打开文件 f = open("F:\s24\day08\asdf","r",encoding="utf-8") print(f.read())

相对路径方式打开文件 f = open("../day03/asdf","r",encoding="utf-8") print(f.read()) ../ 返回上一层

f = open(r"C:\user\net\s24\day03\asdf","r",encoding="utf-8")

路径转义: 1."" 2.r"C:\user\net" 推荐使用相对路径 (*****)

s = "[1,'2',3,4]" print(s) print(repr(s)) # repr -- 显示数据原生态 ```

文件操作的模式:

文件打开模式 描述
r 以只读模式打开文件,并将文件指针指向文件头;如果文件不存在会报错
w 以只写模式打开文件,并将文件指针指向文件头;如果文件存在则将其内容清空,如果文件不存在则创建
a 以只追加可写模式打开文件,并将文件指针指向文件尾部;如果文件不存在则创建
r+ 在r的基础上增加了可写功能
w+ 在w的基础上增加了可读功能
a+ 在a的基础上增加了可读功能
b 读写二进制文件(默认是t,表示文本),需要与上面几种模式搭配使用,如ab,wb, ab, ab+(POSIX系统,包括Linux都会忽略该字符)

r,w,a (********)

r: 读文本
方法 描述 代码
read() 读取全部内容 f.read()
read(5) 按照字符读取 f.read(5)
readline() 按照行进行读取(自动换行) f.readline()
readlines() 按照行进行读取,存放在列表中 f.readlines()
for 使用for循环可以解决大文件读取 for i in f:
r操作:
f = open("asdf",mode="r",encoding="utf-8")print(f.read())   
#全部读取print(f.read(5))  
#按照字符进行读取print(f.read())print(f.readline()) 
# 读取一行内容,自动换行print(f.readline()) 
# "常鑫你就是大帅比\n"print(f.readline().strip())
#去除换行符print(f.readlines())
# 一行一行的读取,存放在列表中
解决大文件:
for i in f:   
	print(i) 
	# 本质就是一行一行进行读取
	print(f.readline())
	print(f.readline())
	print(f.readline())
w:清空,写
方法 描述 代码
write() 写入文件 f.write("123")
  w分为两步:       
  1.先清空文件     
  2.写入文件      
  open("xxx","w",encoding="utf-8") 
  # 进行清空       
  write()  
  只能写字符串
a:追加在源文件的基础上进行添加
f = open("../day03/asdf","a",encoding="utf-8")
f.write("138383848\n")f.write("138383850\n") 
w,a 检测有文件就操作,没文件就创建

rb,wb,ab(****)

rb:读字节
方法 描述 代码
read() 全部读取 f.read()
read(5) 按字节读取 f.read(5)
        read()  全部读取     
        read(3) 看文件的前三字节   
        readline 读取一行(自带换行符)      
        readlines() 一行一行读取存放在列表中wb:清空,写
方法 描述
write() 先清空在写入,只能写字节
        open("xxx","wb")  # 进行清空   
        write()  只能写字节ab:追加    
        open("xxx","ab")         
        write()  只能写字节

r+,w+,a+ (r+**)

r+:读写        错误的方式是写读        先读后写      
在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入 或者操作文件的时候都是在结尾进行的操作.w+:清空写,读        
1.清空文件 写入     
2.读取内容(默认读取的是空)a+:追加写,读       
1.先写后读       
2.读取内容(默认读取的是空)      
# 注意点: (a,ab,a+)将光标移动到某个位置进行,写入的时候还是在文件的末尾

其他操作:

光标

方法 描述 代码
tell() 查看光标,返回的是字节 f.tell()
seek(3) 移动光标(根据编码按字节计算) f.seek()
seek(0,0) 移动到文件头部 f.seek(0,0)
seek(0,1) 当前位置 f.seek(0,1)
seek(0,2) 移动文件末尾 f.seek(0,2)

文件修改:

修改文件内容:

1.创建一个新的文件

2.将文件中的内容进行替换

3.替换后的内容写入新文件中

4.改变文件名

示例:
with open("asdf","r",encoding="gbk")as f,\
    open("asdf.txt","w",encoding="gbk")as f1:
    for i in f:
        s1 = i.replace("大烧饼","井盖")
        f1.write(s1)
import os
os.rename("asdf","asdf.bak")
os.rename("asdf.txt","asdf")

with as

with 关键字 open("xxxx","r",encoding="gbk") as f:
  文件操作的具体内容

with open("文件路径","操作模式",编码")as f:
        操作文件

with open的好处:
        1.可以同时打开多个文件
        2.能够自动关闭文件
f = open("文件的路径(文件放的位置)",mode="操作文件的模式",encoding="文件的编码")       # 内置函数
f(文件句柄)
posted @ 2021-02-24 18:16  丨渍丨  阅读(358)  评论(0)    收藏  举报