Python3学习笔记之-学习基础(第三篇)
Python3学习笔记之-学习基础(第三篇)
文章目录
目录
Python3学习笔记之-学习基础(第三篇)
文章目录
一、循环
1.for循环
2.while循环
3.break,continue
二、dict和set
1.dict-字典
2.set--集合
三、不可变对象
四、补充知识:
一、循环
循环的含义就是让计算机进行重复运算,比如1+2+3+4+5...+10000,如果写表达式就不可能了,那怎么办,那就引入了循环的概念。
1.for循环
一种是for...in循环,依次把list或tuple中的每个元素迭代出来。
names = ['李白', '韩信', '后裔']
for name in names:print(name)
结果:李白韩信后裔
如果我们计算1-100的和怎么办呢,总不能在list里面写入1-100吧,这个时候python提供了一个range()函数,看效果:
list(range(5))
[0, 1, 2, 3, 4]
range括号里放5,就给你输出5个数字,注意从零开始哦。这个时候搭配循环for..in..计算1-100和就简单了。
sum = 0 #首先定义一个和初始值为0
for x in range(101): #range(101)是不是0-100个数字,x从里面一个一个拿出来sum = sum + x # 然后拿一个加一个放到sum里面。
print(sum) #最后输出sum,就是结果哦。
2.while循环
while循环,只要条件满足,就不断循环,条件不满足时退出循环。比如我们要计算100以内所有奇数之和,可以用while循环实现:
sum = 0 #同样初始值还是0
n = 99 #设置变量n的值为99
while n > 0: #while循环,只要n>0就循环sum = sum + n #这条语句实现 0+99+97+95...n = n - 2 #这就是每次把n的值减2,保证是奇数
print(sum) #最后打印结果sum
在循环内部变量n
不断自减,直到变为-1
时,不再满足while条件,循环退出。
3.break,continue
在循环中,break
语句可以提前退出循环。
n = 1
while n <= 100:if n > 10: # 当n = 11时,条件满足,执行break语句break # break语句会结束当前循环print(n)n = n + 1
print('END')
执行上面的代码可以看到,打印出1~10后,紧接着打印END
,程序结束。可见break
的作用是提前结束循环。
continue
语句,跳过当前的这次循环,直接开始下一次循环。
n = 0
while n < 10:n = n + 1if n % 2 == 0: # 如果n是偶数,执行continue语句continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行print(n)
执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。
循环很方便,但是如果写的代码出错,程序进入死循环,Ctrl+c可以退出程序哦。
二、dict和set
1.dict-字典
dict就是使用(key-value)存储的,也就是键值,查询起来快速,举个列子:
#首先定义一个字典,注意格式{'键':'值','键':'值','键':'值'},中括号括起来
a = {'亚索':'哈撒剋','瑞文':'断剑重铸','德莱文':'德莱联盟'}
#现在查询一下
a['亚索']
结果为:哈撒剋
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。
第二种方法是先在字典的索引表里查这个字对应的页码,然后直接翻到该页,找到这个字。
dict就是第二种方法,给定一个名字,比如'亚索'
,dict在内部直接计算出对应的存放“页码”,也就是'哈撒剋'这个存放的内存地址,直接取出来,所以速度非常快。
dict放入数据怎么放,也很简单,a['亚索']=快乐,就能直接存储,多次存储会覆盖前面的值。
#判断key是不存在,不存在就没办法赋值
方法一:
'盲僧' in a
结果:False
方法二:get()方法,如果key不存在,可以返回None,或者自己指定的value:
a.get('盲僧') #返回None的时候Python的交互环境不显示结果。a.get('盲僧',False)
结果:False
为了让大家看清楚,#后的汉字才是python的注释,其他的汉字都是我写的解释哦。
要删除一个key,用pop(key)
方法,对应的value也会从dict中删除:
a.pop('亚索')
结果:['瑞文':'断剑重铸','德莱文':'德莱联盟']
注意:
dict内部存放的顺序和key放入的顺序是没有关系的,dict的key必须是不可变对象
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
知识点:
dict根据key来计算value的存储位置,这个通过key计算位置的算法称为哈希算法(Hash),要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。
2.set--集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
s = set([1, 2, 3])
s
结果:{1, 2, 3}
传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的
重复元素在set中自动被过滤:
s = set([1, 1, 2, 2, 3, 3])
s
结果:{1, 2, 3}
现在来看看增加删除,交集并集:
通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
s.add(4)
s
结果:{1, 2, 3, 4}
通过remove(key)方法可以删除元素:
s.remove(4)
s
结果:{1, 2, 3}
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
s1 & s2
结果:{2, 3}
s1 | s2
结果:{1, 2, 3, 4}
三、不可变对象
上面我们讲了,str是不变对象,而list是可变对象。对于可变对象,比如list,对list进行操作,list内部的内容是会变化的。
a = ['c', 'b', 'a']
a.sort()
a
结果:['a', 'b', 'c']
对于不可变对象,比如str,对str进行操作
a = 'abc'
b = a.replace('a', 'A')
b
结果:'Abc'
a
结果:'abc'
说白了这个replace方法虽然改变了内容,但是并没有改变原始值,知识给她创建了一个新的字符串。
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
四、补充知识:
下面的内容估计也没心思看,字太多了,但是当你静下心来理解,就会收获许多,醍醐灌顶的。
要理解dict的有关内容需要你理解哈希表(map)的相关基础知识,这个其实是《算法与数据结构》里面的内容。
1.list和tuple其实是用链表顺序存储的,也就是前一个元素中存储了下一个元素的位置,这样只要找到第一个元素的位置就可以顺藤摸瓜找到所有元素的位置,所以list的名字其实就是个指针,指向list的第一个元素的位置。list的插入和删除等可以直接用链表的方式进行,比如我要在第1个元素和第2个元素中间插入一个元素,那么直接在链表的最后面(我们假设这个list只有两个元素,那么也就是在第3个元素的位置上)插入这个元素,然后把第一个元素指针指向这个元素(第3个位置),然后再把新插入的元素的指针指向原来的第2个元素,这样插入操作就完成了。读取这个list的时候,先用list的名字(就是个指针,指向第1个元素的位置)找到第一个元素,然后用第1一个元素的指针找到第2个元素(位置3),然后用第2个元素的指针找到第3个元素(位置2),以此类推。所以list的顺序和内存中的实际顺序其实不一定完全对应。这种存储方式不会浪费内存,但查找起来特别费时间,因为要按照链表一个一个找下去,如果你的list特别大的话,那么要等好久才会找到结果。
2.dict则为了快速查找使用了一种特别的方法,哈希表。哈希表采用哈希函数从key计算得到一个数字(哈希函数有个特点:对于不同的key,有很大的概率得到的哈希值也不同),然后直接把value存储到这个数字所对应的地址上,比如key='ABC',value=10,经过哈希函数得到key对应的哈希值为123,那么就申请一个有1000个地址(从0到999)的内存,然后把10存放在地址为123的地方。类似的,对于key='BCD',value=20,得到key的哈希值为234,那么就把20存放在地址为234的地方。对于这样的表查找起来是非常方便的。只要给出key,计算得到哈希值,然后直接到对应的地址去找value就可以了。无论有几个元素,都可以直接找到value,无需遍历整个表。不过虽然dict查找速度快,但内存浪费严重,你看我们只存储了两个元素,都要申请一个长度为1000的内存。
3.现在你知道为啥key要用不可变对象了吧?因为不可变对象是常量,每次的哈希值算出来都是固定的,这样就不会出错。比如key='ABC',value=10,存储地址为123,假设我突发奇想,把key改成'BCD',那么当查找'BCD'的value的时候就会去234的地址找,但那里啥也没有,这就乱套了。
3.你看我们上面有一句话:对于不同的key,有很大的概率得到的哈希值也不同。那么有很小的概率不同的key可以得到相同的哈希值了?没错,比如对于我们的例子来说,哈希值只有3位,那么只要元素个数超过1000,就一定会有至少两个key的哈希值相同(鸽笼原理),这种情况叫“冲突”,设计哈希表的时候要采取办法减少冲突,实在冲突了也要想办法补救。不过这是编译器的事情,况且对于初学者的我们来说碰到的冲突的概率基本等于零,就不用操心了。
Python3学习笔记之-学习基础(第三篇)相关推荐
- 学习笔记-工程图学基础(三)
3.1 平面立体 立体按照其表面构成的不同可分为平面立体和曲面立体. 表面都是由平面围成的立体叫平面立体. 表面由曲面和平面或全是曲面围成的立体叫曲面立体. 投影法中所研究的立体投影是立体表面的投影. ...
- Timo学习笔记 :Python基础教程(第三版)第四章 当索引行不通时
第四章 当索引行不通时 Timo学习笔记 :Python基础教程(第三版)第三章 使用字符串 这是word编辑的最后一章笔记,第五章开始将直接用这个模板记录. 本章笔记很少,也很简单.很多方法可以到要 ...
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- 菜鸟学习笔记:Java基础篇6(数组、字符串)
菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...
- 菜鸟学习笔记:Java基础篇2(变量、运算符、流程控制语句、方法)
菜鸟学习笔记:Java基础篇2 变量 基本概念 变量作用域 final关键字 运算符 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 运算符优先级 Java三种流程控制语句 顺序 ...
- 前端学习笔记(js基础知识)
前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...
- 史上最牛最强的linux学习笔记 10.shell基础
史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...
- 前端学习笔记之CSS3基础语法与盒模型(二)
前端学习笔记之 CSS3基础语法与盒模型 CSS3简介 CSS(cascading style sheet,层叠式样式表)是用来给HTML标签添加样式的语言 CSS3是CSS的最新版本,增加了大量的样 ...
- Stream 流 【学习笔记】Java 基础
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...
最新文章
- 新手求助,关于添加隐式intent程序崩溃问题
- WebService:设置服务器提供SOAP1.2的服务
- QML文档阅读笔记-easing.type解析与实例
- jQuery子页面刷新父页面--局部刷新+整体刷新 [转]
- linux命令 bind,Linux bind命令
- (一)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - 平台导语简介
- exit()与_exit()函数的区别(Linux系统中)
- 学python lesson2
- 3.1_21 JavaSE入门 P20 【正则】Pattern模式类、Matcher匹配器、元字符、分组捕获、反向引用
- 测试开发工程师面试题目
- 鉴源实验室丨TARA分析方法论
- 易康EPS2的使用(一)
- SQL2005到2008数据库升级
- 正则表达式, email格式验证,邮箱地址验证
- 【Python】字符串转换为ASCII码
- STM32 VCP PC端安装驱动失败的问题解决
- weinre安装及使用
- Matlab里怎么注释掉一段(多行)代码
- Android MVVM框架搭建(三)MMKV + Room + RxJava2
- 如何发现「将死」的ReLu?可视化工具TensorBoard助你一臂之力
热门文章
- 皕杰报表图表钻取超链接
- 林达华博士对数学的见解
- win10搜索计算机中所有excel,win10系统无法搜索到word、excel等文件内容的处理技巧...
- JS实现图片轮播效果(自动和手动)
- 《Java程序性能优化》读书笔记
- 2015年:跑步计划
- 【群晖NAS】 利用云服务器 FRP技术 实现内网穿透
- C++ setsockopt() 函数
- 如何关闭电脑自动更新
- 【产业互联网周报】阿里将暂停阿里云美国扩张计划;协同办公领域硝烟又起,华为推WeLink,企业微信与微信打通;申通全面迁至阿里云...