第一部分: 赋值机制
基本类型的赋值(在命名空间中指向同一个内存地址,举个栗子如下)
tip:这个id()函数是用来查看内存地址的,可以看见x赋值给y后两个的内存地址是一样的,赋值流程是这样的(如下图,然后y也是指定相同的命名空间下)
当我们把字符串赋值给y时,系统生成另一个PyStr内存空间
有点特殊的地方在于,就算是赋相同的值,Python也不会分配同一块内存,而是新建(当然数值太小除外)
小数值
大数值
容器类型的赋值
我们将x的值赋给y验证一下
我们修改一下y的值
检验一下x[1]==y[1]是否成立
由此可见,对于容器类的赋值,在内存中储存的是值对应的内存地址(因为x和y在同一地址,故而修改y[1],x[1]也同样会改变)
但是当我们将y整个改变的话,Python会重新给它分配一个空间
总结如下:就是创建一个容器类,例如上述的列表,Python会想创建2个PyInt空间,让后再给列表一个空间,所以改变单个值不影响总体的内存地址。类似的其他容器也一样符合这样的赋值机制,但是对于比较大的则是让它们共享一块内存,这样做复制操作时就高效很多。
第二部分:判断
if语句
- 格式
- 例子
条件满足时:
条件不满足时:
检测代码块的缩进效果
由此可知只有缩进的那部分是属于上个语句的代码块,同样缩进的是并列关系
elif和else语句
-
格式
-
例子
由此可知,elif的个数可以多个,也可以1个,当然也可以没有,唯一要注意的就是代码块的缩进。
判断条件的选择
Python的判断条件没有限制,大部分值都会给当做真值,但是有以下情况例外
- False,包括所有计算结果为False的表达式
- None,包括所有计算结果又None的表达式
- 整数0值,包括计算表达式为0的表达式
- 空字符串、空列表、空字典、空元组、空集合
- 浮点数为0.0时(不推荐,会存在精度问题)
例子
-
使用浮点值0.0
-
使用浮点数作为条件(可以看见虽然结果是0.0,但是还是当做true执行了,故而存在精度问题)
复杂判断中关键字的选择 -
and(且操作)
1:如果两个值都为真,返回第二值
2:如果至少有一个为假,返回第一个为假的值
3:and的返回值是传入的值,不是False或者True(没有判断条件时)
- or(或)
1:如果两个值都为假,返回第二的值
2:如果至少有一个为真,返回第一个为真的值
第三部分:循环
wile循环
- 结构(执行statements的代码块直至条件condition不满足为止)
- 例子
循环输出列表的元素
for循环 - 结构(执行statements的代码块循环遍历sequence,将值放到variable)
- 例子
不同类型序列的for循环遍历情况 - 有序序列(从序列的第一个元素开始遍历)
- 无序序列(按照一定的内部规则进行遍历)
循环遍历中的关键字(continue、break)
- continue(停止执行当前循环,开始下一个循环,例如跳过列表中的奇数)
- break(跳出循环)
用列表推导式实现特殊的循环 - 用普通的循环实现一组数的平方
- 用列表推导式(就是用for循环生成另一个符合条件的序列)
for循环中的两个特殊函数(enumerate()、zip()) - enumerate(index,value)(用for循环遍历调用它生成一个元组)
- zip()(接受多个序列(可以是两个以上),返回一个元组列表(三个以上返回的长度以最短的那个为基准))
第四部分:函数
函数的定义
-
使用关键字def引导
-
def 后面是函数名字,括号中为参数,不同参数用逗号隔开,参数可以为空,但是括号不能省略
-
代码块要缩进
-
用三引号"""对函数作一定说明(可选,便于查看函数)
-
使用关键字return返回特定值(按需求写,省略返回None)
-
例子
函数的调用 -
不会自动调用,需要我们调用
-
要传入支持函数内部方法的参数
-
特定函数参数个数要等于定义个数
-
例子
例如字符不能和数字相加
例如参数个数超出
函数参数传入方式 -
第一种是上述按参数的顺序传入
-
第二种是利用键-值模式传入(但是不允许给同一个变量赋值多次)
-
例子
带默认参数的函数 -
带默认值的参数必须放在不带默认值的参数的后面(该参数可以覆盖)
-
例子
接受不定数目参数的函数
我们知道max()和min()函数是可以输入多个参数的,那么自定义函数是否可以这样 -
例子1(使用星号实现*)
上述我们将以前自定义的函数修改后就可以实现了,其中参数*ys是一个可变数目的参数,我们可以将它看做一个元组。 -
例子2(使用两个星号**)
**ys表示的是一个不定名字的参数,本质上是一个字典 -
例子3(两种模式混用,要按顺序传入参数,先传入位置参数,再传入关键字参数)
第五部分:模块
使用模块可以减少工作量,我们可以先生成一个脚本,然后在其其它文件中导入这个脚本就可以以使用脚本里面的函数或者方法了
-
用%%writefile 脚本文件名字.py
-
用魔术命令%run运行这个脚本时会直接输出结果
-
用import导入模块
-
使用模块名.variable来调用模块内的变量(可通过赋值修改该变量的值)
-
使用模块名.function来调用模块里面的方法
-
使用__name__来选择不执行哪些方法或语句(作为脚本执行或者模块导入时,它的值存在一定的差异,作为脚本时,它对应的是字符串__main__;而作为模块导入时,它对应的是模块的名字)
参考一个博主的说法,这个比较好理解
作为脚本执行时__name__的值是__mian__
作为模块执行时__name__的值是模块名字 -
使用__all__来选择导入模块中想要的内容
参考另一个博主的做法 -
使用dir()函数来查看一个模块中包含的对象(如果不给定参数那么久返回所有)
-
包(Package)(由多个模块组成的集合)
结构如下
调用方法如下
如果包下还有包,那么可以这样调用另一个包
第六部分:异常
- 处理异常信息的结构(不希望程序有异常的情况停止运行)
- 例子(先写一个异常的例子)
- 加上处理异常的例子
可以看出我们把出异常的代码块放在try下,然后把处理异常的放在except下,这样的话,当try下的代码出现异常,就会直接转到except下去执行处理异常的操作,然后重复操作
处理异常的关键字
异常的种类很多,有数值异常,除零异常,类型异常等,为此有两个方法处理这些异常
- 第一种是我们知道会出现什么异常,那么在except部分的参数可以写相应的异常类型,可以单独写一个,也可以并列写多个
- 第二种是我们不确定那么可以用Exception代替(这个是所有异常的总称)
得到异常的具体信息 - 处理结构
例子如下
使用raise选择抛出异常信息 - 结构如下(选择抛出异常的类型,参数为具体说明)
使用finally关键字处理异常 - 不管try代码块有没有异常,finally块中的内容一定执行
- 没有异常那么finally块的代码就在try块后面执行
- 有异常时,如果except处理了异常,那么就再处理后执行
- 如果except没有处理,那么就在之前执行
第七部分:警告
- 使用时要导入相关模块(import warming)
- 调用warn(msg,WarningType=UserWarning)函数来抛出警告(类型不指定默认是用户警告)
常见的警告类型
- Warning,所有警告的父类
- UserWarning,用户警告,warn函数的默认警告类型
- DeprecationWarning,表示用户使用了未来可能会被废弃的功能
- FutureWarning,表示用户使用了未来可能改变的功能
- RuntimeWarning,运行时警告
- 可以使用fileterwarnings方法来筛选不希望看见的某类警告
- 例子如下
例如这个加了参数就行了
这章就写到这里,可能有错,以后发现了再回来改,或者补充了,写了三天,断断续续,感觉没学到什么