目录
●认识Python:
●开发环境:
●编程:
●知识点:
●输出函数print()
●转义字符:\
●二进制与编码
●标识符和保留字
●变量的定义和使用
●简单数据类型
●整数
编辑●浮点数
●bool 编辑
●str
●一般字符串、整数的驻留机制:
●数据类型转换
●注释编辑
●注释
●input()编辑
●Python 运算符
●Python 运算符编辑编辑
●语法结构
●条件表达式编辑编辑
●range()
●进阶数据类型
●list
●list的增删改查
●Dict编辑
●set
●进阶数据小结编辑
●function(函数)
●Python异常处理
●类
●copy
Python中的变量也是对象,函数也是对象,类class本身也是对象,Python中一切皆对象。
Python内存动态分配,既我们一般不用管内容的分配问题。
Python对象是否可变:是指在id不变的情况下,能否把Python对象中的对象修改为另一个对象,如果可以,为可变对象,必定有增删改方法;如果不可以,为不可变对象,很少增删改,甚至没有增删改方法,不可变对象一般hashable。
类中def叫方法,模块——.py文件中直接def的叫函数。
str | 绝对不可变 | “你好” | hashable | 可做字典key |
numb数字 | 绝对不可变 | 1、1.2 | hashable | 可做字典key |
元组tuple | 绝对不可变 | (1,2) | hashable | 可做字典key |
元组tuple | 相对不可变 | ([1,2],3,4) | unhashable | 不能做字典key |
字典dict | 可变 | 有增删改方法 | unhashable | 不能做字典key |
集合set | 可变 | 有增删方法 | unhashable | 不能做字典key |
== | 只比较value |
is | 只比较ID |
Python变量当用对象类名命名时,有个弊端,就是删了还存在,不报错。如:
set={1,2,3} del set print(set)→
IDLE:自带的简单的开发环境
Python 3.8:交互式命令行程序
?Python 3.8 Manuals:说明手册
Models Docs:记录已安装的依赖包/模块
pycharm:集成开发环境。专业版:收费 ; 社区版:免费
在settings里可以修改默认类型文件的模版,比如加上时间,【# coding=GBK】等内容(python3以后不用写了,默认【# coding=utf-8】):
Python解释器:将python语言翻译成电脑所能识别的语言,叫python interpreter。一般是一个python.exe的文件。
●输出到控制台:print(),可以输出number、string,默认换行。
print(1,2)/print(1,end="")来打印到一行
●输出外部文件:
print('\033[a;b;cm字符串\033[m' | |
开头 | \033[a;b;cm |
a | 显示方式:0(高亮)/ 5(闪烁) |
b | 文字颜色 |
c | 背景颜色 |
结尾 | \033[m |
转义 | 英文 | 释义 |
\n | newline | 换行 |
\t | tab | 最多4个空位,最少1个空位 |
\r | return | \r之前的内容失效 |
\b | backspace | 退格,删一个位 |
\\ | \ | |
\' | ' | |
r(R) | 原字符 | 保持原意 |
一个【\】不行,两个【\\】可以
搜索【calc】小计算器【程序员】模式,对【进制】切换十分友好:
8bit | 1byte | 1 |
1024byte | 1kb | 千 |
1024kb | 1mb | 兆 |
1024mb | 1gb | 吉 |
1024gb | 1tb | 太 |
所有字符都被可以被编码:
str.ord()返回str的ascii码
ascii码.char() return str
或者说变量是对对象id的重命名,这里有点像Excel定义名称和indirect()函数的用法。
ps:万物皆对象,对象均有id,type,value。变量就是存储对象id的容器,所以变量可容纳任何对象,即,a=任一对象,而这个赋值过程就是将对象id存储在系统给a分配的存储空间中。
字符串可以是【单引号】【双引号】【三引号】
浮点数计算有时候会错(个别情况),纠正方法:
str1.endswith(str2):bool,#判断字符串1是否以字符串2结尾
eval(str):如eval(‘{1:2}’’),返回:{1:2},一个字典
str可以和数字相乘,例:"我“ * 3 = “我我我”
不可变,因为它就是一个元素的元组tuple。
str.lower() | "12ssLL" | '12ssll' | 以下都有,非字母不会变。 |
str.upper() | "12ssLL" | "12SSLL" | |
str.swapcase() | "12ssLL" | "12SSll" | |
str.captitalize() | "12ssLL" | "12ssLL" | 它是upper(str[0]),lower(str[1:]) |
str.title() | "12ssLL" | "12Ssll" | 把每个非字母字符后(包括str[0])的字母串, 第一个字母大写,其余小写。 |
str.center() | "hello".center(7,"*") | '*hello*' |
str.ljust() | "hello".ljust(7,"*") | 'hello**' |
str.rjust() | "hello".rjust(7,"*") | '**hello' |
str.zfill(): 对数字str的填充很友好 |
'-123.07'.zfill(9) 'hello'.zfill(7) |
'-00123.07' '00hello' |
str.split() str.rsplit() |
'h p w'.split()=='h p w'.rsplit() 'h|p|w'.split()=='h|p|w'.rsplit() |
['h','p','w'] ['h|p|w'] |
str.split('|') str.rsplit('|') |
'h|p|w'.split('|') 'h|p|w'.rsplit('|') |
['h','p','w'] ['h','p','w'] |
str.split('|') | 'h|p|w'.split('|',maxsplit=1) | ['h','p|w'] |
str.rsplit('|') | 'h|p|w'.rplit('|',maxsplit=1) | ['h|p','w'] |
合法标识符:字母、数字、_
●字符串的查找
a="Python" b='Python' c='''Python''' id(a)==id(b)==id(c)
条件 | 举例 | 驻留? |
---|---|---|
字符串长度为0或1 | ''或“1” | 驻留 |
字符串仅由字母、数字、下划线组成 | '1abe_' | 驻留 |
字符串包含字母、数字、下划线以外的字符 | ‘1-’或者‘ab&’ | 不驻留 |
驻留发生在程序编译时,而非运行时 【+】在编译时会被运行 推荐使用join()方法,效率更高,大大节约时间 |
a='abc' b='ab'+"c" c=''.join(['a','b','c']) |
a、b驻留 c不驻留 |
[-5,256]的整数,浮点数不行 | a=-5 b=-5 | 驻留 |
import sys ,其中a、b只能是str |
a=sys.intern(b) | 强制驻留 |
pycharm对str、all-numb进行了驻留优化 | a=1.1 b=1.1 | pycharm中驻留 |
“1.77”这样的小数字符串不能用int(),“78”可以用int()。
取整【//】,不能整除时,把结果往小了去取。如【2.2】→【2】,【-2.2】→【-3】;
牵扯负数取余时,一定要先求【//】,然后用余数公式计算,才能笔算出正确结果。
a,b=b,a 调换a、b的值,十分实用。
位运算符:
~:按位取反
^:按位异或。没有同或,可以异或后取反得到同或。
●表达式 if a>b else (表达式 if a
●分类打印输出,可以用字典,key为条件,value为值
返回一个literable对象,不用不生成,遍历时再生成,节省空间。
continue可以理解为继续的标记,程序不会执行它。通过bug调试可以发现会跳过这句。
方括号括起来的对象,一定是列表,就算没有元素,也是空列表。元素可以是任意对象。
ps:列表是由一个个对象的id组成的数据组。
list特性:重新声明list时(a=list()),系统会生成新的对象,新的对象id会被存在变量a的存储中,而不是在现有的对象中寻找。正所谓列表是可变的。
而tuple的特性正好相反,系统会先寻找是否已有tuple对象,有,就不再新建,而是直接将旧的tuple对象的id存储到变量所代表的存储中。它是不可变的。
上面讲到的numb、str、bool也有类似元组的特性,所以说它们是不可变的。
以上特性决定了赋值变量时是否产生新的存储。
list1, list2 = [], [] id(list1) != id(list2) ;除非list1 = list2 = [],这时候id(list1) == id(list2)
【:】是切片的标志。
【list.append()】等内置方法使用时避免列表的赋值,就不用担心是否有新列表产生,这就是使用内置方法的意义。
【技巧】切片:【list[1:2:3]】=[1,2,3]的形式不算是变量的赋值,不用担心有新列表产生,推荐使用,功能强大、灵活。增删改查都可以,yyds!
如果我们还是用了【变量=列表】的表达式,要使用【del list】的形式删除不用的列表变量,避免缓存过多,影响效率。
增
拼接
虽然没有变量的赋值,但是会产生新的列表,没有list.extend()好。
【list1】+【list2】=【list3】:会生成新的列表。
list.append():在列表末尾追加,参数可以是任意对象,包括函数名,如【function()】的【function】。
list.extend():在末尾添加可迭代对象,不可迭代的对象会报错:
list.insert(2,[123]): 在索引2后面添加列表[123],[123]的索引为3,后面元素往后推。
删
列表的排序
list.sort(): 不产生新列表,对原列表进行排序。
list.sorted(): 对新列表进行排序,原列表不变。
列表生成式
[i*i for i in range(1,10)]
ps:dict的key值如果重复了,不会报错,会发生覆盖,谁被覆盖不好说。
d return "李四"
字典(Dict)是可变序列。dict_values、dict_keys、dict_items都是可变的iterator。但是单个key是不可变的。
字典会先对键(key)进行hash变换,再排序。键(key)必须是“不可变的”,如numb,str,tuple。不能是list、set、dict。
字典(Dict)的查询速度不会因为数据的变大而明显变慢,因为就像按部首查字典一样,按hash查value的时间就是固定的步骤,速度是有保证的。
创建字典:
dic=dict()/dic={}: 空字典。
dic=dict("张三"=20,"李四"=40) / {"张三":20,"李四":40}
字典的增删改查
查
age=dic["张三"] #20
age=dic.get("张三") #20 age=dic.get('芳姐',“不存在”) #不写【“不存在”】就返回【none】
增删改
dict.pop(key) 等价于 del dict[key]
字典没有直接修改key的方法。
方法
同理:
items=dict.items() return dict_items([("张三",100),("李四",98),("王五",45)])
type(items) return dict_items
list[items] return [("张三",100),("李四",98),("王五",45)]
字典生成式:
zip() :return zip对象 ,iterable。
zip对象生存周期短,使用list(zip()),或者dict()后就被清空了,仿佛有一个类似zip.clear()的函数被执行。实际该对象没有这个方法。
list() | 被清空 |
dict() | 被清空 |
报错 | |
字典生成式 | 被清空 |
打印print | 还在 |
list(zip(iterable1,iterable2)) return [("张三",100),("李四",98),("王五",45)]
dict={key:value for key,value in zip(iterable1,iterable2)}
注意错误的表达{i for i in range(5):j for j in range(j)}
dict=dict(zip(iterable1,iterable2)),zip省略不可以,报错。
执行list(zip(iterable1,iterable2)),zip省略也可以
t=tuple() | 空元组 |
t=() | 空元组 |
t=1, | (1,) |
t=(1,) | (1,) |
报错 | |
报错 | |
a=[1,2,3] t=(a,2,4) a.append(5) |
([1,2,3],2,4) ([1,2,3,5],2,4) id并没有变化 |
1、 tuple没有生成式,最多用 t=tuple(i for i in iterator)
set是离了婚的字典dict,既dict.keys,如{1,2,3}
同样有hash变换,同样key不可重复。不可变对象、hashable。
创建集合:
set=set() #set={}是空字典
set=set(iterator) #iterator中不能包含unhashable对象。
添加 | ||
add | 加exactly一个hashable对象 | 否则报错 |
update | 对集合进行扩展,参数为key的iteaator 类似列表的extend |
否则报错 |
删除 | ||
remove | 删除指定的集合key | 不存在报错 |
discard | 删除指定的集合key | 不报错 |
pop | 按print顺序,从左到右依次删除: 如print出来{1,2,3,4},则pop从1~4 |
pop空时报错 |
clear | 清空集合 | |
del | 删除集合 | |
比较 | ||
set1.issubset(set2) | set1是set2的子集吗? | bool |
set1.issuperset(set2) | set1包含set2吗? set1是set2的超集吗? |
bool |
set1.isdisjoint(set2) | set1和set2没有交集吗? | bool |
数学操作 (有相应函数,但难记,跟符号等价) |
||
A&B |
交集 | 粉色部分 |
A|B | 并集 | 绿色部分 |
A-B | 差集 | 蓝色部分 |
A^B | 对称差集 | 青色部分 |
生成式 | ||
{i for i in iterator} | iterable里必须都是hashable的key |
形参 | 实参 | |
位置参数 | def func(a,b): pass |
func(10,20)中的10,20 |
默认参数 | def func(a,b=20): pass |
func(10),其中,20是默认实参 |
关键字实参 | def func(a,b): pass def func(a,b=20): pass def func(*args,**args): pass def func(a,b,*,c,d) |
func(a=10,b=30)中的10/30 *号后面的参数只能采用关键字实参 func(a=1,2,c=3,d=4) |
args={'a':1,'b':2} | func(**args) | func(a=1,b=2) |
args=[1,2,3] | func(*args) | func(1,2,3) |
1*2*3*4*n | def fac(n): if n==1: return 1 elif n==2: return 2*1【等价2*fac(1)】 elif n==3: return 3*2*1【等价3*fac(2)】 elif n==4: return 4*3*2*1 【等价4*fac(3)】 ........ |
def fac(n): if n==1: return 1 elif n>1: return n*fac(n-1) else: return 'error' |
1,1,2,3,5,8 | n<3时,return 1 n>2时,return fac(n-1)+fac(n-2) |
def fac(n): if n<3: return 1 elif n>2: return fac(n-1)+fac(n-2) else: return 'error' |
类这个对象:
python是动态语言。 java是静态语言。
变量赋值:
变量对象cpu1=变量对象cpu2,而变量所指向的所有对象都没有被copy。
浅拷贝:
import copy
computer2=copy.copy(computer)
只拷贝了主要对象,对象包含的子对象不拷贝,子对象是一样的。
浅拷贝:
import copy
computer2=copy.deepcopy(computer)
把computer包含的所有对象拷贝了一份。