基本数据类型和基础语法
1. 数字:
int 123456899899
float 3.2 1.5E6
complex 1+2j
2. str 字符串 "hello"
3. list 列表 [1,2,'ok',4.3]
4. tuple 元组 (1,2,3)
5. dict 字典 {'a':20,'b':30,49:50}
一、数字
1. 整数
可以任意长,有10进制、2进制、8进制、16进制
x = int()
x = int(17)
整数运算:
+,-,*,%,与c++同
/ 结果是浮点数
// 整数除法,与c++同
x ** y 求x的y次幂
位运算同C++,但没有符号位的问题
2. 布尔类型
常量:True, False
True = 1
False = 0
0 -> False 其他都是 True
逻辑运算符: and or not
空 str, tuple, list, dict 都是 False
3. 浮点类型
判断浮点数相等:
import sys
def equal_float(a,b):
return abs(a-b) <= sys.float_info.epsilon
#最小浮点数间隔,32位机为 2e-16
print(equal_float(1.0,1.0)) # True
sys.float_info
import sys
print(sys.float_info)
'''
sys.float_info(max=1.7976931348623157e+308,
max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021,
min_10_exp=-307, dig=15, mant_dig=53,
epsilon=2.220446049250313e-16, radix=2, rounds=1)'''
浮点运算
import math
x = 123.50
print(round(x)) #不精确,如print(round(119.49999999999999999)) => 120 print(math.floor(x))
print(math.ceil(x))
print(12.3.is_integer())
print(12.00.is_integer())
s = str(14.25) #转字符串
print(s)
'''
124
123
124
False
True
14.25
'''
高精度浮点数decimal.Decimal
import decimal
from decimal import *
a = decimal.Decimal(98766)
b = decimal.Decimal("123.223232323432424244858484096781385731294")
print(b)
c = decimal.Decimal(a + b) #精度缺省为小数点后面28位
print(c)
getcontext().prec = 50 #设置精度为小数点后面50位
print(c)
c = decimal.Decimal(a + b)
print(c)
'''
123.223232323432424244858484096781385731294
98889.22323232343242424485848
98889.22323232343242424485848
98889.223232323432424244858484096781385731294
'''
二、字符串
1. 字符串不可修改
2. 不转义的字符串
print(r'ab\ncd') # ab\ncd
3. 用 'a' in S, 'a' not in S判断子串'a'是否在字符串S中
4. S.count('s') 求子串's'在S中出现次数
5. len(S)求S的长度
6. S.upper(), S.lower() 转大写、小写
7. S.find(), S.rfind(), S.index(), S.rindex() 查找;找不到find 返回-1;index抛出异常
s="1234abc567abc12"
print(s.find("ab")) # 4
print(s.rfind("ab")) #10
try :
s.index("afb")
except Exception as e:
print(e) # substring not found
8. S.replace() 替换
s="1234abc567abc12"
b = s.replace("abc","ABC")
print(b) # 1234ABC567ABC12
print(s) # 1234abc567abc12
9. S.isdigit(), S.islower(), S.isupper() 判断是否是数,大小写等
s="1234abc567abc12"
print(s.islower()) # Ture
10. S.startswith("abc"), S.endswith("xyz") 判断是否以某子串开头、结尾
s="1234abc567abc12"
print(s.startswith("123")) # True
11. S.strip(), S.lstrip(), S.rstrip() 除去空白字符,包括空格, '\r' '\t' '\n'
print ( " \t12 34 \n ".strip()) # 12 34
print ( " \t12 34 5".lstrip()) # 12 34 5
12. S.split(",") 字符串分割,返回值是一个列表
print( " \t12 34 ,ab\n ".split()) #用空格,回车,制表符分割
print( " \t12 34 ,ab,cd\n ".split(",")) #用‘,’分割
y = " \t12,.34 ,ab,.cd\n ".split(",.") #用 ",." 字符串分割 print(y[1])
print('A123AA456AA7A'.split('A'))
13. 用多个字符进行分割(re是regular expression模块)
import re
a = 'Beautiful, is; better*than\nugly'
print(re.split(';| |,|\*|\n',a)) #分隔串用 | 隔开
# ['Beautiful', '', 'is', '', 'better', 'than', 'ugly']
14. 字符串的编码在内存中的编码是unicode的,没有字符类型
print (ord("a")) # 97
print(ord("好")) # 22909
print(chr(22900)) # 奴
print(chr(97)) # a
15. 字符串的格式化 {序号:宽度.精度.类型}
> : 右对齐
< : 左对齐
^ : 中对齐
x = "Hello {0} {1:10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
print(x) # Hello Mr. Jack ,you get $3.2000
x = "Hello {0} {1:>10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
print(x) # Hello Mr. Jack,you get $3.2000
print("Today is %s.%d." % ('May',21)) # Today is May.21.
三、元组
1. 一个元组由数个逗号分隔的值组成,前后可加括号
2. 元组相当于C++中的 vector, 各种操作复杂度亦然。可认为是个指针数组。数组元素不可修改,不可增删元素,元素指向的东西可以修改
t = 12345, 54321, 'hello!'
print(t[0]) # 12345
print(t) # (12345, 54321, 'hello!')
u = t, (1, 2, 3, 4, 5)
print(u) #((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
t[0] = 88888 #元组的值不能修改,运行错误
# 元组可以包含可修改的对象
v = ("hello",[1, 2, 3], [3, 2, 1]) # [1,2,3]是列表
v[1][0] = 'world'
print(v) # ('hello', ['world', 2, 3], [3, 2, 1])
print(len(v)) # 3 求长度
3. 单元素元组
empty = () #空元组
singleton = 'hello', # <-- note trailing comma
print(len(empty)) # 0
print(len(singleton)) # 1
x = ('hello',) #无逗号则x为字符串
print(x) # ('hello',)
4. 用下标访问元组
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0]) # tup1[0]: Google
print ("tup2[1:5]: ", tup2[1:5]) # tup2[1:5]: (2, 3, 4, 5)
5. 可以对元组进行连接组合
tup1 = (12, 34.56);
tup2 = ('abc', 'xyz')
# 创建一个新的元组
tup3 = tup1 + tup2;
print (tup3) # (12, 34.56, 'abc', 'xyz')
6. 元组运算和迭代
x = (1,2,3) * 3
print(x) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
print(3 in (1,2,3)) # True
for i in (1,2,3):
print(i)
# 1
# 2
# 3
7. 拷贝元组,“=”赋值是深拷贝
x = (1,2,3)
b = x
print(b is x) # true
x += (100,)
print (x) # (1, 2, 3, 100)
print (b) # (1, 2, 3)
8. 用元组定义二维数组
matrix = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
print(matrix) # ((1, 2, 3), (4, 5, 6), (7, 8, 9))
print(matrix[1][1]) # 5
9. 元组的排序
from operator import *
students = (
('John', 'A', 15), # 姓名,成绩,年龄
('Mike', 'B', 12),
('Mike', 'C', 18),
('Bom', 'D', 10))
print(sorted(students,key = itemgetter(0,1)))
#[('Bom', 'D', 10), ('John', 'A', 15), ('Mike', 'B', 12), ('Mike', 'C', 18)]
五、列表
1. 列表相当于C++中的 vector,各种操作复杂度亦然。可认为是个指针数组;列表中的元素可以修改,可以增删
empty = [] #空表
list1 = ['Google', 'Runoob', 1997, 2000];
list2 = [1, 2, 3, 4, 5, 6, 7 ];
print ("list1[0]: ", list1[0]) # list1[0]: Google
print ("list2[1:5]: ", list2[1:5]) # list2[1:5]: [2, 3, 4, 5]
list1[2] = 2001
print ("更新后的第三个元素为 : ", list1[2]) # 更新后的第三个元素为: 2001
2. 列表的切片;列表的切片返回新的列表
a = [1,2,3,4]
b = a[1:3]
print(b) # [2, 3]
b[0] = 100
print(b) # [100, 3]
print(a) # [1, 2, 3, 4]
3. 列表的拷贝可以是浅拷贝,也可以是深拷贝
a = [1,2,3,4]
b = a #a, b是同一个对象
print(b is a) # True
b[0] = 5
print(a) # [5, 2, 3, 4]
b += [10] # [5, 2, 3, 4, 10] ,原地添加,和元组不同
print(a) # [5, 2, 3, 4, 10]
print(b) # [5, 2, 3, 4, 10]
a = [1,2,3,4]
b = a[:] # b是a的拷贝
b[0] = 5
print(a) # [1, 2, 3, 4]
b += [10]
print(a) # [1, 2, 3, 4]
print(b) # [5, 2, 3, 4, 10]
如果是列表之中套列表,需要通过函数来进行深拷贝
a=[1,[2]]
b=a[:]
b.append(4)
print(b) #=> [1, [2], 4]
a[1].append(3)
print(a) #=> [1, [2, 3]]
print(b) #=> [1, [2, 3], 4]
# 未能进行深拷贝!
import copy
a = [1,[2]]
b = copy.deepcopy(a)
b.append(4) #=>[1, [2], 4] print(b)
a[1].append(3)
print(a) #=>[1, [2, 3]]
print(b) #=>[1, [2], 4]
4. 列表生成式(python太强大了)
[x * x for x in range(1, 11)]
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[x * x for x in range(1, 11) if x % 2 == 0]
# [4, 16, 36, 64, 100]
[m + n for m in 'ABC' for n in 'XYZ']
# ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
L = ['Hello', 'World', 18, 'Apple', None]
[s.lower() for s in L if isinstance(s,str)]
# ['hello', 'world', 'apple']
[s for s in L if isinstance(s,int )]
# [18]
5. 处理输入
while True:
s = input() #读取一行
if s.strip() == "":
continue; # 除去空白字符之后如果为空,就continue
a = s.split(' ')
b = [x for x in a if x != ''] # 除去空串
name,age,gpa = b[0],b[1],b[2]
print(name,age,gpa)
6. 列表函数
append (value) 添加1个元素
extend (list) 添加其他表中的元素
insert,remove,reverse
index 查找
len(x) 求列表x长度
a = [1,2,3]
b = [5,6]
a.append(b) # [1, 2, 3, [5, 6]]
a.extend(b) # [1, 2, 3, [5, 6], 5, 6]
a.insert(1,'K') # [1, 'K', 2, 3, [5, 6], 5, 6]
a.insert(3,'K') # [1, 'K', 2, 'K', 3, [5, 6], 5, 6]
a.remove('K') # [1, 2, 'K', 3, [5, 6], 5, 6]
a.reverse() # [6, 5, [5, 6], 3, 'K', 2, 1]
a.index('K') # 4
print(len(a)) # 7
map(function, sequence),将一个列表(元组)映射到另一个列表(元组)
filter(function, sequence),按照所定义的函数过滤掉列表(元组)中的一些元素
def f1(x):
return x * 2
def f2(x):
return x % 2 == 0
ls = [1,2,3,4,5]
ls1 = list(map(f1,ls)) # map 延时求值
print(ls1) #=>[2, 4, 6, 8, 10]
ls1 = list(filter(f2,ls)) # filter 延时求值
print(ls1) #=>[2, 4]
def f1(x):
return x * 2
def f2(x):
return x % 2 == 0
ls = (1,2,3,4,5)
ls1 = tuple(map(f1,ls))
print(ls1) #=>(2, 4, 6, 8, 10)
ls1 = list(filter(f2,ls))
print(ls1) #=> [2, 4]
map 高级用法(把列表中的每一个元素都进行相应的函数操作)
def abc(a, b, c):
return a*10000 + b*100 + c
list1 = [11,22,33]
list2 = [44,55,66]
list3 = [77,88,99]
x = list(map(abc,list1,list2,list3))
print(x) #=> [114477, 225588, 336699]
reduce(function, sequence, startValue),将一个列表累积(accumulae)起来
from functools import reduce
def f2(x,y):
return x+y
ls = [1,2,3,4,5]
print(reduce(f2,ls)) #=>15
print(reduce(f2,ls,10)) #=>25
7. 用列表定义二维数组
错误的做法
array = [1, 2, 3]
matrix = [array*3]