Python是一种动态语言,与C/C++很是不同。从数据的定义到编程调试思路都有很大的不同,本人从C/C++入门编程,在了解Python中与C/C++相交互。
基础数据结构:
与C++语言相同,最基础的都是int,float,string,bool类型。python特殊的是在不需要定义声明类型。例如:
a = 1
a = "123qsx"
a = 1.0001
直接定义,使用很方便。而且很不能理解的是这个变量a可以直接被赋值不同的类型,然后使用print(a)进行打印还都打印成功了。如例子:
a = 1
print(a)
a = "123"
print(a)
a = True
print(a)
打印如下:
1
123
True
这样在具体编程中会不会有什么问题?就算是重名了也不会报错而是直接覆盖值吗?这个后续得注意一下。
那么a是否是一个万能指针的意思?可以指向不同类型数据空间?不是很理解!也许是需要记住一句话:一切皆是对象。举个例子:
a = 123456
print(id(a))
print(id(123456))
a = "123456"
print(id(a))
print(id("123456"))
打引出的结果是前两个是同一个地址,后两个是也是同一个地址,两个地址是不同的。我对一切皆是对象的理解暂时,python是没有任何内置的类型,都是类的实例化。而这个地址就是对象的内存空间,而对a的重新赋值实际上是将a指向了新的对象内存空间。再做一个例子:字符串变量的len函数,实际上就是去调用了字符串对象的__len__()函数。
a = "asd"
print(len(a)) #常见做法
print(a.__len__()) #一切皆对象~!与上面表示相同
结果是:3 3!
再介绍一个python自带的函数dir(),dir()可以显示一个对象的属性列表:
a = 1
print(dir(a))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
这时对python的一切皆对象的理解就更加深刻了,再看下面的例子,就可以很好的得出答案。
a = 'ABC'
b = a
a = 'XYZ'
print(b)
答案是'ABC',a是重新指向了'XYZ'这个对象,但是b还是指向原来的'ABC'。
List
与C++不同的还有list列表,十分灵活好用。它就如同一个万能模板数组,可以存储int的数组与字符串数组。甚至混合数组,太好用了。但是也会越界,不同的还有取值的方面,正常如同C一样的0,1,2,3在里面还是可以使用表示列表的第一个第二个第三个,但是竟然可以输负数,-1,-2,-3表示倒数的1,2,3哦。更多操作看例子,这使用起来超舒服应该吧!
a = [1,2,3]
a = ["1","2","3"]
a = [1,"2","3"]
print(a[0]) #第一个
print(a[-1]) #最后一个
print(a)
a.append("4") #最后添加一个参数
print(a)
a.insert(1,"1") #将参数“1”插入指定位置,其他后移
print(a)
a.pop(3) #删除指定位置的值,不填默认是最后一个
print(a)
a[1] = "hello" #直接赋值也可以
b = [8,"1"]
a.append(b)
print(a) #参数可以是个列表嵌套,可以看成是二维数组
print(a[-1][1])
输出:
1
3
[1, '2', '3']
[1, '2', '3', '4']
[1, '1', '2', '3', '4']
[1, '1', '2', '4']
[1, 'hello', '2', '4', [8, '1']]
1
好像有点小问题,为什么列表中的带“”的字符变成了没有字符的?这个是因为print直接把我的“1”变成1还是表示字符串滴。
我本以为list的本质是链表啊,那么灵活,还可以在中间删除插入,而实际上是数组?!
Tuple
无论怎么看list都像是万能的,那这个独特的tuple元组是干什么的呢?
因为list太过于灵活了!而在某些情况下需要更安全的list-----tuple.元组的参数数目是不可变的,指向的空间不能改的,而空间中的内容是可以更改的。list与tuple可以互相调用,满足更多需求。
本文参考文档: