--基本对象类型

Posted TonyW92

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了--基本对象类型相关的知识,希望对你有一定的参考价值。

导读



学一门语言,最先需要了解的就是这门语言的一些基本类型和数据结构。
在python里有一句非常重要的话,我先写在开头
对象有类型,变量无类型
这句话对于常写java的同学来讲非常别扭,我们通过下面的介绍来深刻体会下弱类型语言的简单和强大 引用句python开发经常讲的话,生命苦短,我用python

简单的字符串和数字



字符串和数字对于所有编程语言应该都不陌生
对于一些强类型的语言比如Java数字型还会进行细分(根据整数,浮点数,数字的长度,有无符号)
在python里可以用type()这个内建函数去查看一个对象的类型

比如
>>type(3)
<class 'int'> 
>>type("hello")
<class 'str'>

单一的数字或者字符串没有使用的意义,只有把它和引用联系到一起才能赋予它意义。
回到我们刚刚那句话:对象有类型,变量无类型

习惯写Java的同学都知道申明一个String类型的变量

String str = "hello";

str这个变量只能被String类型赋值
而且python中却不是这么会事

>>str = "hello"
>>print(s) //注意python3和python2中print发生了变化 在python中变成了函数
hello
>>str = 5
>>print(str)
5

str这个变量可以被指定成任何类型对象赋值

字符串



接下来我们详细讲下刚使用过的字符串,从以下几个功能展开分析

1. 拼接字符串
python和绝大多数的语言一样用’+’号拼接
但是和Java有所区别的是int和String不能直接用+号拼接,会抛出异常
比如

>>s = "hello"
>>i = 1024
>>print(s + i)
会抛出一个TypeError:unsupported operand type(s)

这时候需要手动把数字型转化成字符串
试试s + str(i)
str(…)可以把数字转化成字符串,类似Java的String.valueOf()


2.索引和切面

>>lang = "hello"
在给lang变量赋值的同时,也生成了一份lang的索引

索引通俗点将就是可以根据下标得到我们需要的元素,也可以根据下标去赋值。联想下Java里的数组就明了了。
比如lang[0] 就是h
如果输入超过字符串索引大小的下标,就会引起IndexError
反之也可以通过字符去匹配当前字符串,得到对应的索引下标

比如
>>lang.index("l")
2

注意不管有几个’l’返回的都是第一个遇到的下标
但是如果你输入一个当前字符串没有的字符,就会报一个ValueError的错误
比如

>>lang,index("a")
会抛出ValueError:  substring not found

当面如果我们对一个长字符串一个个这么操作十分繁琐,我们可以引出一个切面的概念
切面:通过字符串的索引得到字符的过程

举个例子
还是
>>lang = "hello"
>>sction = lang[1:3]
>>sction
el
我们可以得到'el'这个结果
通过这个例子我们可以得出一个结果切面的end下标是不被包括进去的[1:3]实际得到的是1,22个下标

一些基本操作
len() 返回序列长度

>>len("hello python")
12
  • 拼接字符串
  • 重复序列
    in 判断元素是否在字符串里
>>"abc" in "haha abc" 
true

max() 返回最大值
min() 返回最小值

>>eg. max("abcdefg")
'g'

>>min("abcdefg")
‘a'

cmp(str1, str2) 比较两个序列是否相同

格式化输出
预先使用占位符在模板预留位置做好标记,后期用特定字符替代占位符

占位符
%s 字符串
%c 单个字符
%b 二进制整数
%d 十进制整数
%e 指数
%f 浮点数(小数)

比如

>>print("today is my %s day to learn  %s" % ("first", "python"))   
还有一种新版的格式化 format
>>s= "today is my 0 day to learn  1".format("first", "python")  
当然还有字典格式化输出
>>print("today is my %(day)s day to learn  %(language)s" % "day":"first", "language":"python")     
结果都是 today is my first day to learn python
个人比较喜欢第二种


列表



特点可变
[]表示一个list,和一般强类型语言不一样的地方是,这个list里面的元素可以是任意类型
数字型,字符型,布尔型都可以放在一个list里

比如
>>a=[1,2,3,"4"]

列表也存在索引和切片
索引和一般语言一致,用下标取出当前list放的值
a[1]就是2
a[3]就是”4”
反向操作
a.index(5)也会抛出和字符串一致的ValueError的错误
切面也一致
a[1:4]得到[2,3,”4”]

反转
a[::-1]就可以得到一个a的反转列表
注意是得到一个新的列表,a本身并没有发生任何变化

追加元素
a.append(6)就可以把6放在list的尾部
如果想放到前面,可以使用双向列表deque,有兴趣的自行了解

合并列表
a.extend(L) 将L合并到a后面

插入元素
a.insert(i, x) i就是位置,x就是将要插入的元素

删除元素
list.remove(x) 输入删除元素内容
list.pop([i]) 输入删除下标

排序
list.sort()
sort还可以指定排序依据,比如list.sort(key=len)就是根据长度排序

重要特性
列表可变,可修改,这也是列表和元组之间最大的差别。
不管对列表进行append()操作还是extend操作,列表的内存地址都不变。
使用id(L)可以证明这点
不可变的另一个特点就是没有返回值

元组



()元组
特点不可变,这是与类别的区别

注意
>>a=(3) 
>>type(a)
<class 'int'>
>>b=(3,)
>>type(3,)
<class 'tuple'>
当元组只有一个元素的时候需要加上,不然就不是元组了

和list相互转化
tuple() list()

还记得刚刚的格式化输出吗?

>>s= "today is my 0 day to learn  1".format("first", "python")  

这里用的就是元组,元组还可以用作字典的键值

字典



空字典 类似于Java中的HashMap
键不可变,不能用list

基本操作

len(d) 返回字典的键数量
d[key] 返回键对应的值
d[key]=value 给键赋值
del d[key]删除键值对
key in d 字典中是否包含键为key的项


字典的一些方法
copy和deepcopy 浅拷贝和深拷贝
dict1= dict2.copy()这是浅拷贝

import copy
dict1= copy.deepcopy(dict2)这是深拷贝

对于有良好java基础的人来说,这非常好理解,一个是引用执行堆上同一块内存,一个变,另一个跟着一起变
深拷贝就是在堆上开辟新的一块内存,把list1的值一模一样在新的内存上写一遍,list1的变动不会影响list2

clear
dict.clear()
没什么好说的,清除当前字典内容

增加键值对
非常简单
dict[“key2”] = “value2”
给一个新键赋值,就能增加一个键值对了

还有一些其他方法可以自行学习下

集合


set是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.

集合可以用2种方式赋值

>>s1 = set("sset")
>>s1
't', 's', 'e'
由这个小例子可以看到set的无序性和不可重复性,明明输入了2个ss,得到的集合中只有1个

>>s = "set"
>>s2
'set'
这种方式在python中不提倡,会和字典的赋值搞混,
比如
>>s3 = [1,2,3]
TypeError: unhashable type: 'list'
就会抛出这么一个错误

hash对于熟练掌握java的程序员再熟悉不过了。但在python里,hashable和java中有点小区别,它还表示当前对象不可变,像之前介绍过的list和dictionary,都明确指出可以原地修改,比如list.append(“x”)后,地址不发生变化,就是unhashable.
而stirng和tuple都是不可修改的,是hashable.

同时s[0] = “set”
这种通过索引修改集合值得方式也是禁止的,会抛出TypeError:’set’ object does not support item assignment这个错误

常用函数

set.add("value") 在随机位置增加一个元素

set.update(set2) 合并一个集合

set.pop() 随机弹出一个元素,并删除

set.remove("value") 指定删除某个元素,如果不存在就抛出KeyError的异常,所以建议使用

set.discard("value") 删除指定元素,如果不存在就什么也不做

这个就类似Java中的Json的opt和get

"value" in set 查看集合中是否存在某个元素

关于集合,当然离不开交 并 补这些概念了

可以使用set1.issubset(set2) 查看set1是否是set2的子集,换句话说 set2是否包含set1所有元素
也可以使用set2.issuperset(set1) 查看set2是否是set1的超集

并集的查看使用的是 set1 | s, set1 or set2 或者set1.union(set2) 再或者set2.union(set1) 没有任何区别

交集的查看是 set1 & set2, set1 and set2 或者set1.intersection(set2) 反之也行

还有一些相对差的方法 大家有兴趣可以自行研究下

总结


有了数字,字符串,列表,元组,字典和集合我们对python基本对象就有了一个大致的了解
其余的对象我们可以在使用的过程中慢慢积累他们的用法,对于python这门语言只要熟练掌握大多数的API你就是一个高手了!

以上是关于--基本对象类型的主要内容,如果未能解决你的问题,请参考以下文章

Python 数字

Python基础之基本数据类型

JAVA基本数据类型及其转换

pikachu学习——XSS漏洞3种基本类型

Java数据类型——基本类型/包装类型

js常用的数据类型都有哪些