主要内容:
⼀一. 基础数据类型补充
⾸首先关于int和str在之前的学习中已经讲了了80%以上了了. 所以剩下的⾃自⼰己看⼀一看就可以了了.
我们补充给⼀一个字符串串基本操作
li = ["李李嘉诚", "麻花藤", "⻩黄海海峰", "刘嘉玲"]
s = "_".join(li)
print(s)
li = "⻩黄花⼤大闺⼥女女"
s = "_".join(li)
print(s)
列列表:
循环删除列列表中的每⼀一个元素
li = [11, 22, 33, 44]
for e in li:
li.remove(e)
print(li)
结果:
[22, 44]
分析原因:
for的运⾏行行过程. 会有⼀一个指针来记录当前循环的元素是哪⼀一个, ⼀一开始这个指针指向第0
个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第⼀一个的元素会⾃自动的变成
第0个. 然后指针向后移动⼀一次, 指向1元素. 这时原来的1已经变成了了0, 也就不会被删除了了.
⽤用pop删除试试看:
li = [11, 22, 33, 44]
for i in range(0, len(li)):
del li[i]
print(li)
结果: 报错
# i= 0, 1, 2 删除的时候li[0] 被删除之后. 后⾯面⼀一个就变成了了第0个.
# 以此类推. 当i = 2的时候. list中只有⼀一个元素. 但是这个时候删除的是第2个 肯定报错啊
经过分析发现. 循环删除都不⾏行行. 不论是⽤用del还是⽤用remove. 都不能实现. 那么pop呢?
for el in li:
li.pop() # pop也不不⾏行行
print(li)
结果:
[11, 22]
只有这样才是可以的:
for i in range(0, len(li)): # 循环len(li)次, 然后从后往前删除
li.pop()
print(li)
或者. ⽤用另⼀一个列列表来记录你要删除的内容. 然后循环删除
li = [11, 22, 33, 44]
del_li = []
for e in li:
del_li.append(e)
for e in del_li:
li.remove(e)
print(li)
注意: 由于删除元素会导致元素的索引改变, 所以容易易出现问题. 尽量量不要再循环中直接去删
除元素. 可以把要删除的元素添加到另⼀一个集合中然后再批量量删除.

注意: 由于删除元素会导致元素的索引改变, 所以容易易出现问题. 尽量量不要再循环中直接去删
除元素. 可以把要删除的元素添加到另⼀一个集合中然后再批量量删除.
dict中的fromkey(),可以帮我们通过list来创建⼀一个dict
dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
结果:
{'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']}
前⾯面列列表中的每⼀一项都会作为key, 后⾯面列列表中的内容作为value. ⽣生成dict
好了了. 注意:
dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
dic.get("jay").append("胡⼤大")
print(dic)
结果:
{'jay': ['周杰伦', '麻花藤', '胡⼤大'], 'JJ': ['周杰伦', '麻花藤', '胡⼤大']}
代码中只是更更改了了jay那个列列表. 但是由于jay和JJ⽤用的是同⼀一个列列表. 所以. 前⾯面那个改了了. 后
⾯面那个也会跟着改
dict中的元素在迭代过程中是不允许进⾏行行删除的
dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦金金⽼老老板'}
# 删除key中带有'k'的元素
for k in dic:
if 'k' in k:
del dic[k] # dictionary changed size during iteration, 在循环迭
代的时候不不允许进⾏行行删除操作
print(dic)
那怎么办呢? 把要删除的元素暂时先保存在⼀一个list中, 然后循环list, 再删除
dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦金金⽼老老板'}
dic_del_list = []
# 删除key中带有'k'的元素
for k in dic:
if 'k' in k:
dic_del_list.append(k)
for el in dic_del_list:
del dic[el]
print(dic)
类型转换:
元组 => 列列表 list(tuple)
列列表 => 元组 tuple(list)
list=>str str.join(list)
str=>list str.split()
转换成False的数据:
0,'',None,[],(),{},set() ==> False
⼆二. set集合
set集合是python的⼀一个基本数据类型. ⼀一般不是很常⽤用. set中的元素是不重复的.⽆无序的.⾥里里
⾯面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但
是不保存value, 只保存key. set也⽤用{}表⽰示
注意: set集合中的元素必须是可hash的, 但是set本⾝身是不可hash得. set是可变的.
set1 = {'1','alex',2,True,[1,2,3]} # 报错
set2 = {'1','alex',2,True,{1:2}} # 报错
set3 = {'1','alex',2,True,(1,2,[2,3,4])} # 报错
set中的元素是不重复的, 且⽆无序的.
s = {"周杰伦", "周杰伦", "周星星"}
print(s)
结果:
{'周星星', '周杰伦'}
使⽤用这个特性.我们可以使⽤用set来去掉重复
# 给list去重复
lst = [45, 5, "哈哈", 45, '哈哈', 50]
lst = list(set(lst)) # 把list转换成set, 然后再转换回list
print(lst)
set集合增删改查
1. 增加
s = {"刘嘉玲", '关之琳', "王祖贤"}
s.add("郑裕玲")
print(s)
s.add("郑裕玲") # 重复的内容不不会被添加到set集合中
print(s)
s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤") # 迭代更更新
print(s)
s.update(["张曼⽟玉", "李李若彤","李李若彤"])
print(s)
2. 删除
s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟玉", "李李若彤"}
item = s.pop() # 随机弹出⼀一个.
print(s)
print(item)
s.remove("关之琳") # 直接删除元素
# s.remove("⻢马⻁虎疼") # 不不存在这个元素. 删除会报错
print(s)
s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和
dict区分的.
print(s) # set()
3. 修改
# set集合中的数据没有索引. 也没有办法去定位⼀一个元素. 所以没有办法进⾏行行直接修改.
# 我们可以采⽤用先删除后添加的⽅方式来完成修改操作
s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟玉", "李李若彤"}
# 把刘嘉玲改成赵本⼭山
s.remove("刘嘉玲")
s.add("赵本⼭山")
print(s)
4. 查询
# set是⼀一个可迭代对象. 所以可以进⾏行行for循环
for el in s:
print(el)
5. 常⽤用操作
s1 = {"刘能", "赵四", "⽪皮⻓长⼭山"}
s2 = {"刘科⻓长", "冯乡⻓长", "⽪皮⻓长⼭山"}
# 交集
# 两个集合中的共有元素
print(s1 & s2) # {'⽪皮⻓长⼭山'}
print(s1.intersection(s2)) # {'⽪皮⻓长⼭山'}
# 并集
print(s1 | s2) # {'刘科⻓长', '冯乡⻓长', '赵四', '⽪皮⻓长⼭山', '刘能'}
print(s1.union(s2)) # {'刘科⻓长', '冯乡⻓长', '赵四', '⽪皮⻓长⼭山', '刘能'}
# 差集
print(s1 - s2) # {'赵四', '刘能'} 得到第⼀一个中单独存在的
print(s1.difference(s2)) # {'赵四', '刘能'}
# 反交集
print(s1 ^ s2) # 两个集合中单独存在的数据 {'冯乡⻓长', '刘能', '刘科⻓长', '赵四'}
print(s1.symmetric_difference(s2)) # {'冯乡⻓长', '刘能', '刘科⻓长', '赵四'}
s1 = {"刘能", "赵四"}
s2 = {"刘能", "赵四", "⽪皮⻓长⼭山"}
# ⼦子集
print(s1 < s2) # set1是set2的⼦子集吗? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))
set集合本⾝身是可以发⽣生改变的. 是不可hash的. 我们可以使⽤用frozenset来保存数据.
frozenset是不可变的. 也就是⼀一个可哈希的数据类型
s = frozenset(["赵本⼭山", "刘能", "⽪皮⻓长⼭山", "⻓长跪"])
dic = {s:'123'} # 可以正常使⽤用了了
print(dic)
这个不是很常⽤用. 了了解⼀一下就可以了了
三. 深浅拷⻉贝
lst1 = ["⾦金金⽑毛狮王", "紫衫⻰龙王", "⽩白眉鹰王", "⻘青翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
结果:
['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']
['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍']
dic1 = {"id": 123, "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1['name'] = "范瑶"
print(dic1)
print(dic2)
结果:
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '范瑶'}
{'id': 123, 'name': '范瑶'}
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量量. 并不是复制⼀一份内容. 所以.
lst1的内存指向和lst2是⼀一样的. lst1改变了了, lst2也发⽣生了了改变
浅拷⻉贝
lst1 = ["何炅", "杜海海涛","周渝⺠民"]
lst2 = lst1.copy()
lst1.append("李李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
两个lst完全不不⼀一样. 内存地址和内容也不不⼀一样. 发现实现了了内存的拷⻉贝
lst1 = ["何炅", "杜海海涛","周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
4417248328 4417248328
浅拷⻉贝. 只会拷⻉贝第⼀一层. 第⼆二层的内容不会拷⻉贝. 所以被称为浅拷⻉贝
深拷⻉贝
import copy
lst1 = ["何炅", "杜海海涛","周渝⺠民", ["麻花藤", "⻢马芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅', '⽆无敌是多磨寂寞']]
['何炅', '杜海海涛', '周渝⺠民', ['麻花藤', '⻢马芸', '周笔畅']]
4447221448 4447233800
都不⼀一样了了. 深度拷⻉贝. 把元素内部的元素完全进⾏行行拷⻉贝复制. 不会产⽣生⼀一个改变另⼀一个跟着
改变的问题
补充⼀一个知识点:
最后我们来看⼀一个⾯面试题:
a = [1, 2]
a[1] = a
print(a[1])

转载于:https://www.cnblogs.com/chcj/p/9855654.html

Python Day7相关推荐

  1. Python day7之mysql

    写在前面: 由于毕业论文撰写和答辩耽搁了几个月,但是在这几个月没有放弃学习Python,就是没有时间写博客.进行我们主要对数据库mysql的操作指令集的学习. 一.mysql术语 Mysql是最流行的 ...

  2. 小白学Python ——day7

    老师授课内容 day07-实训7 1.模块学习     何为模块?模块就是工具包,工具包里面会有好多的函数,如果想使用模块里面的函数,就需要导入这个模块,通过import导入即可使用     分类: ...

  3. python,day7,并发编程

    目录 并发编程,day1 操作系统发展史 多道技术 进程 程序运行的三种状态 同步与异步,阻塞非阻塞 开启进程的两种方式 join方法 并发编程,day2 进程对象及其他方法 僵尸进程与孤儿进程(了解 ...

  4. 0028. Find the Index of the First Occurrence in a string (leetcode in python day7)

    文章目录 一.列表的切片 二.solution 一.列表的切片 当我们想一次访问列表中的多个元素时,可以使用切片! 切片操作对列表同样是适用的,语法是列表名[m:n],访问的元素从索引 m 开始到索引 ...

  5. Python面向对象基础(上)—Python Day7

    导入 --Python面向对象基础 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 面向对象 ...

  6. 刻意练习Python DAY7

    字典与集合 1.字典是Python唯一的映射集,标志性符号是{} >>> dict1={'李宁':'一切皆有可能','耐克':'just do it','阿迪':'nothing i ...

  7. Python Day7字典与集合

    一字典的应用 字典数据以键值对形式出现,字典数据和数据顺序无关,即不支持下标,无论数据                          顺序如何变化,只需按照对应的键的名字查找数据即可. 二字典的语 ...

  8. python file_python3之File文件方法

    1.读写文件 open()将会返回一个file对象,基本语法: open(filename,mode) filename:是一个包含了访问的文件名称的路径字符串 mode:决定了打开文件的模式:只读, ...

  9. 【Python之旅】第七篇(二):Redis使用基础

    0.说明 由于学习开发监控软件的需要,因此需要使用到Redis,这里简单介绍. 注意,使用的环境为:Ubuntu 15.10 1.安装 可以采用源码安装,也可以采用apt-get来安装,都比较简单. ...

最新文章

  1. python2的input,关于python2.x input函数的安全隐患
  2. C++智能指针:unique_ptr详解
  3. Vue2.0环境安装
  4. 一 ASP.NET Html 表单
  5. Jenkins 设置镜像_docker+jenkins自动化部署
  6. FIO测试磁盘的iops
  7. mysql as用法_Spring Data R2DBC响应式操作MySQL
  8. 自定义类型: 结构体,枚举,联合
  9. 如何禁止使用bottomsheetdialogfragment拖动?
  10. Android自定义滑动进度条,Android自定义View实现圆形水波进度条
  11. 8. Mac brew usage and php version
  12. ArcGIS土地利用转移矩阵(附土地利用数据下载)
  13. 《醉翁亭记》古文鉴赏
  14. AUTOSAR Functional Safety
  15. 精益和敏捷的较量:你知道敏捷开发有 Scrum 和 Kanban 两种管理模式吗?
  16. 你和语言模型,谁的填空能力更强?
  17. 正则匹配某字符前的内容
  18. Python官网安装包下载慢
  19. 解决iPhone无法连接iTunes
  20. 英语caement单词caement水泥

热门文章

  1. 中学生计算机都学什么东西,计算机专业都学什么 初中毕业学计算机有前途吗...
  2. 浅谈数据仓库的基本架构
  3. 自学电子技术的最佳方法
  4. Android移动开发视频之传感器应用开发
  5. win7 自动登录到域
  6. 汽车环视全国产化电子元件推荐方案
  7. 利用TextPad编辑代码的各种技巧
  8. 有向无环词图(DAWG)
  9. 佳能c3320怎么设置接收方_如何佳能ir-adv c3320扫描发送到本地计算机。
  10. RFID射频技术基础