一、pycharm基础
1.1 pycharm中文件重命名
在修改工程中的py文件时,要点重构文件,而不是在文件目录中直接修改文件名,因为如果这个文件被工程中其他文件import时,直接修改文件名后,被import的地方会出错(这里不会自动更新)!
1.2 pycharm中自动规范代码
对于代码书写不规范的地方(缺少空格)使用ctrl+alt+l可以一键修改,例如下面对a进行赋值,赋值号左右两侧都没有空格,这时可以使用快捷键自动规范格式
1.3 python文件的编译解释过程
下图为python文件的执行过程
通过该图可以总结以下几点:
- 严格来说python先将源文件编译成字节码pyc文件,然后再解释pyc文件
- Pyc文件主要作用是持久化编译结果,加快执行效率(会不会生成,一般看有无import,会生成import后的py文件pyc文件)
- 可以手动生成pyc文件:python -m py_compile [py文件名]
- py和pyc文件都可以通过python命令直接执行,pyc会相对保密一些(但是有反编译机制)
1.4 python代码开头加的一行神秘注释
1.4.1 #!/usr/bin/env python
通常情况下python文件开头都会加上这么一段注释:
#!/usr/bin/env python
这是专门为linux系统设计的,我们在linux系统中常常用**./**来执行命令:
./[xx.py]
但是linux系统并不知道用什么编译器来执行该文件,在我们python文件开头加上#!/usr/bin/env python
便告诉了编译器用python解释器来编译解释。注意:在执行前需要给.py文件加上使用权限:chmod a+x [xx.py]
1.4.2 # encoding=utf-8
由于在python2版本的解释器用的编码格式时ASCLL码,并不支持中文,一旦发现程序中有中文,就会报错,所以在开头加上一段# encoding=utf-8
注释,即可解决python2版本的中文报错问题(python3版本不存在,因为它使用的就是utf-8编码格式),但是现在很少代码开头有这么一段,因为没多少用户使用python2版本的解释器了
二、python基本语法
2.1 python中变量的数据类型
2.1.1 python中的变量
python中的变量属于动态类型的变量,即变量不会在编译期间就确定下来数据类型,所以在程序中可以出现如下情况:
a = 5
a = "你好"
变量a先被赋值5这个int类型,然后又被赋值为"你好"这个string类型,一个精通C++的人看了直呼“你这个样子真是让我匪夷所思啊”,这是在C/C++中绝对不会出现的情况,所以C/C++的变量大多数是静态变量,但是C++提供了auto关键字可以定义动态类型变量
2.1.2 常见的数据类型
1. Numbers(数值类型)
整数(int),四种进制表示形式:
进制 | 前缀 |
---|---|
二进制 | 0b |
八进制 | 0o |
十进制 | 无前缀 |
十六进制 | 0x |
浮点数(float),例如(123.2)两种表现形式:
小数表示 | 科学计数法 |
---|---|
123.2 | 1.232e2 |
复数,有两种写法:
一般形式 | 构造函数形式 |
---|---|
1 + 2j | complex(1, 2) |
2. Bool(布尔类型)
bool类型其实是int类型的子类,ture默认为1,false默认为0,可以和int类型加减。
3. String(字符串)
三种符号的字符串:
可以用" “(双引号),’ '(单引号),”“” “”"(三引号)来表示字符串,其中三引号可以不加任何特殊字符进行多行书写,例如:
续行符
其中转义字符和c相同,不过多说明,有一个很有意思的续行符"",这里和c中的宏定义那里类似,使用“\”续行,注意这个符号后面不能有空格!否则会报错:
Str = "你好"\
"hh"
print(Str)
输出结果是:你好hh
当然你也可以在字符串中间输入回车,编辑器会自动给你完成续行符的添加并换行
原始字符串
c中字符串中不能有%,“或者其他的字符,所以才有了转义字符,需要前面加一个\,但是当字符串中这样的信息一多,加\的操作又麻烦又不好看,所以python中有了一种叫原始字符串的东西,字符串前面加r即可将字符串中所有字符原封不动打印出来,例如:
Str = r"已完成90%"
print(Str)
输出结果是:已完成90%
对字符串的一些常用操作
-
字符串的拼接:
python中重载了加号,所以可以直接字符串的相加,例如Str = "你好" + "我好"
-
字符串的乘法
例如想在Str中存100个a,则可以写为Str = "a"*100
-
字符串切片
这里同c一样,字符串有指针的作用,可以通过下标访问对应元素,但是有一点不同,python的下标可以为负,例如下标-1表示字符串最后一个元素的位置,所以python中字符串下标的范围是:[-max, max - 1] 其中max是字符串的最大长度
python中还可以提取字符串中一段字符,普通格式是Str[star:end:step]
, star默认是0,end默认是len(Str), step默认是1,切片的区间为[star , end ),是一个左闭右开区间,当三个参数全为默认时,例如:
Str = "1234567"
print(Str[::])
表示输出整个字符串,这三个参数还可以为负值,前两个为负值时表示从最后一个元素忘前数第几个,step为负时表示从后往前遍历。如果想要反转一个字符串,可以写为:
Str = "1234567"
print(Str[::-1])
4. List(列表)
列表和字符串的区别中有一点:字符串定义好后就不可以修改元素,但是列表可以
列表和C++的vector比较相似,但是一个列表可以盛放不同的数据类型,而一个vector只能存放单一数据类型
列表定义形式一: a = [123 , "你好", [1, 2] ]
列表定义形式二:for循环来填充列表,类似c语言了
a = []
for i in range(1, 10):
a.append(i)
print(a)
输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表定义形式三:列表推导式
用列表推导式模仿上面填充元素:
a = [i for i in range(1, 10)]
print(a)
结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
这个推导式可分为两部分,后半部分for循环是遍历的范围,前面部分是对元素进行的操作,还可以在后面加上第三部分if语句,例如:
a = [i for i in range(1, 10) if i == 1]
print(a)
输出结果是:[1]
5. Set(集合)
6. Tuple(元组)
7. Dictory(字典)
8. NoneType(空类型)
2.1.3 变量赋值
方式一:(两个不同变量)
可以写成例如:a , b = 1 , 2
方式二:(两个相同变量)
可以写成例如:a = b = 2
2.1.4 使用 type( ) 查看变量数据类型
由于Python不像c/c++会在定义变量的时候就声明了变量的数据类型,所以有些时候不知道某个变量具体是什么类型,可以通过type(变量)
来获取变量的数据类型
2.1.5 数据类型间转化
由于python的运算符不支持两个不同数据类型的变量运算,所以需要通过强制转化,例如Numbers(数值类型)数据和字符串类型数据进行加法,程序会报错,需要int(num) + str
来强制转换。但是并不是任何数据类型间都可以相互转换,有的会报错
数据类型转换图:
2.2 运算符(精简版)
2.2.1 加法
注意在python中已经对+进行了重载,但只能是两个相同数据类型的变量进行相加,例如:
print(1 + 2),就是两个数字类型的变量相加
print(“1” + “2”),就是两个string类型的变量相加
2.2.2 幂乘 **
例如求3的5次方,可以写成print(3 ** 5)
2.2.3 除法运算 /
python的中除法不同于c中的除法。
c中的除法有两种情况:
情况一:两个数都是整数,结果若整除不尽则取整数部分
例如: printf("%d", 5 / 3)
结果是1
情况二:两个数中至少有一个是float类型,结果若除不尽则为小数
例如:printf("%d", 6.3 / 3)
结果是2.1
pthon中的除法 /
例如:print(15 / 2)
结果是7.5,所以python中的除法是真正的意义上的除法
注意:不可以除0,会报错(数学上也自然可以理解)
2.2.4 整除运算 //
整出运算实际上是只取结果的整数部分
例如:
print(5 // 2)
结果就是2,即使你使用print(5.0 // 2)
,结果也还是2.0
所以//是取结果的整数部分
2.2.5 取余运算符 %
例如:print(5 % 2)
,结果就是1,%是求结果的余数
2.2.6 整除运算符和取余运算符应用场景
用于求某个标签的row数和col数
2.2.7 is比较运算符
这是比较两个变量的唯一标识是否一直(在c中是地址是否一样),通常可以用id()
函数查看某个变量的唯一标识。
小贴士:
python会将相同值的Number类型变量分配同一块儿内存空间,这里有点像两个指向同一块儿内存空间的指针,通过id()可以发现两个相同值得Number变量唯一标识相同
返回值:bool
2.2.8 链式运算符 10 < a < 40(仅在python中有!挺好用)
判断一个数是否在某个区间内,python可以写成:
10 < a < 40
,判断a是否在(10,40)这个定义域内(这是在其他语言所不允许的)
返回值:bool
2.2.9 逻辑运算符 and or not
在python中与或非分别是:and or not
,用法和c中的 && || !
类似,但有些不同点,与和或运算在C中的表达式结果只有ture或者false,而python中并不只有ture或者false:
与特性:一假即假,返回最后一个用作判断的值:
例如:print(1 and flase)
结果是false
例如:print(1 and 0)
结果是0
或特性:一真即真,返回最后一个作判断的值:
例如:print(0 or 10)
结果是10
例如:print(flase or ture)
结果是ture
2.3 python的输入输出
下面是python文件可以订阅的信息和发布的信息
2.3.1 输入input
input构造函数括号内的string类型数据打印在中断,提示用户输入,结束输入后返回一个string类型的数据赋值给另外的变量,例如:
value = input("请输入一个数值:")
print(value)
输出结果是:
2.3.2 输出 print
2.3.2.1 print的相关参数
第一个参数value,可以输出多个信息,中间以逗号隔开
print(123, "hhh")
输出结果为:
注意:这里和c不同,在c中有printf函数,在printf中逗号后面内容为前面占位符的填充值,而在python里逗号用来分割不同的打印信息
在没有设置sep参数的情况下,默认以sep=" ",每个value之间以空格隔开
第二个参数sep,用来设置不同value之间的分隔符样式,例如:
print(123, 456, sep="=")
输出结果为:
第三个参数为end:用来设置结束符类型,默认是"\n"即自动换行,如果想打印完这行不自动换行,即可:
print("hh", end="")
输出结果为:
第四个参数是file:如果想打印信息输出到文件中,可以利用file指定想要写入的文件,例如:
f = open("text.txt", "w")
print("sda", file=f)
open构造函数第一个参数是文件名(路径),第二个参数是读写的权限,w表示写
2.3.2.2 print的格式化输出
情况一:类似于c语言用%d,%f等作为占位符
print("我的名字是%s,我的分数是%d" % ("嘿嘿", 10))
输出结果:我的名字是嘿嘿,我的分数是10
情况二:利用字符串的format(格式化)方法,利用{0}等作为占位符
print("我的名字是{0},我的分数是{1}".format("嘿嘿", 10))
输出结果:我的名字是嘿嘿,我的分数是10
2.3.2.3 类似%d的占位符格式
在2.3.2.1的情况一种使用了一次%占位符,其一般形式为:%[(name)] [flag] [width] [.precision] typecode
其中[]表示参数都是非必要参数,例如%d中只包含了%typecode
(name)参数:当%后面是字典数据类型(类似于枚举)时,需要加上该参数。根据对应的括号里的key查找对应的值,例如:
print("%(1)d,%(2)d" % ({"1": 1, "2": 2}))
输出结果为:
width参数:用于规定输出Numbers变量的长度,如果是小数,则会算上小数部分,若规定长度大于实际长度则默认左侧补空格(想补0可以用flag参数设置),也可以用flag参数规定右侧补(下面会说),例如:
print("%3d" % 2)
输出结果是(左侧自动补2个空格):
flag参数:也是只针对Numbers数据类型,有三个flag,空格、-与0
,flag默认是输出右对齐
空格(为输出的数值左侧自动填充一个空格,这是为了正数于负数的对其):
print("% d" % 2)
结果为:
负号代表输出格式左对齐:
例如:
print("%-3d" % 2)
输出结果为:
零代表位数不足补0
例如:
print("%03d" % 2)
结果为:
2.4 python的程序执行顺序语句
2.4.1 选择语句(只有if,else,无switch,case)
if语句和c的写法相似,以缩进代替了大括号,且不用写判断逻辑的括号,后再加个冒号即可。例如(if,elif,else):
if 1 > 2:
print("你好")
elif 1 > 1:
print("我好")
else:
print("结束")
输出结果是“结束”
2.4.2 循环语句
2.4.2.1 while循环
python中while中多了一个else,表示当while后面表达式为flase时执行else的结果,在python中,循环的地方通常用while,而for则更多用于遍历一个集合里的元素
i = 0
while i < 10:
print("哈哈")
i += 1
else:
print(i)
输出结果:
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
哈哈
10
注意:当while循环体中有break语句时,直接跳出循环,不执行else中的内容,并且python没有do…while语句
2.4.2.2 for循环
for通常用于遍历字符串或列表,同样也可以和else搭配使用,例如:
Str = "我是被遍历对象"
for i in Str:
if i == "象":
print(i)
print(i, end="")
else:
print("遍历完成")
输出结果:
当for用于循环时,常和range函数搭配,例如:
num = 1
for i in range(1, 10):
print(num)
num += 1
输出结果为:
这样就相当于C语言中的for循环了,for(i = 1,i < 10, i++)