个人觉得一个编程语言的主要内容可以分为数据类型,程序控制流,函数,面向对象这几块。
python的数据类型相对来说更接近PHP,毕竟都是解释型语言,而且变量都采用了弱类型这种形式。相对来说python的更有特色,在变量声明的时候和PHP相似,不用考虑变量类型,但和PHP是用一个包含多类型的容器去实现弱类型不同,python是采用了类似java的包装类的技术,对所有基础类都实现了相应的包装类,声明变量的时候直接按照需要的确切类型使用对应的包装类,至少表面如此,至于底层实现就不清楚了。
常用的基础类型几乎和PHP一致,就不细说了,需要注意的是python的4个容器,list,tuple,dict,set
list可以理解为C++的数组,或者java的容器,当然使用的时候其实更像是php的无key数组,弱类型的语言便利性在这点上无法否认。
tuple相当于常量数组,也就是内容只读的list
dict也叫字典,对应php中的键值对数组和java中的map容器,需要注意的是key具有唯一性
set是一种去重集合,只有value没有key
对于变量的基本操作和认识,用以下代码来说明
a="111" b=111 print(type(a))#type可以用于类型检测 print(type(b)) print(id(a))#id用于显示变量地址 print(id(b)) b=a print(id(a)) print(id(b))#a和b指向同一个地址,可以看出应该是类似于java字符常量池的机制,在节省内存 a="222" print(a) print(b)#b并没有跟着a改变,从这里可以看出并非引用传递,这说明python的变量1地址只表示存储的值的实际地址,并非变量申请的存储空间 c=[1,2,3] d=c print(id(c)) print(id(d)) c[0]=3 print(c) print(d)#d跟着改变,可以看出这里是浅拷贝
对list的常见操作见下面的代码
#声明 a=[0,1,2,3,4,5] #切片,也就是定位element print(a[1]) print(a[2:5])#不包括index是5的element b=[0,1,[0,1,2,["here"]]] print(b[2][3][0])#可以进行级连操作 #一些常用操作 print(len(b))#len为关键字,不能进行b.len()之类的操作 #print(','.join(a))#报错,只有字符串list才能被join a=["0","1","2","3"] print(",".join(a)) #list支持像java中的list容器那样的常见操作 #追加一个元素 a.append("4") print(a) #插入 a.insert(1,"5") print(a) #删除 a.pop(1) print(a) #获取索引 print(a.index("3")) #排序 c=[2,3,6,1,8,4,2] c.sort() print(c) #合并 d=[2,3,"a","b","c"] c.extend(d) print(c)
tuple的使用相对简单,dict的具体使用注意事项和常规操作可以见代码
a=1 b="2" c=3 #d={a:"1",b:"2","3":c,[1,2]:"d"}#字典类型的key必须是基础类型 d={a:"1",b:"2","3":c} print(d) print(d["2"]) print(d[1]) #print(d[5])溢出错误 print(d.get(5,"d don't has this key"))#get比直接使用[key]的方式取值更安全 #获取keys print(type(d.keys()))#直接调用keys获取到的是一种叫dict_keys的特殊数据类型,需要用list转化为list类型 print(list(d.keys())) #获取values print(list(d.values()))#与获取keys类似,同样需要使用list转化 #赋值,方式和php极为相似 d["new"]="new element" print(d) #判断 #如果d中没有value为last的element,新加一个 if not("last" in d): d["last"]="last element" print(d) #删除对应key的element d.pop("last") print(d) #dict合并,实质是用后一个dict对前一个进行更新/覆盖(以key为准进行操作) d.update({"new":"new new element","last":"new last element"}) print(d) #删除,python中del是一个关键字,并不能使用d.del("last")这种方式 del d["last"] print(d) #清空 d.clear() print(d) #拷贝,也就是进行深拷贝 a={"1":"1","2":[1,2,3],"3":{"1":(1,2),"2":[3,4,5]}} b=a.copy(); print(a) print(b) print(id(a)) print(id(b))
需要特别说明的是list,tuple,dict,set这四种类型赋值时候都是浅拷贝,也就是引用赋值,和int,str等基础类型不同
set的使用见代码
print(type(set({})))#set类型 set({1,2,"3"}) #set({1,[]})#set的element只能为基础数据类型 print(set({1,1}))#set的本质是去重容器,声明时候可以是重复的,但最终结果是去重的 #set的常见操作 a=set({1,2,"a","b"}) print(len(a)) #添加元素 a.add("b") a.add("c") print(a)#从顺序上可以看出是乱序的,set的本质是一个无序去重集合 #移除元素 #a.remove("e")#移除不存在的元素会报错 a.remove("b") print(a) #集合运算 a=set({1,2,3}) b=set({3,4,5}) print(a&b)#求交集 print(a^b)#求差集,就是并集减去交集 print(a|b)#求并集 a=set({1,2}) b=set({1,2,3}) c=set({1,2}) #判断一个集合是否是另一个集合的子集 print(a<=b) print(a<=c) #判断一个集合是否另一个集合的真子集 print(a<b) print(a<c)#c和a的元素一致,没有其它非a元素,所以不是真子集
关于数据的其它讨论
a=True#python中的bool值首字母要大写 print(type(a))#bool类型 a=None print(type(a))#NoneType类型,相当于NULL #python中没有const的变量,只是一般会用大写命名类似的变量 PI = 3.14 # 常量 #python中所有基础数据类型还有扩展类型,比如list,dict,set本质都是对象,类似于java的包装类 str() # 字符串对象 int() # 整型对象 float() # 浮点型对象 list() # 列表对象 tuple() # 元组对象 dict() # 字典对象 set() # 字典对象 bool() # 布尔对象 #这些包装类可以用于声明相对应的变量,也可以用于变量转换,相当于java的包装和解包装 print(str(1)) print(int("1")) print(list(tuple(set({1,2,3}))))