5 数据类型
查看某个变量的类型
类型之间的转换
isinstance()函数 用来比对牟变量的类型,返回值为true 或false
6 常用的操作符
**的用法(有关负号)
not true 返回值 true flase
3<4<5 ==(3<4)<(4<5)
8 了不起的分支和循环![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5b1c6130a9420a2fd6f70453e17234e6.png)
9分支与循环
三种方法应对
elif== else if
方法1比方法2/3都要多消耗一部分时间
悬挂else 在C语言中属于C的自身语法 其和python 通过tab键来强制对其有很大不同(由程序员自己来决定)
当条件为真 x的值给small ,为假的时候y的值给small
assert 6>3 就会直接跳过
for循环
常常搭配for来使用
下文的i的变化 只影响print里的那个i 并不对 for 后面 的 i 造成影响
11列表
列表里面也可以放入列表 其功能之强大
列表相关的添加函数
append 需要在member这个对象的作用域下(用.表示)只能在对象列表的末尾添加一个元素
从0开始 很重要
列表成员的调用和交换
remove 是属于在对象列表范围下的函数 引用 member.remove(‘member 有的成员元素’)
注 remove是属于函数的 后面用( ) 不是[ ]
del 不属于函数 直接删除 某一个成员
注 del member 将会删除member这整个的对象
pop() 属于函数 会有一个删除值得返回 所以可以利用这个来被某变量给定义 默认是从尾开始删除
例如 name = member.pop()
pop 可以跟参数
1:3 1是指开始的位置 3是指结束的位置
3并不被包含 这样就可以分出来一个切片
关于 ; 前后的一些小的技巧
13 常用操作符
比较的是列表最前的两个数 后面的不管了
and 两边都为true的时候 返回值也为true
列表的相加 并联了
但是 + 号两边 必须要同类 要是添加 可以用 insert .
in 和 not in 的返回值。 在列表里
in 好像只能判断一层 和break continue 都一样
换个方法
有点类似二维数组。。
计数list3列表里面 123的数量
index 后面的参数 是指 从3开始到7结束 所找元素的所在位置
reverse() 是列表的内置函数 用来调换列表 元组里面的元素
用dir(list)可以找到所有列表内置函数 其中reverse 表示把所有的元素翻转过来
sort 是把里面的元素按 从小到大的排列 若要从大到小的排呢? 1:先用sort()再用reverse()
sort(reverse = flase) 这是默认的 也就是按从小到大的排 要如果改成sort(reverse = true)
重重重重重要! 关于拷贝
利用[:] 分号拷贝 就是实实在在的多弄了一份出来 而直接用的 = 赋值号 仅仅不过是贴上了一个标签而已
14 元组 (不能改的) tuple
列表的元素可以 任意修改 插入 删除
元组 的元素不行
创建一个访问一个列表
大部分用的是小括号
但是引用的话 还是用的 中括号
无法被修改 和赋值的元组
那元组的区别呢?? 特别体现它的
temp就没有带括号
注意的一点就是 小括号并不是 用来定义是否是元组的标志
而是 逗号 , 除非要创建一个空的元组 直接 temp = ()
加上逗号 就可以判别是否为元组了 甚至 temp = 1 , 也同样可以
就比较坑的地方
更新和删除一个元组
注意!! 逗号必须在’ 怡景’的后面! 否则报错
另外(:)用的是两个点!
del temp 会删除 实际上删除的是这个标签 一般python拥有自动的功能
15 字符串 各种奇葩的内置方法
拼接 只是换了一个标签 str1 还是之前那个不变 类似元组的元素添加
16 字符串的格式化(重重重重重重!)
其实最后打印出来的是按" " 里面来的,format 更多是提供了一个对照放标
{0}的位置只能在前面 不能往后面放 因为它会默认 已经引领了一次默认的参数了
为什么会造成这样的现象呢?? 因为其中的参数0已经被解释掉了 用 {0} 作为前文中的 0
f 为定点数 注意到 {0:.f} 这个格式
多个参数尽量用元组来实现 , 同时%c 前后的空格 也被打印出来了
实际上就是 通过% 替代到 %s 里面去 合成一句
和C语言不同的是 C语言使用 “”和,来隔开 从而实现格式化的 但是python 两边甚至都不用加括号 只需要一个% 就可以了
转换进制
16 序列 序列 序列 (元组 列表 字符串 的总称)
max() min() 是返回参数 和序列中 最大 最小
要同类型 才可以比较大小
sum函数的两个 返回值用法
搞清楚 他俩和 列表内置函数的区别 ,在于他们的 -ed sorted(members) 和 members.sort()
reversed 返回的是一个对象
enumerate也是返回的一个对象 枚举类型 逗号之前那个数字更像是一个在里面的排列
Zip() 成对的打包成 元组
18 python的乐高积木
用def ***(): 来创建一个函数 定义他
一定要有 小括号 加 : 冒号
引用该函数的时候 直接输入 ***() 就好了 属于引用 然后 程序往 上面找函数 然后执行
使参数个性化的方法 name 这个参数就开始变得可变 可以写入 小鱿鱼也行…
函数的参数 都可以直接来决定 用逗号分隔开来 但是一般 3-4个就差不多了
函数的意思 要写好相应的 注释
但是函数究竟有没有达到效果 或者运行呢 可以调用 return()函数来做一个返回值
直接像 num1 + num2 就作为了return的返回值啦
P19 函数的强大
形参其实就是变量 它可以变 形参就是常数 虽然可以变 但是对于每次传值而言 就是固定的值
myfirstfunction.doc 是用来调用函数中的文本 doc不就是文本的意思吗
就算是错了顺序,可以在里面进行定义,那么在参数多的时候 就会减去很多麻烦
这里 name= ,words = 属于默认参数。在函数定义的时候给形参赋初值
但是再调用函数的时候一样可以 给实参 来代替默认数值
收集参数!
*params 注意print()里面的 逗号分隔 格式 *params有一点把元组当做形参的格式感觉,
在传输值的过程里 它有点类似
收集参数 加上其他参数。 那么其他参数可以设置为默认参数
p20 函数
函数返回值的问题:函数 如果没有带参数 其实也会找到一个返回值,返回 none
元组 用逗号隔开也可以 实际是元组把多个值 打包返回
全局变量 和 函数内的 局部变量 old_price都不是一个相同的值
P21 内嵌函数和闭包
glabol关键字
shadowing屏蔽 了全局变量 和局部变量 的冲突性
glabol函数 可以把conut 的局部变量 屏蔽给跳过 意思就是 函数里一样调用了 是全局变量 conut 而不是从新创建了一个局部变量count
函数可以 嵌套调用 同时 调用fun2只能通过 fun1的 内嵌调用 而不能直接调用 必须通过 fun1
编程样式 针对对象 针对过程
这样就构成了闭包 注意 调用闭包函数的时候 相关的特点 i=funx(8)仍然是一个函数 i(5)才是函数最后算出来的一个值
还可以借用 二维数组的方式来加以理解
看好 很明显return 到 fun2() 就又会把fun2的函数 执行一遍 这会报错的 原因是数字全部存储在 栈里边的
(具体的解释 再去了解)
利用列表 就能排除去 数字在栈里边了
或者就是 nonlocal 来把X 强制 声明为不是一个局部变量就可以了 因为 返回的fun2()它是一个函数得嘛
p22 lambda 表达式
lambda函数得意思就是说 在冒号的前面 X 就是 函数的参数 在冒号的后面就是函数的返回值
lambda函数 多个参数的时候
过滤器 牛逼的BIF函数之一 我们通过眼睛审视一些文章
通过过滤器 我们可以 看到自己 觉得需要关注的 需要重点关心的
filter前面一个参数的条件内容是 None的条件意思 filter也是返回的一个对象 要用list打开
返回的是一个对象的时候 我们可以用list函数给它解开
简化一下 牛逼了的 仔细阅读 lambda x: x %2 是做为filtter函数的 第一个参数条件, range是第二个参数条件
map()函数
分别把列表里面的数值 按照一定的条件算法 分别迭代进入计算 分别返回相应的数值
P23 递归的厉害
Ctrl+C 强制停止
设置递归的层数 python 是1000层 从而启用保护机制
Fibonacci() 斐波那契数列的函数实现
两两 相邻相加 就等于下一个
while 以下的逻辑算法 (迭代思想) 牛逼阿!
n为需要迭代到 多少次的时候
递归的逻辑思想
语法错误 又在函数中调用了一模一样的自己
看看正确的思想
!!!!!!!!!!!但是有时候用递归的话 会加长计算的长度, 反而有时候用迭代非常好用呢
P24 递归:汉诺塔
这里的 n == 1 是指x 针 上只有一个的时候 直接移到目的地 z针上面去 (逻辑意思就是把最下面那个移动到Z针 在上面的所有都移动 到Y针的基础上)
超简单的逻辑实现(属于废话的那种了)
p26 当索引不好用的时候
此处的 brand.index(‘鱼c工作室’)的返回值 其实是 数字3 而slogan [brand.index(‘鱼c工作室’)] 实际上的意思就是slogan[3]
字典 的特性 用大括号{} 属于映射类型 不属于 序列(列表 元组 字符串)
李宁 就是属于 键(key) ‘一切皆有可能’属于 值(value)
需要注意到 字典的 引用格式 dict1[] 中括号里面可以用 整形变量 也可以用 字符串 都可以
用关键字dict() 创建的时候 不可以用 ’ ’ 也就是 字符串作为 key 这就好比变量的规定
而且会自动按照首字母来排序
替换 苍井空这个键的值
dict4[’ '] 这种方法 会先找到是否 字典内部 有这样一个键 有的话就替换它的值 如果没有的话就重新建一个 键 key
把分别几个不同的字典的 键 通过内置函数 .fromkeys 的方法来实现, 注意其中的各个区别
第二个参数 为一坨的时候 并不会分别对应赋值 而是整体都被赋值了
并不会发生改变 就是更换值 而是类似于从新建立了一个
32个赞
dict.keys 就是指在 键里面跑
dict.value 只在值里面跑
在全部里面跑 (包括键与值)
用print的方法来访问 字典的项 越界了就会报错因为要面对对象 所以应该找到更好的一个方法
用 字典的内置函数 .get 可以 更从容的打印 字典的项 而不会出现报错 返回值None 就是什么也不打印
设置比较灵活可以进行添加一些的参数
用in 来进行判断 有无
用内置的 .clear来清空该字典 也可以用 a= {}来定义空的字典 但是并不严谨
用a= {}来定义会造成以上的问题 就是b 并没有随着a的改变而改变 他仍然 可以访问到原始的那个数据
但是用clear的话 就会 让b跟着a的清空 一起被清空
用内置函数 .copy前拷贝 拷贝下来的内容虽然一样 但是地址并不是一样的 用赋值进行的拷贝实际上是相同的
前拷贝的b并不会被影响到
这里的 a.popitem 是属于 随机弹出来一个
setdefault 的内置函数 类似于 get 只是唯一的区别就是 get 没找到返回None 不会表现出来 但是setdefault 找不到会自动去添加
它有它内部的一个随机排序方式
.update
update 使用一个字典 映射另一个字典
P28 集合 (字典近亲)
如果在花括号{}里面 如果没有映射的关系的话 那就是说它是集合
集合会把重复的元素给重叠了 因为元素在集合中是唯一的
同时不能对集合里面的原色进行检索 用下标的方式 集合是无序的
会发生报错
会发生报错 了解set的使用方法
没学过集合就可以采取这样的方法来实现 把不是空格的元素添加进 空列表temp中
list把num1返回成了一个 列表
set1 成了一个集合了 看符号
集合中的一些内置函数 add remove 其中的参数是要 增加 或者删除的 元素
frozenset()函数 用来定义一个元素无法被修改 冻结了的集合
就无法添加了 会报错
P29 文件 哇喔~
一般都是默认的参数
w 若是文件不存在会创建一个 存在 依然会创建一个来覆盖之前所有的 不会追加
a 与w 不同会进行追加 ,就是上次没写完的文件 可以接着写入
比如E盘下的 文本文件 record
可以被赋值给一个变量 文件被赋值 再对变量f 采取一系列操作
read()内置函数 如果参数(size)是-1 或者不写 就是读取全部 字符 他读取的参数是按照字符来的
前五个字符
tell() 是读取文件内 指针的所指位置 (PS:一个中文字符占两个字节)
.seek()函数的用法
从0开始 便宜45个字节指针 刚刚到小甲鱼的‘小’字 其中的\n 也被一起算作两个读入
然后用readline读出一行,读到\n之前就可以了
用列表函数list()把这个文本输出成了列表
思考: 为什么 读出的是一行一行的 而不是 一个一个字符? 奥!因为有\n的符号!
其实不用那么多繁复的操作 因为如果文本过大 转换成列表 需要时间 再来读取列表 也需要时间
完全可以直接就读取了文本文件
就是说 f 不是一个可以写入的状态 因为之前open()的默认参数是r 只读不写的
因为本来E盘是没有 test 这个文本文件的 那么w 就会自动创建一个新的可以写入的test.txt
返回值是 写入的字符数量
关闭了 之后就开始写入了 如果没关闭就会写入缓冲区里面 (有点类似保存的感觉!)
P30 文件(一个任务)
先打开文件
如果碰到=那就把文件分别保存了(保存三个文件)
如果没有=那就把每一行的读出
按照要求 给每一行放置到对应的 列表里
分隔我们用字符串的一个内置函数
返回的是一个列表挨~ 哈哈
以:冒号作为关键字 左切和右切
(role,line_spoken) 直接以冒号为分隔点 把冒号前的字符分给了 role 冒号后面的字符分给了line_spoken 参数1的意思是冒号后
第二个参数1 or 3如果发现作为分隔符的不够3个 一样和1相同 返回值。除非有3个 返回值才是分成三份
再利用对 role的字符识别 来把冒号后面的分隔内容放置到分别不同的列表中
作为全局变量 用来改变boy_1 boy_2的字
碰到=用来分文件了 字符串的拼接 需要把 整形count给强制转换成str字符
分别打开各个文件的写入状态
刚好可以用 .writelines()来写入 列表(属于序列)
boy 和girl 都是作为一个 队列的 存的是一行一行的字符串
再分别进行 初始化 再把count 计数加一
不能忘记关闭相关文件, 否则 数据一直都在缓冲区里面 无法保存到文件中
关闭文件很重要!!!!
最后关闭之前的record只读 文件
为什么 值保存了两个文件呢???
因为程序是根据 ==== 来判断的
但是 三大段话只用了两排 =来分隔
第三个并没有 === 所以 要加工第三行
**解决方法1:
在第三大行下面添加一段
解决方法2:
把内部循环代码 (创建新的文件 并且把内容写入的那部份代码)
count不用管 因为它的变化从1开始 上一个循环就是为这个文件命名准备的, 列表数据的写入同理**
程序优化
利用函数打包 重复代码的思想 把重复率高的代码 打包封装起来
函数有三个形参 是代表有三个 实参会传来(也就是三个数据在变化的,切函数里有涉及到的三处变化)
又把整个所有的 代码给封装成了一个函数 返回值是 开始打开的那个文件record.txt
自己写的
此处格式错误 应该直接是open(boy_file_name,‘w’)
P31 一个高大上的东西。。模块
import os 引入os模块 然后对os 模块的一系列操作
返回当前工作位置
反斜杠在单引号内 创建新目录,如果上一层目录不存在,则引用失败
因为 B目录里有个 文件 test 除非先删除了这一 个的test的文件才能够删除该子目录
换言之 remove只能删除单层的目录
第一个是命令台 第二个计算器
他仍会把最后一个字符当做文件名
只搞后缀
P32 永久保存 pickle 泡菜 pickling把对象转换成二进制 二进制转化成对象的过程 unpickling
‘wb’的意思是打印进去二进制的 最后也是把 my list中的一些文件转换成二进制给转入进去
‘rb’的意思 二进制的形式 读出来
这里面看起来就感觉跟冗长 繁复
但是当我们面对到更加长的队列的时候
代码就变得 优雅了
腌制
导入先前腌制
P32 你不可能总是对的 Exception
报错了 在普通用户的眼里 就没有什么后缀的这个类似的说法
我们输入 正确的是 要加上一个 后缀跟着文件名
判断是否为失败 错误
P33 异常处理
检查是否出错 , 用户体验会好很多,但是最终对于我们 就太笼统
因为 我问什么是一个文件 并不存在
reason它只是作为一个 变量来存储 错误的内容
错误 是没有该文件 这种方法就是可以定位
1 + ‘1’ 是不行的 两个类型是不可以相加的
int(‘abc’) 属于ValueError
只要异常就输出 但是并不推荐该用法 因为不可以准确输出 具体的错误类型
无论是哪一个错误 都会被捕捉到
finally 后面的代码是无论如何都会被执行
在遇到错误代码之前
如果把 f.close()的语句放在了 sum…的后面 就会因为 该错误语句而不能执行到前面的写入的数据 尽管会返回 输入的个数 5 但是并不会写入 五个数据 因为 在关闭文件 的过程之前就 出错了 就不能执行到关闭 文件的操作
解释内容
P35 图形用户界面入门:EasyGui
GUI编程
下载的过程
对象
调用 对象的功能
pass就是 过
Mylist 就继承了 list的这个类
尽管都是在调用 fun()但是 结果都是不一样的
关于self 默认的参数
魔术方法
init(self) 非常重要的方法! 构造方法 对象 成为实例的时候自动调用
注意区别 _init_并不需要单独作为内置方法来传值了 而是直接可以用 对象来传值 方便很多 同时 参数排开self 直接传到后面的两个参数上去
有公有 私有的区别 默认的话 对象的属性方法都是 公有的
双__可以 私有化 理论上 外部就不能访问它了
可以通过内置函数返回值 调用那一个函数来 调用它
python实际上是把 __name改成了 _类(对象)__name的形式了 也就是 __name==_Person__name
所以其实都是伪私有的
继承
继承者 我们称作为子类 子类可以继承所有父类的 属性和方法
决定他是子类还是父类 是看这个括号里面的
当子类 和父类的 内部函数方法冲突的时候 优先调用子类
为什么shark.move() 会发生报错呢 因为子类的方法覆盖了父类的方法 调用子类的时候 优先运行子类的方法
但是呢 有需要 shark.move()可以按照本身想要的随机位置移动 需要用到的继承方法
只需要在 下面重新的输入一行这样的代码
有种在 调用子类覆盖方法之前 调用父类方法的感觉诶
Base1 Base2 都是相应的父类
当不确定必须要使用多重继承的时候 尽量不要去使用 因为这很容易造成代码的混乱
拾遗
对于水池的编辑
self.turtle 相当于就像是一个对象
为什么c.count = 10呢?
因为生产了一个c.count 的实例对象 来覆盖了一个C.count 的类对象
发生冲突
为避免冲突 应该不要老想着在一个类里面 把所有的方法都陈列出来
而是通过组合 继承机制来 扩展他的类
实际上此处的 bb.printBB() == bb.printBB(bb)
实例化对象为dd 类对象为CC
dd返回属性 为一个 字典
self 的绑定