引言:
"life is short, I choose python."
自学python并做机器学习和统计分析已经快两年了。现在把学习的一些感受和知识重新整理出来,供参考、批评指正。这系列笔记针对已有编程基础(如C/C++,JAVA)的朋友阅读。
Python简介:
关于环境:python的开发工具很多,个人习惯下个Anaconda创建环境&用Jupyter,大型项目代码用VS Code也很方便。
关于语言:python是一个面向对象的、解释型、动态数据类型的语言。
所谓面向对象,是指python支持类;使用类和函数进行封装在python中非常常见。事实上python“万物皆对象”,即使是最简单的数据类型也是以类的形式呈现的。如:
这里将变量a的值定义为整型2,实际上系统创建了一个int类的对象,该对象的值为2。同理,float, bool, tensor等数据类型和函数等也都是基于类和对象实现的!
PS:python只有class,没有C的结构体。
python“万物皆对象”的特点赋予了它和其他语言的很多不同,这在后面会慢慢提到。
所谓解释型语言,是指源代码经过解释器之后直接执行,这类的语言如python,JavaScript;与之相对应的编译型语言,需要先经过编译器生成目标代码,机器再运行目标代码;比如C会编译生成汇编代码,并链接执行。
解释型语言省去了目标代码生成,一切错误都在运行时被发现(而C的错误会在编译时都被找出)。但解释型语言每次运行之前都要重新解释,不像C第一次之后只需要执行目标代码,所以速度较慢。
所谓动态类型,是指变量的类型在最终程序运行时才进行类型检查,所以python可能在运行时报出类型不匹配等错误;而C,JAVA等语言属于静态类型语言,在编译时就会进行类型检查。
不同于C或者Java以分号区分语句,python通过缩进来区分不同语句,这让python的书写有严格的格式要求,例如C语言的以下两种写法都正确:
//写法1
int a,b;
a=2;
a=3;
//写法2
int a,b;a=2;
a=3;
而python一般来讲,一个语句占据一行,这就不用加;了:
a=2
a=3
#或者对于赋值语句也可以写成
a,b = 2,3
虽然python也可以多个语句写在同一行或者一个语句写在多行,例如
a=2;b=3;print(a,b)
a=2\
+3 #通过反斜杠\把分布在多行的语句连在同一行
s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\
cccccccccccccccc"
但这样会破坏程序的可读性,用的好像也很少。。。除了\在处理一些语句过长时可能用到。
另外C语言通过{}区分不同的if等语句块,而python通过缩进4个空格或1个Tab来区分:
//这样的C是正确的
if(a<5)
{
printf("aaaaaa");
printf("bbbbbbbbbb");
print("ccc");
}
但python只能这些写:
if a<5:
print("aaaaaaaaa")
print("bbbbbb")
print("cccc")
print("dddd") #这句代码就在if语句块外了
这样的缩进也增强了代码可读性。
python支持两种格式的注释:
#这种注释了某一行内容
#这种注释了某一行内容
'''
两个三引号中间的是被注释掉的一段代码块
'''
"""
单引号也可以被打成双引号
"""
数字类型
python支持的数字类型有整型int、浮点型float、布尔型bool和字符串string,布尔型即1(True)和0(False)。
isinstance()函数可以判断一个数是否是已知的数据类型:
a=5
print(type(5)) #输出<class int>
b=isinstance(a, int)
c=isinstance(a, float)
print(b) #输出"True"
print(c) #输出"False"
与C语言不同,python不需要提前对变量进行声明;直接使用即可。系统会根据对变量的赋值自动分配符合的数据类型。对于同一个变量可以先后绑定不同的数据类型对象,如:
a=5
a="HelloWorld"
print(a) #"HelloWorld"
实现这一功能的本质是a=5时,系统会自动创建一个int类对象5,并让a和这个对象绑定;a="HelloWorld"时,系统会另外创建一个string类对象,并让a重新和该字符串对象绑定。原来的int对象因为没有被引用,会在一段时间后被系统的“垃圾收集机制”自动回收,也就不存在了(这部分详见CSAPP)。
事实上即使第二条语句是a=2,系统仍然会重新创建一个整型对象2,并让a和这个2绑定,并回收之前的整型对象5。换言之重新赋值之后,变量a所指向的内存空间发生了变化!这和C语言有明显不同。
python支持强制类型转化(但有些情况无法转化),如:
a=5.2
a=int(a)
print(a) #输出是5
b="402"
print(int(b)) #输出是402
c="Hello"
print(int(c)) #Error!!!不能转化
只有当变量值是0或空字符串时,其布尔值为0.
python支持的算数运算和其他语言大同小异,这里只说逻辑运算。python支持的逻辑运算有and(与)、or(或)、not(非),其中and和or也可以被表示为&、|,例如
a=c&d
a=c and d
a=c|d
a=not c
IO
python用input和print完成输入和输出:
a=input("请输入一个数字") #input返回一个字符串
b=int(a)
print("我刚才输入的字符是",b,"你好!")
print除了这种输出格式外,也支持格式化输出。