深度学习和python基础

相关定义

AI:计算机科学下的一个学科,旨在让计算机系统模拟人类的智能从而解决问题和完成任务。
机器学习:AI的一个子集,核心在于不需要人类做显示编程,而是让计算机通过算法自行学习和改进,去识别模式、做出预测和决策
深度学习:机器学习的一个方法,核心在于使用人工神经网络模仿人脑处理信息的方式,通过层次化方法,提取和表示数据的特征。神经网络由许多基本的计算和存储单元组成,就是神经元,神经元通过层层连接来处理数据,有输入层、隐藏层(多层)、输出层。可以用于监督学习、无监督学习、强化学习。(AlexNET,用GPU代替CPU进行AI训练和推理,降低硬件成本)
ps: 在地理上,通过空间深度学习,可以①对影响空间目标的识别,二元分类提取道路、建筑物轮廓,对象提取光伏板对象等,②对时空数据进行挖掘分析,如分析犯罪数据(预测犯罪概率、判断犯罪类型、识别犯罪热点),③进行变化监测

深度学习

  • 1-31 https://www.bilibili.com/video/BV1K94y1Z7wn?p=3&spm_id_from=pageDriver&vd_source=8afdf2d9fefd0cf019fbf34e67125765)

基础知识

解决的问题:如何提取特征
算法:k近临,,,
✔ 前向传播:
在这里插入图片描述
得分任务:
在这里插入图片描述
先随机生成,在迭代过程中哪个w好就用哪个
分类任务:
在这里插入图片描述
ps:
在这里插入图片描述
✔ 反向传播:链式法则
在这里插入图片描述
梯度下降法
✔ 整体架构:
在这里插入图片描述
神经元个数越多(特征越多)分类效果越好
但可能产生过拟合(可以用正则化、dropout消减):
在这里插入图片描述
✔ 激活函数:
在这里插入图片描述
✔ 数据预处理:
训练阶段可以
在这里插入图片描述

卷积神经网络(CNN)

  • 传统应用(计算机视觉):检测任务、分类与检索、超分辨率重构、医学任务、无人驾驶、人脸识别
  • 与传统网络区别:二维到三维,保留空间信息,像素点-图像(乘1是做了灰度处理)
    在这里插入图片描述
  • 整体架构:
    在这里插入图片描述
    在这里插入图片描述
    ✔ 卷积层(卷积核filter和原图选取大小一样,做内积,加偏置项b,得到特征值,特征值组成特征图)
    ps:filter可以有多个,决定有几张特征图
    pps:每次滑动的距离是步长,可以自己设置
    ppps:越边界的点对最终结果影响越小,为了提高边界的利用率,可边缘填充。只能用0填充 +pad1就是加1圈
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ✔ 池化层(起压缩的作用)
    ps:是一个筛选的过程,不涉及矩阵计算,有最大池化(基本上都用这个)、平均池化(淘汰)
    在这里插入图片描述
    ✔ 全连接层(把三维特征图的拉长成一维特征向量)
    ps:带参数的才能称之为一层
    在这里插入图片描述
  • 经典网络:
    Alexnet:12年,8层,问题:卷积核、步长大
    VGG:14年,16/19层,3*3,由于池化损失的信息在下一层中使特征图翻倍弥补回来,问题:训练时间长,16层比30层效果好
    Resnet残差网络(何凯明):同等映射
    在这里插入图片描述
    ps:感受野:由最后的值推测原始数据的窗口大小(越大越好)
    在这里插入图片描述

递归神经网络(RNN)

  • (常用于自然语言处理)可以处理时间序列。会把前一层中间结果保存下来参与下一层运
  • 缺点:误差累积
    ps: LSTM是对RNN的改进,加入参数C控制模型复杂度
  • 自然语言处理-词向量模型-Word2Vec
    ✔ 过程
    分词:jieba
    构建词向量:想快一点用50维,想精确一点用300维
    构建训练数据:
    可以进行滑动
    进行训练:
    在这里插入图片描述
    ps:反向传播不仅要更新权重w,还要更新输入数据
    问题:语料库大的时候计算耗时
    ✔ 不同模型对比 工具包Gensim
    CBOW:输入上下文预测中间词
    在这里插入图片描述
    Skipgram:输入中间词预测上下文
    在这里插入图片描述
    ✔ 问题解决
    初始方案:改 输入一个词预测一个词 为 输入两个词预测相关性 target:1
    但此时训练集构建出来的标签全为1,无法进行较好的训练
    优化方案:加入一些负样本(负采样模型)推荐参数5个
    在这里插入图片描述

python(面向对象解释型程序设计语言)

  • 1-19 https://www.bilibili.com/video/BV11x4y1E7aQ/?p=4&spm_id_from=pageDriver&vd_source=8afdf2d9fefd0cf019fbf34e67125765)
  • 环境配置(python解释器+pycharm IDE)
    win+R 运行窗口 – 输入cmd调出DOS窗口(python编程、cd改变路径、d:D盘、cd…退出当前路径、exit退出cmd)
    系统属性-高级设置-环境变量
    在这里插入图片描述

程序编写

  • 运行方法
    ✔交互模式:(1)IDLE(2)CMD用DOS窗口
    ✔其他:(1)pycharm 项目-文件夹-文件-运行(右键run)(2)新建文本,改后缀为.py,在dos窗口(cd修改路径或加python环境直接拖文件)或pycharm运行
    在这里插入图片描述
    ps:主题字体设置-settings
  • bug、debug、注释、输出
    ✔bug:(1)拼写错误:name error(2)语法错误syntax error:多个print写在一行(3)缩进错误indentation error(4)标点符号错误
    ✔debug:(1)打断点 在代码框左侧点击(2)调试 右键debug、左下角、右上角
    ps:**跳过子函数、往下一步一步查看结果、步入、步出跳出子函数、跳到下一个断点、查看变量信息**
    **重新运行、跳到下一个循环、终止debug、查看断点信息、屏蔽断点**
    ✔注释:(1)单行注释:#(3)多行注释:三对双/三对单
    ps:三引号用在变量定义里用来定义多行字符串的内容
    一次性单行注释ctrl+/
    ✔输出:输出任意个元素,用空格间隔多个对象,以换行结尾,要写入的文件对象,输出是否会被缓存
  • 变量、数值类型、字符串、格式化输出
    ✔变量的定义:变量 = 值(包含变量名称、变量保存的数据、存储的数据类型、变量地址)
    在这里插入图片描述
    ps:=是赋值、==才是等于
    标识符(自己命名的变量名):在这里插入图片描述
    关键字:
    在这里插入图片描述
    ✔数值类型
    在这里插入图片描述
    在这里插入图片描述
    ps:指数形式3.1E5是3.1乘以10的5次,输出为浮点型 可使用type查看
    在这里插入图片描述
    pps:数据类型(1)Number数值类型(2)String字符串(3)list列表(4)元组(5)集合(6)字典
    ✔字符串
    在这里插入图片描述
    单双引号都可以
    三引号用在变量定义里用来定义多行字符串的内容
    在这里插入图片描述
    字符串内部使用单或双引号,使用转义符
    在这里插入图片描述
    在这里插入图片描述
    ✔格式化输出:定义模板照模板输出 【蛇蛇文件test】
    (1)模板 % 变量名
    在这里插入图片描述
    (2)format()
    不带编号,即{}
    带数字编号,可调换顺序,即{1} {2}
    设置参数
    在这里插入图片描述
    (3)f’{表达式}’ # 不需要考虑数据类型
    在这里插入图片描述
    在这里插入图片描述
  • 转义字符、算数运算符、输入
    ✔转义字符
    \n 换行 print默认自带换行符
    \t 制表符,一个tab键(4个空格)的距离 用于排版
    \ 反斜杠
    ’ 单引号 字符串内用引号需要转义
    ✔算数运算符
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ps:eval返回的是值
    ✔输入input()
    一般存储到变量方便使用
    输入的数据当做字符串处理,但可以做类型转换
  • if判断、比较运算符、逻辑运算符、三元表达式
    ✔if判断
    true和false界定:1.任何非零和非空对象都为真,解释为true 2.数字0、空对象、none对象都为假,解释为false 3.判断的返回值为true或false
    ps:要大写!!!!记得if和else后面的冒号
    ✔比较运算符
    在这里插入图片描述
    ✔if、elif、else组合
    满足多个条件时只会执行第一个
    同层级的if和else同缩进
    ✔if嵌套
    在这里插入图片描述
    这布尔咋输入?????
    ✔逻辑运算符
    在这里插入图片描述
    在这里插入图片描述
    ps:判断true的时候不用写==1
    ✔三元表达式 是if判断的另一种写法
# 猜拳题答案
import random    # 引用库写在最前面
ni = int(input('你要输入的拳是(石头0、剪刀1、布2):'))    # 变量的命名简单易懂
com = random.randint(0,2)    # 注意random的使用
print (f'电脑的出拳是{com}')     # f‘{}’的格式化输出你忘了?
if (ni==0 and com==1) or (ni==1 and com==2) or (ni==2 and com==0):  # 逻辑判断符的应用,为了看清楚可以加括号
    print('你赢了')
elif ni==com:
    print('平局')
else:
    print('电脑赢了')
# random扩展
import random
com = random.choice(['剪刀','石头','布'])    # 用[]括起来,用于传递一个list
print (f'电脑的出拳是{com}')
  • 程序的三大流程、while循环、for循环、break和continue
    ✔三大流程(顺序、分支、循环)
    ✔while循环
i = 1
while i<=10:
    print('i love you!')
    i+=1
# 1-100累加
a = 1
sum =0
while a<=100:
    b=a+1
    sum=sum+a+b
    a+=2
print(sum)
## 答案
a = 1
sum = 0
while a<=100:
    sum=sum+a
    a += 1
print(f'1-100的累计和为:{sum}')
#1-100偶数累加
a = 2
sum = 0
while a<=100:
    b=a+2
    sum=sum+a+b
    a+=4
print(sum)
## 答案1
a = 1
sum = 0
while a<=100:
    if a % 2 ==0:  #判断是否为偶数
        sum =sum+a
    a += 1
print(f'1-100的偶数累计和为:{sum}')
## 答案2 只判断5次,更好
a = 2
sum = 0
while a<=100:
    sum =sum+a
    a += 2
print(f'1-100的偶数累计和为:{sum}')
#一天说3遍说3天
day =0
while day<3:
    say = 0
    while say<3:
        print('好好学习天天向上')
        say = say+1
    day=day+1
    print('再坚持一分钟')
    print('*******学不了一点*******')
# 打印星星
i=0
while i<=5:
    print((' * ')*i)
    i+=1
## 法二 循环嵌套
row =1
while row <=5:
    col = 1
    while col<=row:
        print('*',end=' ')
        col+=1
    print()        # 手动换行
    row+=1 
# 打印乘法表
row =1
while row <=9:
    col = 1
    while col<=row:
        # 格式化输出,法一 %:
        # print('%d*%d =%d' %(col,row,row*col),end='\t')
        # 法二
        # print(f'{col}*{row}={col*row}',end='\t')
        # 法三
        print('{}*{}={}'.format(col,row,col*row),end='\t')       # 中间是点点
        col+=1
    print()        # 手动换行
    row+=1  

✔for循环
在这里插入图片描述
可迭代对象:能通过for循环一个个把数取出来的对象
range()函数:左闭右开,可创建一个整数列表,一般用在for循环中
range(start,end,step)
start默认从0开始
step默认为1

# 1-100求和
sum = 0
for i in range(1,101):
    sum = sum + i
print(f'求和结果是{sum}')

# 打印乘法表
for row in range(1,10):
    for col in range(1,row+1):
        print(f'{col}*{row}={col*row}',end='\t')
    print()

✔break和continue 只能在循环体内部使用
在这里插入图片描述
ps:break跳出的是当前循环,continue结束的是当前循环的本轮循环

# break
## while
a = 0
while a<5:
    a+=1
    if a==3:
        break
    print(a)
else:
    print('结束')         # while和else可以配对使用
## for
for i in range(3):
    print(i)
    break
## 嵌套循环
for i in range(5):
    print('haha')
    for i in range(3):
        if i == 2:
            break
        else:
            print(i)
# continue
## while
a = 0
while a<5:
    a+=1
    if a==3:
        continue
    print(a)
else:
    print('结束')         # 不输出3
## for
for i in range(5):
    if i== 3:
    	continue
    print(i)
  • 字符串、字符串常见操作
    ✔字符串
    字符编码:本质是二进制数据与语言文字的一一对应关系。字符–翻译–二进制
    ASCII编码 英文 单字节
    GBK 中文 双字节
    unicode 兼容万国语言
    utf-8 对不同的字符用不同的长度表示 中文用3个字节
    ✔编码和解码
# 编码 encode:字符转换为字节流
a = 'hello'
print(type(a))
al = a.encode()   # 给a编码
print(al)
print(type(al))

b = b'hello'      # 在字符串前面加b就是字节码的形式
print(b)
print(type(b))
# 解码  decode:字节流转换为字符
a1 = b'hello'
a2 = a1.decode()    # 还原成字符串
print(a2)

✔下标/索引、切片
下标/索引:左闭右开

# 通过索引取值 正数从0开始,倒数从-1开始
name = 'abcde'
print(name[0])    #a
print(name[1])    #b   !从5开始就报错

name2 = 'abcdsssfghjktrrdytyere'
print(name2[-1])  #e

切片:[起始:结束:步长]

name = 'class_name_hahah'
a= name[6]
b= name[7]
c= name[8]
d= name[9]
print(a+b+c+d)   # 逐个取然后拼接name 麻烦

print(name[6:10:1])
print(name[6:10:2])
print(name[:])     # 没有限制就是取到所有
print(name[-1:3:-1])  # 倒序输出

ps:切片超出范围不报错,截止到最后一位
pps:方向和步长要一致,否则输出为空白
✔字符串常见操作
find
(1)find() 字符串序列.find(str,开始下标,结束下标)
检测子串str是否包含在原字符串内,如果在返回第一次找到的索引值,否则返回-1

a = 'hello world'
print(a.find('h'))    #0
print(a.find('hello'))    #0
print(a.find('hello',1,5))     #-1

(2)index() 字符串序列.index(str,开始下标,结束下标)
与find语法一样,但找不到会报错

a = 'hello world'
print(a.index('hello',1,5))     #报错

(3)count() 字符串序列.count(str,开始下标,结束下标)
查找子串在原串出现次数

mystr = 'hello world'
print(mystr.count('l'))     #3
print(mystr.count('l',3))   #2

修改:
(4)replace() 字符串序列.replace(旧子串,新子串,替换次数)

mystr = 'hello world'
print(mystr.replace('l','a'))
print(mystr.replace('l','a',2))

(5)split() 字符串序列.split(用什么切,切的次数)

mystr = 'hello world'
print(mystr.split('l',3))    #['he', '', 'o wor', 'd']
print(mystr.split(' ',3))    #['hello', 'world']

其他修改方式:
在这里插入图片描述

(6)capitalize()

mystr = 'hello world'
print(mystr.capitalize())   #第一个字母变成大写

(7)lower()

mystr = 'HELLO'
print(mystr.lower())        #所有变成小写

(8)upper()

mystr = 'hello'
print(mystr.upper())        #所有变成大写

(9)title()

mystr = 'hello world'
print(mystr.title())        #首字母大写

判断:
(10)islower()
检测字符串是否都有由小写字母组成(True/False)

mystr = 'hello world'
print(mystr.islower())     #True

(11)isupper() 是否大写

mystr = 'hello world'
print(mystr.isupper())       #False

(12)isdigit() 是否数字

j =0
mystr = 'hello123'
for i in mystr:
    if i.isdigit():
        j+=1
print(j)           #3 有几个数字

(13)startswith() 是否以什么开头

mystr = 'hello123'
print(mystr.startswith('h'))     #True

(14)endswith() 是否以什么结尾

mystr = 'hello123'
print(mystr.endswith('3'))       #True

增:
(15)+

name = 'six'
name2 = 'xinxin'
info = name+name2
print(info)      #sixxinxin

(16)join

a = 'hello'
print('*'.join(a))   #h*e*l*l*o   每一个字符后加*

删:
(17)lstrip

a = ' hello'
print(a)
print(a.lstrip('h'))    #删除左边的h 结果没变化说明只能删最左边的东西
print(a.lstrip())       #删除左边的空白

(18)rstrip 删除右边的空白
(19)strip 删除两边的空白

a ='\n\t itcast \t\n'
print(a)                #	 itcast
print(a.strip())        #itcast        !删的不是换行符

✔列表 是有序的集合,可以一次性存储多个数据,元素可是不同类型

name ='TOM'
li = ['a','b','c']   #用中括号包围所有元素,每个元素用逗号隔开
list =[1,1.5,'a','b',]
print(li[0])
print(li[-1])
#循环读取
##for
for i in li:        #可迭代对象,可通过for in方式把元素一个个取出来
    print(i)
##while
li_len = len(li)    # len求列表元素个数
i=0
while i < li_len:
    print(li[i])    # 通过下标取值
    i +=1

相关操作
在这里插入图片描述
(1)增

#(1 +
language = ['python','c++','java']
birthday = [1991,1998,1995]
info = language+birthday
print(info)
#(2 insert    在索引前插入obj元素   listname.insert(indedx,obj)  列表名称.插入(索引,插入元素)
## 插入元素
l = ['python','c++','java']
l.insert(1,1998)
print(l)
## 插入元组       把元组当做整体插入,元组的访问比列表快
l = ['python','c++','java']
t = ('c#','go')
l.insert(2,t)
print(l)
#(3 append()  在末尾追加obj元素     listname.append(obj)
## 插入元素
l = ['python','c++','java']
l.append(1998)
print(l)
# 插入元组
l = ['python','c++','java']
t = ('c#','go')
l.append(t)
print(l)
#(4 extend()   在列表末尾添加obj,并且把obj中的元素拆分     listname.extend()
l = ['python','c++','java']
t = ('c#','go')
l.extend(t)
print(l)

(2)修改 本质是赋值

# (1 修改单个元素
nums=[1,4,3,6,10,5,8]
nums[2] = -10     # 通过下标访问指定元素并赋新值
print(nums)
# (2 修改一组元素
nums=[1,4,3,6,10,5,8]
nums[2:5] =[10,20,30]     # 通过下标访问指定元素并赋新值
print(nums)
# (3 特殊情况:对空切片赋值,对应下标前插入所有元素
nums=[1,4,3,6,10,5,8]
print(nums[4:4])
nums[4:4]=[-1,-2,-3]    #从下标为4的位置插入所有元素
print(nums)   # [1, 4, 3, 6, -1, -2, -3, 10, 5, 8]
# (4 间隔修改
nums=[1,4,3,6,10,5,8]
nums[1:6:2]=[-2,-2,-2]
print(nums)   # [1, -2, 3, -2, 10, -2, 8]

(3)删

#(1 del 删除整个列表   del listname
s = list('hello')   # 把字符串转换成列表
print(s)
del s
print(s)     # 删除整个列表,name 's' is not defined
#(2 del 删除单个值     del listname[index]
nums=[1,4,3,6,10,5,8]
del nums[0]
print(f'nums={nums}')
#(3 del 删除多个值
nums=[1,4,3,6,10,5,8]
del nums[2:5]
print(f'nums={nums}')
#(4 pop()      listname.pop(index)  不写index默认删除最后一个元素
nums=[1,4,3,6,10,5,8]
nums.pop(3)
print(f'nums={nums}')
nums.pop()
print(f'nums={nums}')
#(5 remove()   值进行删除,无则报错;有相同值默认删除第一个
nums=[1,4,3,6,10,5,8]
nums.remove(3)
print(f'nums={nums}')
#(6 clear()   删除列表所有元素
nums=[1,4,3,6,10,5,8]
nums.clear()
print(f'nums={nums}')
#小结:根据位置索引删除,用del或pop;根据值删除,用remove;删除整个列表元素,用clear

(4)查

#(1 in/not in
list =['tom','xie','xin']
name =input('需要查找的名字是:')
if name in list:
    print('找到了')
else:
    print('找到了空气')
#(2 count()    listname.count(obj) obj是要统计的元素,返回值为0代表不存在
nums =[1,2,3,2,4,5,2]
print(nums.count(2))
if nums.count(100):     # count次数为0,0代表false,则执行false里的语句
    print('100在列表里')
else:
    print('100不在列表里')
#(3 index()    listname.index(obj,star,end) 查找某个元素在列表中出现的位置
nums =[1,2,3,2,4,5,2]
print(nums.index(2))

(5)排序

#(1 reverse()  把原列表顺序倒置
nums =[1,2,3,2,4,5,2]
print('原列表:',nums)
nums.reverse()
print('倒置后:',nums)
#(2 sort()  默认从小到大排序
nums =[1,2,3,2,4,5,2]
nums.sort()
print(nums)
nums.sort(reverse=True) #从大到小
print(nums)
print(nums.sort())   # sort对原表进行修改,就地排序无返回值,和赋值打印一起使用,结果会返回Nine
#拓展:sort只应用于list的方法,sorted()是内建函数不仅局限于列表的操作
nums =[1,2,3,2,4,5,2]
b = sorted(nums)
print(b)
print(nums)    # sorted默认从小到大排序,不对原列表进行修改
print(sorted(nums))

(6)列表推导式 [表达式 for 变量 in 列表] [表达式 for 变量 in 列表 if 条件]

li = [1,2,3,4,5,6,7,8,9]
print([i*2 for i in li])    # i的取值来自列表li
   # for循环
li = [1,2,3,4,5,6,7,8,9]
li2=[]
for i in li:                # i的取值来自列表li
    li2.append(i*2)         # 在列表末尾添加元素i*2
print(li2)
   # while循环
li = [1,2,3,4,5,6,7,8,9]
li2=[]
i =0
while i <= len(li):
    if i in li:
        li2.append(i * 2)
    i+=1
print(li2)
  • 元组、字典、集合、公共操作
    ✔ 元组 不能被修改,不支持删除,提高了代码编写的安全性,尽量多使用
    定义:由用逗号隔开,用小括号包围的元素组成,如(1,2,3)
    ps:定义单个元素最后一定要加逗号
tu =(10)             # 与tu =10等效
print(tu)
print(type(tu))      # <class 'int'>要定义为元组必须在最后加逗号
tu1 =(10,)
print(tu1)
print(type(tu1))       # <class 'tuple'>
#可以使用下标操作
num_list =(10,20,30)
print(num_list[0])
#赋值测试是否能修改
num_list[0] = 100
print(num_list)      # TypeError: 'tuple' object does not support item assignment 类型错误:元组类型不支持项赋值
#测试是否能删除
tuplel =('aa','bb','cc','dd')
del tuplel[2]          # 测试删除下标为2的元素
print(tuplel)          # TypeError: 'tuple' object doesn't support item deletion 类型错误:元组对象不支持项删除

相关操作–查找

# 下标
t1 =('aa','bb','cc','dd')
print(t1[0])
# index() 存在返回下标,否则报错
t1 =('aa','bb','cc','dd')
print(t1.index('aa'))    # 0
# count() tuplel.count(obj) obj为要求统计个数的元素对象
t1 =('aa','bb','cc','dd')
print(t1.count('aa'))
# len()   统计元组中所有数据的个数
t1 =('aa','bb','cc','dd')
print(len(t1))
# 拓展:元组“可变”的情况
t2 =(10,20,['aa','bb','cc','dd'],40)
print(t2[2])    # 把列表看做一个整体元素
print(t2[2][1]) # 取列表中元素要有二维思想
t2[2][1] ='xinxin'
print(t2)       # 元组中的列表是可变的

✔ 字典 键值对成对出现,键和值一一映射,绑定,和数据顺序无关,所以不支持下标
定义:dic = {key:value,key:value}
ps:符号为大括号,数据为“键值对”,键值对之间用逗号隔开

li =['TOM','男',20]
print(li[0])
dict2 ={'name':'Tom','age':20,'name':'Lucy'}
print(dict2)      # {'name': 'Lucy', 'age': 20} 有重复键时覆盖写,保持键的唯一性

字典操作

# 改
dict1 ={'name':'Tom','age':20,'gender':'男'}
dict1['name']='xinxin'
print(dict1)
# 增
dict1 ={'name':'Tom','age':20,'gender':'男'}
dict1['id']=110
print(dict1)
对于key,无则添加,有则覆盖
# 删
## del
dict1 ={'name':'Tom','age':20,'gender':'男'}
del dict1['gender']
print(dict1)
## clear()
dict1.clear()
print(dict1)
# 查
## 键
dict2 ={'name':'Tom','age':20,'name':'Lucy'}
print(dict2['name'])
## len()     查看键值对个数
dict1 ={'name':'Tom','age':20,'gender':'男'}
print(len(dict1))
## keys()    查看所有键
dict1 ={'name':'Tom','age':20,'gender':'男'}
print(dict1.keys())         # dict_keys(['name', 'age', 'gender'])
## values()  查看所有值
dict1 ={'name':'Tom','age':20,'gender':'男'}
print(dict1.values())       # dict_values(['Tom', 20, '男'])
## items()   可理解为“项”,查看所有键值对
dict1 ={'name':'Tom','age':20,'gender':'男'}
print(dict1.items())        # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
# 循环遍历
## for ... in
dict1 ={'name':'Tom','age':20,'gender':'男'}
for value in dict1.values():  # 第一个value只代表一个变量,变量名可自定义
    print(value)
for i in dict1.values():
    print(i)
for key in dict1.keys():
    print(key)
for item in dict1.items():
    print(item)
for key,value in dict1.items():
    print(f'{key}={value}')   # 格式化输出

✔ 集合
定义: (1)由用逗号隔开,用大括号包围的元素组成,如s1={10,20,30} type–set
(2)用set(),如s2=set(‘abcdef’) type–set
ps:{}定义的是空字典,只有set()是定义空集合
特性:无序不重复,不支持下标操作
集合操作:

# 增
## add,追加数据是具体某个元素
s1 ={10,20}
s1.add(100)
print(s1)      #{100, 10, 20}
s1.add(10)     #{100, 10, 20},自动去重
## update(),追加的数据必须是可迭代对象(如列表、集合、字典、元组)
s1 ={10,20}
s1.update(100)
print(s1)      #TypeError: 'int' object is not iterable 整形不是可迭代对象
s1 ={10,20}
###加列表
s1.update([100]) #[100]是列表为可迭代对象
print(s1)          #{100, 10, 20}
###加元组
s1.update((22,11))
print(s1)          #{10, 11, 20, 22}
###加集合
s1.update({22,11})
print(s1)          #{20, 22, 10, 11}
###加字典 只添加了key(字典的键值对是一个整体,代表一个元素)
s1.update({22:11})
print(s1)          #{10, 20, 22}
###实例:把x和y合并,并去重 x={'apple','banana','cherry'} y={'google','runoob','apple'}
###(1)
x={'apple','banana','cherry'}
y={'google','runoob','apple'}
x.update(y)
print(x)             #{'banana', 'runoob', 'google', 'cherry', 'apple'}
###(2)
x.add(y)
print(x)             #TypeError: unhashable type: 'set'
# 删
## remove() 删除集合中指定的数据,如果数据不存在则报错
s1 ={10,20}
s1.remove(10)
print(s1)             #{20}
s1.remove(10)
print(s1)             #KeyError: 10
## discard() 丢弃 删除集合中指定的数据,如果数据不存在则报错
s1 ={10,20}
s1.discard(10)
print(s1)               #{20}
## pop() 随机删除集合中某个数据,并返回这个数据
s1={10,20,30,40,50,60}
del_num=s1.pop()
print(del_num)
# 交集 &
a ={1,2,3,4}
b ={3,4,5,6}
se =a&b
print(se)                #{3, 4}
# 并集 |
se =a|b
print(se)                #{1, 2, 3, 4, 5, 6}

✔ 公共操作
在这里插入图片描述

#(1)+ 拼接
#字符串
str1 ='aa'
str2 ='bb'
str3 =str1+str2
print(str3)
#列表
list1 =[1,2]
list2 =[3,4]
list3 =list1+list2
print(list3)
#元组
t1 =(1,2)
t2 =(3,4)
t3 =t1+t2
print(t3)
#(2)* 复制
#列表
list1=['hello']
print(list1*4)
#字符串
print('*'*10)
#(3)in/not in   判断结果是True或False
#列表
list1=['a','b','c','d']
print('a' in list1)

公共方法
在这里插入图片描述

#(1)len()  字符串、列表、元组、集合、字典都适用
##集合
s1={10,20,30}
print(len(s1))
#(2)del    字符串、列表适用
str1='abc'
del str1
print(str1)
#(3)max()/min()   统计学适用
##列表
list1=[10,20,30,40]
print(max(list1))
print(min(list1))
#(4)range()  常与for in循环搭配使用
for i in range(4):
    print(i)
#(5)enumerate()  (下标,数据)一一列出,通常用for来遍历
list1=['a','b','c']
for i in enumerate(list1):
    print(i)

容器类型推导式:用几行表达式创建有规律的列表

# 列表推导式
##用while
list1=[]
i=0
while i <10:
    list1.append(i)
    i+=1
print(list1)
##用for
list1=[]
for i in range(10):
    list1.append(i)
print(list1)
##用列表推导式
list1=[i for i in range(10)]
print(list1)
# 元组推导式
t1=(i for i in range(10))
print(t1)      #返回的是对象地址,需要用tuple转换为元组
print(tuple(t1))
# 字典推导式
dict1={i:i**2 for i in range(1,5)}
print(dict1)
# 集合推导式
list1=[1,1,2]
set1={i**2 for i in list1}
print(set1)       #去重后只剩两个元素{1, 4}
  • 类型转换、深浅拷贝
    ✔类型转换
    python3有6大标准数据类型
    number数字:int,float,bool,complex
    string字符串 str()
    list列表 list()
    tuple元组 tuple()
    set集合 set()
    dictionary字典 dictionary()
    在这里插入图片描述
    类型转换想获取什么类型就用相应函数
#(1)转为字符串
a=5
print(type(a))              #<class 'int'>
b=str(a)
print(b,type(b))            #5 <class 'str'>
#(2)转为元组
list1=[1,2]
print(tuple(list1))         #(1, 2)
print(type(tuple(list1)))   #<class 'tuple'>
#(3)转为列表
t1=(1,2)
print(list(t1))             #[1, 2]
print(type(list(t1)))       #<class 'list'>
#(4)转为字典
a=['a1','a2','a3','a4']
b=['b1','b2','b3']
c=zip(a,b)                  #用zip把两个列表打包绑定,然后转换成字典
print(c)                    #返回的是对象地址
print(dict(c))              #{'a1': 'b1', 'a2': 'b2', 'a3': 'b3'}

✔深浅拷贝
传递引用 地址相同

# 定义变量
a=10
b=10
print(id(a))                #1682112735824
print(id(b))                #1682112735824 a和b的内存地址一样,b没有重复存放10这个数据,而是引用了a的内存地址。即b=10的指针指向了a的地址
#当两个变量数值相同时共用一个存放数值的内存空间。节省内存空间
# 定义列表
a=[1,2,3,4]
print(a,id(a))
b=a
print(b,id(b))              #赋值操作时b引用了a的内存地址,没有数据重复存储

拷贝copy:在内存中开辟一个空间存储相同的值,做备份提高数据安全性 地址不同

import copy
a=[1,2,3,4,5]
a_copy=copy.copy(a)         #复制a的信息
print(a_copy)               #[1, 2, 3, 4, 5]
print(id(a))                #2453361473664
print(id(a_copy))           #2453360855680  内存地址不同,与引用有区别

深浅拷贝
在这里插入图片描述

# 深拷贝:修改原数据不会对复制后数据产生影响
import copy
a=[1,2,3,[4,5,6]]                   #两层的数据列表
a_deepcopy=copy.deepcopy(a)
print(a_deepcopy)                   #[1, 2, 3, [4, 5, 6]]
print(a,id(a))                      #[1, 2, 3, [4, 5, 6]] 2536703572416
print(a_deepcopy,id(a_deepcopy))    #[1, 2, 3, [4, 5, 6]] 2536703570240
##修改原数据a第一层元素的值时,查看a_deepcopy数据的变化---不变
a[2]=100
print(a)                            #[1, 2, 100, [4, 5, 6]]
print(a_deepcopy)                   #[1, 2, 3, [4, 5, 6]]
##修改原数据a第二层元素的值时,查看a_deepcopy数据的变化---不变
a[3][1]=100
print(a)                            #[1, 2, 100, [4, 100, 6]]
print(a_deepcopy)                   #[1, 2, 3, [4, 5, 6]]
# 浅拷贝:数据半共享,复制数据会独立存放,但只拷贝成功到原数据第一层,第二层会随着原数据变
import copy
a=[1,2,3,[4,5,6]]
a_copy=copy.copy(a)
print(a,id(a))                      #[1, 2, 3, [4, 5, 6]] 2011959226880
print(a_copy,id(a_copy))            #[1, 2, 3, [4, 5, 6]] 2011959226496
##修改原数据a第一层元素的值时,查看a_copy数据的变化---不变
a[2]=100
print(a)                            #[1, 2, 100, [4, 5, 6]]
print(a_copy)                       #[1, 2, 3, [4, 5, 6]]
##修改原数据a第二层元素的值时,查看a_copy数据的变化---变
a[3][1]=100
print(a)                            #[1, 2, 100, [4, 100, 6]]
print(a_copy)                       #[1, 2, 3, [4, 100, 6]]
# 小结:
# 深拷贝:完全复制,原数据发生变化,备份数据不会有任何影像---如日常备份
# 浅拷贝:半复制半数据共享,原数据第二层变化,备份数据也会变化---如给一个表链接另一个表,希望一个变的时候另一个也更新,如excel函数的使用
  • 不可变对象、可变对象
    ✔不可变对象:存储空间保存的数据不允许被修改。是针对值(数据内容)来说的,原变量值不变,修改后的新值内容地址会变化
    常见的不可变对象:数值类型、字符串、元组
    意义:代码更安全,尽量多使用
#int
i=73
print(type(i))              #<class 'int'>
print(i)                    #73
print(id(i))                #1663269687920
i+=2
print(i)                    #75
print(id(i))                #1663269687984
#字符串
s1='abc'
print(id(s1))               #1910863295984
s1='abcd'
print(id(s1))               #1910863336048

✔可变对象:存储空间保存的数据允许被修改。内容可变,地址不变
常见的可变对象:列表、字典、集合

#列表
m=[5,9]
print(m)                      #[5, 9]
print(id(m))                  #2549202434432
m+=[6]
print(m)                      #[5, 9, 6]        内容变化
print(id(m))                  #2549202434432    地址不变
#集合
set1={1,2,'123'}
print(set1,type(set1),id(set1)) #{1, 2, '123'} <class 'set'> 2564406193056
set1.add(100)
print(set1,type(set1),id(set1)) #{1, 2, '123', 100} <class 'set'> 2564406193056
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值