Python数据变量和流程控制
2.1 数据类型
2.1.1 整数类型
Python用int来表示整数类型。
2.1.2 浮点数类型
浮点数也就是小数,因为浮点数的小数点位置是浮动可变的,浮点数除了数学写法,还支持科学计数法。浮点数也称为float型。
2.1.3 布尔类型
布尔值只有True、False两种值,对应计算机底层机器编码中的0和1。在Python中,可直接用True、False表示布尔值,也可以通过布尔计算计算出来。例如,3<5会产生布尔值True,而2==1会产生布尔值False。
2.1.4 复数类型
Python支持复数的直接表达形式,例如3+5j。
2.1.5 字符串类型
字符串是以单引号或双引号括起来的任意文本,而且可以书写成多行的形式,也就是三个单引号或双引号开头和结尾。
2.2 变量
2.2.1 命名规则
1)变量名由字母、数字和下划线构成,不能以数字开头。
2)大小写敏感,大写和小写是两个不同的变量。
3)不要跟关键字冲突
2.2.2 使用方法
赋值并不是直接将一个数值赋给一个变量,在Python中赋值是通过引用传递的,引用可理解为存储数值的内存地址,赋值的时候都是在描述该对象的引用赋值给变量。
type()可检查变量类型,然后用print函数输出到屏幕上。
Python可多重赋值和多元赋值。
x=y=z=1
print(x,y,z)//(1,1,1)
x,y,z=1,2,'hello,world'
print(x,y,z)//(1,2,'hello,world')
2.3 字符串和编码
2.3.1 字符串
字符串也是一种数据类型,可通过在引号间包含字符的方式创建字符串变量。
str1="world"
str2='hello'
print(str1,str2)//hello world
转义字符 | 描述 |
---|---|
\ | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\" | 双引号 |
\b | 退格 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
使用双引号或单引号定义字符串时不可以换行,如果必须换行可以使用三重引号,在三重引号之间输入任何内容,在最后字符串会照单全收,包括换行、缩进等。
2.3.2 编码
字符集规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。
Python 3.x默认的字符编码是Unicode,默认的文件编码是UTF-8.
ASCII使用一个字节表示一个字符,而Unicode需要两个字节,这样对于英文文本而言存储空间就多出了一倍,于是就有了UTF-8,简称万国码,可以显示各种语言。利用Unicode的一个包含了全球所有国家语言编码的映射关系的功能,实现了编码转换,所以目前无论以什么编码存储的数据,只要我们的软件把数据从硬盘上读到内存,转成Unicode就可以正确显示出来。由于所有的系统编程语言都默认支持Unicode,所以我们的GBK编码软件放在美国的计算机上,加载到内存里面,变成了Unicode,中文就可以正常显示了。
2.3.3 字符串操作
1.切片操作
str1='Python从小白到大牛'
print(str1[0:6])//'Python'
print(str1[6:12])//'从小白到大牛'
print(str1[:6])//'Python'
2.字符串拼接
str1='Python'
str2='从小白到大牛'
print(str1+str2)//'Python从小白到大牛'
print(str1*5)//PythonPythonPythonPythonPython
3.字符串运算符
符号 | 描述 |
---|---|
+ | 字符串连接 |
* | 重复输出字符串 |
[ ] | 通过索引获取字符中的字符 |
[:] | 字符串切片 |
in | 成员运算符 |
not in | 非成员运算符 |
4.字符串格式化
str1='Python'
print('%s从小白到大牛'%str1)//Python从小白到大牛
5.字符串内建函数
-
find()函数:可以在较长的字符串中查找某一个或几个字符,返回字符串所在位置的最左端索引,如果没有返回-1
-
split()函数:根据某个特定字符或符号来分割字符串,如果不提供分割符,默认空格为分割符
-
lower()函数:返回字符串的小写字母
-
upper()函数:将所有字母大写
-
title()函数:将字符串转换为标题,也就是单词首字母大写,其余小写。
-
replace()函数:返回某字符串的所有匹配项均被替换后得到的字符串
print('This is a test'.replace('is','IS'))//'ThIS IS a test'
-
index()函数:从序列中查找某个元素的第一个匹配项的索引位置,没有找到就报错。
-
startswith()函数:判定字符串是否是以指定字符开头,返回布尔值,可以指定检测范围
-
strip()函数:用于移除字符串首位指定的字符,默认删除空格,lstrip()移除左侧,rstrip()移除右侧
2.4 数字和运算符
2.4.1 数和四则运算
数据有类型,变量无类型。第一,方便内存管理,第二,弱化了变量的类型声明。
2.4.2 关于数字的内建函数
除了加减乘除四则运算外,其他运算方法Python也能处理,但要实现需要Python中一个模块math。
2.5 列表
如果用简单的数字类型表达复杂的数据,就会存在大量简单数据对象,存放和管理这些对象成为问题,以列表为代表的容器数据类型解决复杂的数学问题。
2.5.1 List定义
park=['BMW','奔驰','大众','别克','路虎']
print(park)//['BMW','奔驰','大众','别克','路虎']
print(park[0],park[-2],park[1:-1],park[:2])//'宝马''别克'['奔驰','大众','别克']
print(park[:2]+['Ferrari','比亚迪'])//['宝马','奔驰','Ferrari','比亚迪']
park[2]='帕萨特'
print(park)//['宝马','奔驰','帕萨特','别克','路虎']
park=['宝马','奔驰']
park.insert(0,'Honda')
print(park)//['Honda','宝马','奔驰']
del park[0]
print(park)//['宝马','奔驰']
2.5.2 索引和切片
park[0:2]=['本田','丰田']
print(park)//['本田','丰田','帕萨特','别克','路虎']
park[0:2]=[]
print(park)//['帕萨特','别克','路虎']
park[1:1]=['马自达','jeep']
print(park)//['帕萨特','马自达','jeep','别克','路虎']
2.5.3 反转
list1=[1,2,3,4,5]
print(list(reversed(list1)))//[5,4,3,2,1]
2.8 从底层理解内存管理
Python内存管理是由私有堆空间管理的,可以理解为一块拥有连续编号的内存,所有对象和数据结构都存储在私有堆空间中。程序员没有访问这块内存空间的权限,只有解释器才有权访问。为Python的堆空间分配内存的是Python的内存管理模块,核心接口只会提供一些访问该模块的方法供程序员使用。
1.对象的内存使用
每个对象都存有指向该对象的变量总数,即引用计数
2.对象引用对象
列表可以包含多个元素或者对象,实际上列表包含的并不是对象本身,而是指向各个元素对象的内存地址引用。如果两个对象相互引用,就有可能构成所谓引用环,即使是一个对象,只要自己引用自己,也能构成引用环,但这会给垃圾回收机制带来很大麻烦。
3.引用减少
在一个列表中删除一个元素,引用对象的引用计数就有可能减少。如果这个变量指向别的内容时,引用计数也会减少。
4.垃圾回收
理论上说,当一个对象引用计数降为0的时候,说明没有任何引用指向对象,该对象就会清除。然而垃圾回收时,Python不能进行其他任务,频繁垃圾回收会大大降低Python工作效率。当Python运行时,会记录分配对象和取消分配对象的次数,两者的差值高于某个阈值时,垃圾回收才会启动。
Python作为一种动态类型语言,其对象和引用分离的机制,与面向过程的编程语言有很大区别。为了达到有效释放内存的目的,Python采用相对简单的垃圾回收机制,即引用计数。但这种机制会带来新问题——孤立引用环,涉及更复杂的垃圾回收算法。
3.1 条件语句
3.1.1 if-else
age=17
if age>=18:
print("我们已经是成年人了")
else:
print("我们是未成年人")
//我们是未成年人
3.1.2 if-elif-else
age=3
if age >=18:
print("我们已经是成年人了")
elif age>=6:
print("我们是未成年人")
else:
print("我们是儿童")
//我们是儿童
3.1.3 if嵌套
proof=10
if proof < 20:
print("驾驶员不构成酒驾")
else:
if proof < 80:
print("驾驶员已构成酒驾")
else:
print("驾驶员已构成醉驾")
//驾驶员不构成酒驾
3.2 循环语句
3.2.1 while循环
sum=0
n=100
while n > 0:
sum=sum+n
n=n-1
print(sum)//5050
3.2.2 for循环
result=0
for i in range(101):
result+=i
print(result)//5050
a_list=['Python','C','Java']
for ele in a_list:
print("当前语言是:",ele)
3.2.3 循环嵌套
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d'%(i,j,i*j),end='\t')
print()
//九九乘法表
3.3 循环语句中的List解析
a=[n for n in range(1,100) if n%3==0]
print(a)
//被3整除的结果
3.4 break和continue语句
i=0
while i<6:
i+=1
if i==4:
break;
print(i)
//1 2 3
i=0
while i<6:
i+=1
if i==4:
continue;
print(i)
//1 2 3 5 6
3.6 初识算法
数据结构加上算法等于可执行程序。
算法可定义为在有限步骤内解决数学问题的程序。
例:如果a+b+c=1000,且a2+b2=c^2,求出所有a b c 的组合。
import time
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001):
for c in range(0,1001):
if a**2+b**2==c**2 and a+b+c==1000:
print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print(end_time-start_time)
//程序运行1285秒
import time
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001-a):
c=1000-a-b
if a**2+b**2==c**2:
print("a,b,c:%d,%d,%d"%(a,b,c))
end_time=time.time()
print(end_time-start_time)
//程序运行16秒
对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是算法效率的主要部分,而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n2和100n2属于同一量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率差不多。