数据类型与一些注意点
python是动态语言。和静态语言的区别在于前者在运行时确定数据类型(无需声明类型),后者在编译时就确定数据类型(如java)。动态语言更灵活,静态语言更安全
- 整数相除是精确值。想要得到整数可以用
// - 字符串单双引号都可以,转义用
\ - print默认换行,想不换行可以这样
print('不换行',end='') - 用and表示&&,用or表示||
- 以缩进来替代了c++与java 的括号功能,实现逻辑控制
- 空值表示:
None -
`a='a' b=a`这两行代码表示:创建字符串a,变量a指向字符串。变量b也指向字符串。
字符串相关
字符串处理往往常见又容易忘,特此整理
字符编码
- 最开始的ASCII码占1个字节。
- 涉及到中文或其他语言需要其他编码方式,于是出现了各种各样的标准。
- Unicode出现统一各种语言的编码,占2字节
- UTF-8出现优化Unicode的所占空间,ASCII码是UTF-8编码的子集哦
python3默认以Unicode编码。
常见字符串处理
#ord()与chr()
# 这样类似C++的方式是不对的
a ='1'
b=a-'0'+1
#应该这样:ord函数获取字符的整数表示,chr函数把编码转换为对应的字符
a ='1'
b = ord(a)-ord('0')
c = chr(b+ord('0'))
# 或者用更简单的类型转换
a= '1'
b=int(a)
print(b+1)
print(str(b))
#len()
len('中文') # 统计字符数
len('中文'.encode('utf-8')) #编码后的是bytes类型的(byte数组?),统计的是字节数
# 输出格式
print('%2d %02d' % (3, 1))
print('%.2f' % 3.1415926)
# 待增加
数据结构
列表list
类比vector。索引从0开始,-i表示倒数第i个
# 列表a = ['a',1,['1',2]]
print(len(a))
# 末尾增删
a.append(3)
a.pop()
# 指定索引增删
a.insert(0,'ADD')
a.pop(0)
#切片
b= a[:3] #索引0到索引3,不包括3
b = a[-2:] #倒数第二个到索引0,不包括0
#列表生成式(range(1,11)表示1-10)
a= [x*x for x in range(1, 11) if x%2==0] #if作过滤
a= [m + n for m in 'ABC' for n in 'XYZ'] # 全排列
a= [x if x % 2 == 0 else -x for x in range(1, 11)] # if在前面作映射
tuple元组
不可变list(指引用不可变,指向列表时,列表本身可以变。元组要想完全不可变,需要里面的每个元素本身不可变)
# 元组
a = (1,'a',[1,2],(3,4))
print(len(a))
# ,结尾消除歧义
b = (1) # 表示的1这个数而不是元组
b = (1,)
# 不可变理解
a[1]=2 # 报错
a[2][0]=2 # 元组中的列表第一个元素变为2
#转换为list
b=list(a)
dict字典
key必须是不可变对象。内部存储并不按存入的逻辑顺序
# dict
d = {'a':1,'b':'c',2:'d'}
# 判断key是否存在
if 'a' in d :
print('exist')
# 赋值与获取
d['a']=2
print(d['a']) #不存在则会报错
print(d.get('k')) #不存在则返回None
print(d.get('k','self_define')) #不存在则返回自定义的
# 删除
d.pop('a')
set集合
#set
s = {1, 1, 2, 3}
print(s)
# 增删
s.add(4)
s.remove(1)
# 集合操作
s2 = {0,2}
var1 = s & s2 #交集
var2 = s | s2 #并集
函数
函数参数与返回值
多返回值: 返回的是元组,可以用多个参数接收
def f(a,b):
return a,b
x,y = f (1,2)
默认参数:传入时可以少传参数
def f(a,b=2):
return a,b
x,y = f (1)print(y)
可变参数:加*,接收的是一个元组
def f(*num):
return num[0]
#直接传数字
k=f(1,2,3)
#如果本来定义好了,则这样传
l=[1,2,3]
k=f(*l)
关键字参数:加**,接收dict
def f(**num):
return num['b']
d={"a":1,"b":2}
k=f(**d)
命名关键字参数: 看着有点鸡肋,感兴趣可以看廖雪峰博客
map/reduce/filter
与spark,以及java里的stream是类似的操作。map和filter操作会返回一个迭代器。
-
map:做映射
def f(x): return x+x b=list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) -
reduce:做聚合,下面是做了累加
#reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) from functools import reducede f f(a,b): return a+b b=reduce(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) -
filter:做过滤,下面过滤了偶数
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
闭包:函数返回值为函数
内部函数可以引用外部函数的参数和局部变量
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f1=lazy_sum(1,2,3)
f2=lazy_sum(1,2,3)
f1()
注意点:
-
返回的f1为函数,执行f1()时才真正执行逻辑
-
返回的f1与f2时不同的
-
由于最后再执行,所以返回函数中不要引用任何可能会变化的变量,如下:
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() #最后函数执行结果都为9,因为i已经变成3了
lambda函数(匿名函数)
即用lambda表达式来表示函数。冒号前面为入参,后面为return的值。改写map如下:
b=list(map(lambda x:x+x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
函数名
函数也是对象。
def my_name():
print("name")
# 函数对象赋值给变量f
f = my_name()
f()
#获取名字
print(my_name.__name__)
print(f.__name__)
偏函数(用的少)
使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
import functools
int2 = functools.partial(int, base=2)
int2('1000000')
#原来需要 int('1000000',2):2进制的转换为int
生成器
生成器:可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。有函数next()。hasnext()。一般用for循环
# 列表生成式的[],改为()。就变成了生成器
g = (x * x for x in range(10))
# 函数实现:整个函数返回的就是生成器
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
f = fib(10) # 每次yield相当于往迭代器放入一个元素
排序
sort+sorted;如何自定义排序(python3不再支持cmp)
#sorted不改变原列表
b = [36, 5, -12, 9, -21]
a=sorted(b, key=abs)
print(b)
#sort改变原列表
b.sort(key=abs)
print(b)
# 按一列递增,另一列递增排序。lamda的方式无法实现自定义递减(是数字可以加个负号实现)
student = [['Jack', 'A', 18], ['Jack', 'C', 20], ['Andy', 'B', 11]]
student.sort(key=lambda student: (student[0],student[2]))
print(student)
# 按一列递增,另一列递减排序。自定义函数
import functools
def cmp(x,y):
if(x[0]>y[0]):
return 1
if (x[0] < y[0]):
return -1
if(x[2]>y[2]):
return -1
if (x[2] < y[2]):
return 1
return 0
student = [['Jack', 'C', 18], ['Jack', 'A', 20], ['Andy', 'B', 11]]
student.sort(key=functools.cmp_to_key(cmp))
print(student)
# b=sorted(student,key=functools.cmp_to_key(cmp))