1. 交互模式和命令行模式:
进入cmd窗口直接是命令行模式,敲python之后进入的是python交互模式
cmd下标记符是>, 交互模式下是>>>
在交互模式下使用.py文件需要先把目标路径切换问py文件所在路径
交互环境下敲代码会把每一行的结果打出来,但直接引用.py文件就不会
因此交互模式是用来调试代码用的,并不是正式运行代码的环境
2. 如何运行python程序:
用文本编辑器写Python程序,然后保存为后缀为.py的文件,就可以用Python直接运行这个程序了
3. #作用:添加注释
格式化需要添加4个字符的缩进
python是大小写敏感的
如果表达的语句里有':前面加\
\加字符表示转义,如果要表达单个\可以用\\;
r' '表示引号内的字符不进行转义
''' '''中间的部分表达式可以换行表达
4. python里bool值为True和False,其中可以利用运算直接得到bool值(区分大小写)
bool值可以进行and or not三种运算
5. python是动态语言,所以变量的值类型是不固定的(例如可以先定义为一个int值后重新定义为一个bool值),相对的java是静态语言(变量类型不能改变)
6. python用大写的变量名表示常量,但仍然可以通过重新定义改变常量
7. python的三种除法:
/:除完仍然是浮点数(无论是否整除)
//:除完仍然是整数(无论是否整除)
%:取余数
8. 计算机编码:
ASCII码只有基本的英文,是1字节编码
Unicode码有所有文字,是两字节编码(少部分需要4字节)
UTF-8编码:可变长度的Unicode码,目的是节省传输和存储空间
9. 对于单个字符:
ord()函数可以获取字符的整数表示,chr()函数可以把编码转换为对应的字符
要计算str包含多少个字符,可以用len()函数,如果换成bytes,len()函数就计算字节数
10.当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码:
11. %运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
12. list:是python自带的表元素,可以随意添加改变删除元素
利用len()可以获得表内元素数量
利用索引访问数组内的各种元素:数组下标是从0开始的(调取-1可以直接调取最后一个元素)
利用append,insert,pop对数组内元素进行增加,插入和减少
也可以直接利用索引数+赋值对数组内的值进行重构
list内的元素可以是另外一个list,而且list内的各个元素的类型可以不尽相同
13. 对应的:tuple同样是数组,区别是元素不能进行修改,但可以进行调用
只有1个元素的tuple定义时必须加一个逗号,来消除歧义
区别:list是[ ],tuple是()
14. python的条件句:
if-else-elif;执行到满足条件就终止
15. python的循环语句:可以用for-in,对数组中的元素进行迭代
其余的while-break-continue等和C类语言相同
16. 字典:dict;利用键值模式存储---查找快,查找时间固定,但占用的内存大
可以利用key值往字典里存新的值,如果放入的值已经有了会被冲掉
存储前可以用in判断该键是否在dic里
用pop【】可以把键删除
17. set和dict一样存储数据,区别是内部数据不会相同,可以看成没有重复数据的集合
set需要用list输入数据,但输入后只保留不同数据;例如112233只保存123
set可以用add、remove方法增减数据
18. python有内置函数,可以直接调用并且输入正确的变量类型
对变量类型进行转换可以利用int()str()hex()等方式对函数的变量类型进行转换
如果在python中定义函数,需要用到def;首先依次写出函数名、括号、括号中的参数和冒号,之后在缩进里添加函数体
19. 定义空函数可以用pass进行占位
函数可以返回多个值,但实际返回的是一个有很多值的tuple
可以利用默认参数简化定义,但定义时默认参数要放在必选参数后面,而且默认参数必须指向不变对象
20. *后面加list表示将list内的所有元素都传到元素内
关键字参数的命名可以用*kw,后面的数据类型会和前面自动组成一个dict类型的表
命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
21. 递归函数:调用自己的函数(在return中调用)
每一层调用会增加一层栈帧,所以可能会溢出。解决方法:尾递归
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式
22. 切片调用(slice):调用数组中的固定元素
L[1:3] L[-2: -1] L[0:3]
调用时包括左不包括右,且正数第一个是0,倒数最后一个是-1
22. 迭代:从一个list中遍历信息,通常用for-in循环实现
如何判断一个list是否能被遍历:需要通过collections模块的Iterable类型判断
如果要对list实现类似Java那样的下标循环:Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
23. 列表生成式:把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来
24. 生成器:一种一边循环一边计算的机制---防止占用空间
可以通过把列表的【】改成();打印时可以用next()函数或者for函数进行循环。
也可以通过把函数的return x改成yield x
25. 可迭代对象(iterable):可直接作用于for循环的对象
迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象
可以使用isinstance()判断一个对象是否是Iterator对象
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的
26. 高阶函数:可以把别的函数当参数调用的参数
27. 定义类:class Student(object)---如果没得继承,就用object表达继承对象
创建实例: bart = Student()---创建好实例后会给实例分配内存地址
赋予属性:bart.name = 「Bart Simpson」
赋予强制属性:利用_init_方法绑定name,score等方法---第一个参数一定是self,表示自己
被赋予强制属性后,创建实例时就必须赋予init内匹配的参数。
bart = Student('Bart Simpson',59)
28. 封装:由于要调用类内的数据,因此可以直接把方法命名在类内。命名时第一个变量需要是self
封装的优点是可以随意向类内添加方法
类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。
和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同
29. 保护变量(访问限制):在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
如果外部要访问:可以添加get_score方法
如果外部要修改:可以添加set_score方法
30. 定义继承:定义一个新class时可以从已有的父类继承,子类可以获得父类的全部功能
继承后,子类的方法会覆盖父类的方法(如果方法名相同)----多态
多态的优越性在于开闭原则:
对扩展开放:允许在父类下新增子类
对修改封闭:不需要修改父类内的同名函数
动态语言的继承体系:不需要严格的继承体系,因此决定了继承不是必须的
31. 如何获取对象信息:可以用type()或者instance()
用dire()可以获得一个对象所有的属性和方法
32. 类本身也可以有属性,定义后所有实例都可以访问到
因此不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
实例属性属于各个实例所有,互不干扰;
类属性属于类所有,所有实例共享一个属性;
不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误
33. 定义class---创造实例---给实例绑定属性---给实例绑定方法---只对单一实例起作用
因此为了对所有实例都有用---可以给class绑定方法---绑定后所有实例都可以调用
为了限制实例的属性---python可以在定义class的时候添加_slots_变量---添加后实例只能添加slots内部的属性
_slots_属性仅对当前属性有作用---对继承的子类不起作用
但是如果在子类中也定义_slots_,子类允许的属性就是子类slots+父类slots。
34. property可以把一个方法变成属性调用的,可以这样检查getter和setter方法。
35. 多重继承:每个类可以有多个父类---通过这种方法,子类可以继承所有父类的所有功能。
MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系
要创建一个class对象,type()函数依次传入3个参数:class的名称;继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
*看的时候跳过了:定制类 使用枚举类 使用元类
这仨是什么JB东西 血批难 等一个有缘人给我讲明白 荆轲刺秦王
*看的时候看的比较快:错误调试 IO编程 进程线程
知道有用 但我觉得需要一些技术支持才能看明白
36. 正则表达式:
用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
直接给出字符,就是精确匹配。
用\d可以匹配一个数字
\w可以匹配一个字母或数字
.可以匹配任意字符
用*表示任意个字符(包括0个)
用+表示至少一个字符
用?表示0个或1个字符
用{n}表示n个字符
用{n,m}表示n-m个字符:
\s可以匹配一个空格(也包括Tab等空白符)
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束。
网友评论