python 学习手册重点
############################python学习手册
#第四章
1.python中增加**代表乘方
2.在python可以反向索引从-1开始,
3.python没有声明的说法,
4.脚本都是在赋值的时候确定类型的,同时赋值后不变的,
5.可以人为改变python中的每一个对象,
6.在pyhon中类型可以分为不可以变性或者可变性,
7.在核心类型中,数字,字符串和元组是不可变的,列表和字典可以*的改变, 如果是用的方法, 是对原来的列表改变而不是创建新的列表, 但如果不是方法,如切片等会新的创建列表,高级语法有\列表解析\列表嵌套 有边界
8.在python程序中处理的每样东西都是一种对象.
9.python支持原始字符串但要加上r(c++是R)
10.python3.x后所有字符串都是Unicode
11.Python中严格进行边界检查,不会默默的增大列表,而是报错.不像c语言
############################################################
#第五章 python 整数具有无穷的精度只要内存允许, is是直接看内存是否为同一对象, python中有真除.
1.(Y/X)和去小数除法(Y//X) 除了幂运算从右到左其它都是相反,
2.多个比较 1==2<3 same as 1==2 and2<3 返回 false ,
3.虽然set集合很像字典, 可以直接用{1,2,2}方式创建, 但是原理还是通过set('122')函数, 如果创建的是空一定要用set(), 同时集合是不可以变的所以不能嵌套列表, 字典, 可以嵌套元组.同时可以过滤相同元素的功能
4.如把一个列表转换成set会过滤相同元素 还能记录已经访问过的位置.
############################################################
#第六章
1.python中变量是没有类型的
2.变量只是引用(c语言中的指针)了一个对象(一块内存空间)
3.而对象有类型(在python中就是类), 同时每个对象都包含有头部信息来标记类型, 其实还有一个头部信息那就是给引用记数器的一个引用值.不同于c静态语言中的引用 如 a=1, b =a 当a=2时 b还是原来的值, 这更能体现变量只是引用. 同时a =1, b=a 当a+1 时 a=2b=1 因为有表达式会生成一个新对象(新的内存a就产生了新的引用) 这体现了整数是不可变的, 也有原处修改的, 如对列表对象一个偏移进行赋值是改变原对象不新生成, 因此共享引用与在原处修改要非常小心 , 可以用拷贝(同时分片表达表是会创建新的对象的) 所谓能在原处可以改变的是可变的对象不可变对象是不能改变的,
4.##x=42 y=42 x==y true xisy 也会是true 原因是python 缓存并复用了小的整数和小的字符串.
############################################################
##第七章
1.Python中没有像c语言那样字符串是字符数组,
2.python没有单个字符的这种类型, 而就是字符串中对单个字符有单个字符串, 同时是被划分为不可以变序列这一类别,
3.字符串创建了不能在原处修改,
4.没有字符串结束符,
5.切片语法 [左边下刀处:右边下刀处:单个之间间隔],
6. 一般不建议用s ='efef' s=s+s[:3]+'efefewff' 因为它对原来的s的内存没有回收, 而是再次利用,
7.方法是特有的表达式是能用的,如切片表达式,
8.字符串格式化有表达式与format()方法后者强于前者其中format(**name);**是把键和值的一个字典包装到时单个的"name=value"关键字参数中,以便可以在格式化字符串中用名字来引用它们, 还有 format(*name) 是引用元组;
9.参数 带一个星号(*)参数的函数传人的参数存储为一个元组(tuple);而带两个星号(**)参数的函数传人的参数则存储为一个字典(dict)
10.格式化字符串也不例外不是对原来的进行更改,是创建一个新的字符串,因为字符串不能修改
############################################################
#第八章
1.列表在标准python解释器内部, 列表就是c数组而不是链接结构,
2.列表就是包含0个或多个其他对象的引用, 在python总是会存储对象的引用, 除非明确要求保存拷贝,
3.如果是运算符返回的是新列表, 同时两边必须是相同类型的序列,
4.列表中的值分片重叠如:(l=[1,2,3,4,5,6,7,8,9] l[1:4]=l[2:6] 这是可以的因为要被插入的值会在左侧删除发生前被取出.
############################################################
#第九章
1.拷贝需要注意的是: 无条件的分片以及字典copy方法只能做顶层复制.也就是说,不能够复制嵌套的数据结构 如果需要一个深层嵌套的数据结构,完全独立的拷贝,那么就要使用标准的copy模块 包括importcopy语句 并编辑 x =copy.deepcopy(y)对做任意嵌套对象y做完整的复制.
2.python会把任意的空数据结构视为假
3.事实上,即使早类型本身在python中也是对象类型
4.无论何时python在对象中检测到循环时,都会打印成[...].而不会陷入无限循环.
5.文件内容是字符串,如果写入要确保已经是格式化字符串.
############################################################
#第13章
1.在wile条件中不要使用语句
2.在python中语句就是语句 不是表达式 不像c
3.range支持多个迭代.
############################################################
#第16章
1.函数是通过赋值(对象引用)来传递的.
2.可变对象可以改变调用者共享的那个对象,
3.在pyton中函数跟变量一样可以随意赋给一个另外变量,就是一个引用(c中的指针函数)因为在python中函数也是对象, 所以说函数不要声明可以直接用允许任意的属性附加到时记录信息以供随后用如 deffunc():... func() func.attr =value
4.切记在原处修改的方法或表达式是返回none的 .
############################################################
#第17章
1.函数可以嵌套
2.要使用外部或嵌套函数变量要声明global或nonlocal(必须在def作用域中赋值过 只会在当前def作用域中查找)也可以用函数名引用(函数属性)本地变量而不用nonlocal
############################################################
#18章
1.不可变参数"通过值"进行传递(拷贝)
2.可变对象是通过"指针"进行传递的(改变原处)
3.记住一点外面有传递变量给参数就是参数对变量的引用, 但是参数与变量作用域不同,函数返回,作用域也没了参数没用了, 如果是引用的可变变量能够在原处修改的函数返回了对外部有影响, 就是看变量是可变还是不可变量, 同时参数是不同作用域对变量的引用,
4.*\**在头部是收集成元组或字典 在调用是把元组字典解析 参数顺序 带**的在最后 *\** 但在* 后面的普通参数为关键字参数
############################################################
#19章
1.函数其实也是一个对象有属性
2.函数注解在默认值前即=前 如 a:'int' =4
3.lambda 只是表达式不能有像if这样有语句
4.lambda可以获取任意上层lambda中的变量名
############################################################
#20 章
1.列表解析是在方括号中,表示是一个列表里面是一个for循环
############################################################
#24章
1.from 对于变量是复制而不是连接, 如果是整个模块,然后赋值某个点号运算符的变量名,会改变原来的,
2.模块也是一个对象, reload 不会影响from导入, from还是引用原来的对象即使重新设置,可以使用点号, 因为点号会重新回到模块,也就是from 模块而不是变量,
3.变量名以单个下划线开头时,当使用from*语句形式导入,这些变量名不会被复制导入进来, 但可以通过import 或普通from语句导入.
4._X是防止from*导入.但还是可以用import方式修改变量名
5.__all__是使from*只会导入把列在__all__列表中的这些变量名复制出来.
6.每个模块都有个名这__name__的内置属性.如果文件是以顶层程序文件执行的在启动时,__name__被设置为字符串"__main__"如果是被导入就会改设成客户端所了解的模块名.
############################################################
#26章
1.实例一开始是空的,在执行点号运算就不是了
2.类中方法要显示的写出self(c++中的this) 当前对象 __add__方法会创建并返回这个类的样的的实例对象
############################################################
#27章
1.类中的初始化函数是__init__ 这代表与类无关 与c++/java不同(必须与类名相同)
############################################################
#29章
2.运算符重载只是意味着在类方法中拦截内置的操作
############################################################
#30章
1.类有伪私有, 变量前加双下划线例如:__name, 其它是创建的变量名局部化的方式而已.这种功能主要是为了避免实例内的命名空间的冲突,而不是限定变量名的读取.称为伪私有.如像类Spam的__name会自动变成_Spam__name.相当变得独立.私有化.
2.邦定与无邦定: 如果一个类方法参数没有self调用时:如果手动传对象那当作类方法 但是不传实例会当作普通方法.
3.__getattr__方法是拦截属性点号运算,但是是那些没有定义的.
4.__setattr__方法是拦截所有属性的赋值语句.
5.__getattribute__方法是拦截所有属性的获取.(只适用于新式类)
6.描述符提供了一个协议.把一个类的__get__和__set__方法与对特定类属性的访问关联起来.(用于类属性)
7.__str__用于打印操作.__repr__用于所有其它的环境.如用于交互模式下等.总而言之__repr__用于任何地方.除了定义了一个__str__的时候.使用print和str.注意如果没有定义__str__打印还是使用__repr__反过来不一定成立(其它环境).
31.章
1.python3.x所有的类都是新式类.不管显式还是隐式的继承自object.python2.X中只有继承自object才是新式类