在python中,数据以对象的形式出现,无论是python提供的内置对象,还是使用python拓展库创建的对象。对象无非就是内存中的一部分,包含数值和相关操作的集合。python脚本中的一切皆对象,连带有值的数字也如此。对象是最基本的概念。
如果你使用过较低层的语言(例如c),应该知道很大一部分工作集中于使用对象去表现应用领域的组件。你需要部署内存结构,管理内存分配,实现搜索和读取例程等。这些乏味的工作往往背离程序的真正目标。
在python中,提供了强大的对象类型作为语言的组成部分,称之为内置对象。可以让工作更加有效率。
数字————123, 3.14,
字符串————“abc”
列表————[1,2,3,2]
集合————{1,2,3}
元组————(1,2,3)
字典————{"food":"spam"}
文件————open("egg.txt")
其他核心类型————类型、None、布尔型
程序单元类型————函数、模块、类
python是一门动态强类型语言。
一般而言,在编译器就确定变量类型的是静态类型语言,在运行期才确定变量类型的则是动态类型语言。
一般而言,编译器很少隐式类型转换的是强类型语言,有较多隐式类型转化的是弱类型语言。
python内置的数字类型有整数、浮点数等等,python中的数字支持一般的数字运算。+表示加法,*代表乘法,**代表幂。
字符串用来记录文本信息和任意的字节集合。它是序列类型中的一员,序列中的元素包含了一个从左到右的顺序——序列中的元素根据它们的相对位置进行存储和读取。从严格意义上来讲,字符串是由单字符的字符串组成的序列,其他序列类型还有列表和元祖。
python中通过索引来对序列镜像操作,索引从0开始。还能反向使用索引,负的索引表示从最后一个开始。
>>>s="abcdefg"
>>>s[0]
"a"
>>>s[-1]
"g"
序列还支持一种分片的操作,这是一种可以一步提取整个分片的方法。
>>>s
"abcdefg"
>>>s[1:3]
"bc"
运用表达式X[ I : J ]来进行提取分片,主要这是一个前闭后开的区间,索引为J的位置是不包含在里面的。I默认为0,J默认为序列总长度。
字符串支持使用+进行拼接,用*来表示重复。
>>>s1="abc"
>>>s2="defg"
>>>s1+s2
"abcdefg"
>>>s1*3
"abcabcabc"
+对于不同的对象有不同的意义,用于数字时,表示加法,用于字符串时表示拼接,这是python的特性,也就是多态。简而言之就是一个操作的意义取决于被称作对象。多态的特性给python代码带来了很大的简洁性和灵活性。
字符串在python中具有不可变性质——在创建后不能在原位置上进行改变。换句话来说,你永远不能覆盖不可变对象的值,不能通过对其某一位置进行赋值而改变字符串,但你总能创建一个新的字符串并以同一个变量名对其赋值,python在运行过程中会清理旧的对象。
通过内置函数id()来获取对象内存地址。
>>>a="abc"
>>>id(a)
2725359126832
>>>a="defg"
>>>id(a)
2725362266544
除了一般的序列操作外,字符串还有一些独特的方法进行操作,方法指依赖并作用于对象上的函数,并用通过一个调用表达式触发。
find方法可以对字符串查找其子字符串是否存在,存在返回第一个子字符串偏移量,不存在返回-1
>>>s="abcdefg"
>>>s.find("cd")
2
>>>s.find("xyz")
-1
replace方法对全局进行搜索并替换。第一个参数表示查找的字符串,第二个表示替换成什么的字符串,返回值为替换后的字符串
>>> s.replace("ab","AB")
'ABcdefggggABcdef'
当一行代码里一个对象在调用一个方法后继续调用另外一个对象时,python会遵循从左到右的执行顺序,每次前一步方法调用结束,都会为后一步方法调用产生一个临时的对象。
python的工具库是呈层级分布的,可用于作用多种类型的通用操作都是以内置函数或者表达式的形式出现(例如len(x),x[0]),但是类型特定的操作以方法调用的形式出现。
可以使用内置函数dir来展示一个对象的所有细节,这个函数列出了在调用者作用域内,形式参数的默认值,还会返回一个列表,包含了对象的所有属性。由于方法是函数属性,他们也会在这个列表中出现。
以双下划线开头并结尾的变量名表示python实现细节的方法,比如_add_是真正执行字符串拼接的函数,python内部将+映射到_add_,但还是尽量避免使用_add_(这不仅十分隐晦,而且还会让程序运行得更慢)。
没有双下划线的属性是对象能够调用的方法。
通过help()可以查询方法的细节。