Python学习二《数据类型介绍》
一,为什么在其他语言中需要声明数据类型而Python中不需要?
如:a,b=b,a
这个也与python中a代表地址有关,其它语言中把值赋给a的同时也限制了a的类型,其它语言中a代表的就是一个实实在在的量,而python中a代表的是指向这个量的地址,这个地址可以指向任何类型数据的存储空间,指向整型,a就是整型,指向字符串,a就是字符串,指向函数对象,a就是函数对象,这就是python中的隐式声明。
每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 等号(=) 用来给变量赋值。 等号(=) 运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
变量的值变更的过程其实只是变量内部的地址值变更。所以不论变量值是什么类型,均可以使用一段地址值来进行表示,
地址值指向的是什么类型,就是什么类型。
二,Python的六个标准数据类型介绍:
1,Numbers(数字)
2,String(字符串)
3,List(列表)
4,Tuple(元组)
5,Set(集合)
6,Dictionary(字典)
其中某些资料中,将Boolean(布尔值)、None(空值)也单独作为一个数据类型,所以八个。也有将日期等作为数据类型,可进行不同的分类。
三,Python支持四种不同的数字类型
int(有符号整型)
long(长整型【也可以代表八进制和十六进制】)
float(浮点型)
complex(复数)
四,Python字符串(String)
1,一个个字符组成的有序的序列,是字符的集合。
2,使用单引号、双引号、三引号yin'zhu。
3,字符串是不可变对象。
4,Python3起,字符串就是Unicode类型。
5,字符串定义的初始化
6,字符串元素访问----下标
字符串支持使用索引访问:字符串是常量,不能通过索引方式来进行赋值。
有序的字符集合,字符序列:
可迭代:
7, 字符串join连接
“String”.join(iterable)-->str
将可迭代对象连接起来,使用String作为分隔符
可迭代对象本身元素都是字符串
返回一个新字符串
8,字符串“+” 连接
将2个字符串连接在一起
返回一个新的字符串
9,字符串分隔
分隔字符串的方法分为2类
split系:split(sep=None,maxsplit=-1)
从左到右,sep指定分隔字符串,缺省的情况下空白字符串作为分隔。
maxsplit指定分隔的次数,-1表示遍历整个字符串
将字符串按照分隔符分隔成若干字符串,并返回列表。
附注:splitline([keepends])--->list of Strings
按照行来切分字符串
keepends 指的是是否保留行分隔符
行分隔符包括\n,\r\n \r等
partition系
partition(sep) ---> (head,sep,tail) 将字符串按照分隔符分隔成2段,返回这2段和分隔符的元组。
从左至右,遇到分隔符就把字符串分隔成两部分,返回头、分隔符、尾三部分的元组,
如果没有找到分隔符,就返回头、2个空元素的三元组。
sep分隔字符串,必须指定。
10,字符串大小写
upper() 全大写
lower() 全小写
大小写,做判断的时候用
swapcase() 交互大小写
11,字符串排版
title() ---> str 标题的每个单词都是大写
capitalize() ----> str 首个单词大写。
center(width[,fillchar]) --->str width 打印宽度,fillchar:填充的字符
zfill(width) --->str :width 打印宽度,居右,左边用0填充
ljust(width[,fillchar]) --->str 左对齐
r(width[,fillchar]) -----> 右对齐
中文用的少,了解下。
12,字符串修改
replace(old,new[,count])----> newString
字符串用某个新的字符串替代旧的字符串,返回一个新的字符串
count表示替换几次,不指定就是全部替换
strip([chars]) ---> str
从字符串两端去除指定的字符集chars中的所有字符
如果chars没有指定,去除两端的空白字符
lstrip([chars]) ---> str 从左开始
rstrip([chars]) ---> str 从右开始
13,字符串的查找
find(sub[,start[,end]]) ---> int
在指定的区间(start,end),从左至右,查找子串sub,找到返回索引,找不到,返回-1
rfind(sub[,start[,end]]) ---> int
在指定的区间(start,end),从右至左,查找子串sub,找到返回索引,找不到,返回-1
index(sub[,start[,end]]) --->int
在指定的区间(start,end),从左至右,查找子串sub,找到返回索引,找不到抛出异常ValueError
rindex(sub[,start[,end]]) --->int
在指定的区间(start,end),从右到左,查找子串sub,找到返回索引,找不到抛出异常ValueError
时间复杂度:index和count方法都是O(n),随着列表数据规模的增大,效率降低
len(string):返回字符串的长度,即字符的个数。
count(sub[,start[,end]]) --->int
在指定的区间,从左到右,统计子串sub出现的次数。
14,字符串判断
endswith(suffix[,start[,end]]) --->bool
在指定的区间(start,end),字符串是否存在suffix结尾
startswith(suffix[,start[,end]]) --->bool
在指定的区间(start,end),字符串是否存在suffix开头
15,字符串判断is系列
isalnum() ---> bool是否是字母或者数字组成
isalpha() --->是否是字母
isdecimal() --> 是否只包含十进制数字
isdigit()----> 是否全部数字(0-9)
isidentifier() ---> 是否字母和下划线开头,其他都是字母、数字、下划线
islower() ----> 是否都是小写
isupper() ---> 是否全部都是大写
isspace() ----> 是否只包含空表字符
16,字符串格式化
字符串的格式化是一种拼接字符串输出样式的手段,更灵活方便
方式一:通过printf-style 的形式 %d,%s,%f
方式二:format字符串格式化操作
使用变量来替换字符串中的{ }
方式三:f字符串格式化 Python3.6版本支持
五,列表(list[])
1, 一个队列,一个排列整齐的队伍
2,列表内的个体称作为元素,由软肝元素组成列表
3,元素可以是任意对象(数字,字符串,对象,列表等)
4,列表内元素有顺序,可以使用索引
5,线性的数据结构
6,使用中括号[] 表示,
7,列表是可变的
#列表的初始化,不能一开始就定义列表的大小。
lst = list() lst=[] lst=[2,6,9,'abc'] lst=list(rangs(5))
8,列表的索引访问
索引:也叫做下标,注意下标越界问题
正索引:从左到右,从0开始,为列表中每一个元素编号。
负索引:从右到左,从-1开始。
列表通过索引访问:list[index] ,index就是索引,使用中括号访问。
9,列表的查询
index(value,[start,[stop]])
通过值value,从指定区间查找列表内的元素是否匹配
匹配第一个就立即返回索引。
匹配不到,抛出异常ValueError
count(value)
返回列表中匹配value的次数。
时间复杂度
index和count方法都是O(n)
随着列表数据规模的增大,而效率下降
如何返回列表元素的个数?如何遍历?如何设计高效?
len()列表的长度
10,列表元素的修改
索引访问修改
list[index] = value
注意索引不能越界
11,列表增加、插入元素
append(object) -- > None
列表尾部追加元素,返回None
返回None就意味着没有新的列表产生,就地修改
时间复杂度是O(1)
insert(index,object) -->None
在指定的索引index处插入元素Object
返回None就意味着没有新的列表产生,就地修改
时间复杂度是O(n),造成元素结构变化,尽量少用
索引能超上下界吗?超越上界,尾部追加;超越下届,头部追加。
extend(iteratable) -- > None
将可迭代对象的元素追加进来,返回None
就地修改:如果可迭代对象特别大时,需谨慎使用。
+ -> list
连接操作,将两个列表连接起来
产生新的列表,原列表不变
本质上调用的是_add_()方法
* -> list
重复操作,将本列表元素重复n次,返回新的列表
如果里面是引用类型的内容,比如元组、列表等,用的时候需非常小心。
12,列表删除元素:
remove(value) --> None
从左至右查找第一个匹配value的值,移除该元素,返回None
就地修改
效率:不好
pop([index]) --> item
不指定索引index,就从列表尾部弹出一个元素
指定索引index,就从索引处弹出一个元素,索引超界掏出IndexError
效率?指定索引的时间复杂度?不指定索引呢?
clear() -- > None
清除列表所有元素,剩下一个空列表。
13,列表的其他操作
reverse() --> None
将列表元素反转,返回none
就地修改。
sort(key=None,reverse=False) --> None
对列表元素进行排序,就地修改,默认升序。
reverse为True,反转,降序
key一个函数,指定key如何排序
lst.sort(key=functionname)
in
[3,4] in [1,2,[3,4]]
for x in [1,2,3,4]
14,列表的复制
<1> 通过 = 号拷贝
<2> 通过copy 来进行浅拷贝:也称为影子拷贝,遇到引用类型,只是赋值了一个引用而已。
<3> 深拷贝
copy模块提供了deepcopy
总结:如果只是读取不修改,那么只要进行浅拷贝就可以,如果需要修改,注意深拷贝和浅拷贝的区别。
六,元组(Tuple)
1,一个有序的元素组成集合
2,使用小括号()表示
3,元组是不可变的对象
4,元组的定义 初始化
定义:
tuple()---> empty tuple
tuple(iterzble) -->tuple initialized from iterable's items
5,元组元素的访问
支持索引(下标)
支持正索引和负索引
正索引不可越界,否则会引发异常IndexError
元组通过索引访问
tuple[index],其中index就是索引,使用中括号
6,元素的查询
index(value,[start,[stop]])
通过值value,从指定区间查找列表内的元素是否匹配
匹配第一个就立即返回索引
匹配不到,抛出异常ValueError
count(value)
返回列表中匹配value的次数
时间复杂度
index和count方法都是O(n)
随着列表数据规模的增大,而效率下降
len(tuple)
返回元素的个数
7,元组的其他操作
元组是只读的,所以增,改,删的方法都没有
8,命名元组namedtuple
帮助文档中,查阅namedtuple,有使用列程
namedtuple(typename,field_names,verbose=False,rename=False)
命名元组,返回一个元组的子类,并定义了字段
filed_name可以是空白符或逗号分隔的字段的字符串,可以是字段的列表。
七,随机数(random模块)
1,需要random模块
2,random(a,b)返回[a,b]之间的整数
3,choice(seq)从空序列的元素中随机挑选一个元素,比如random.choice(range(10)) ,从0-0之间随机挑选一个。
random.choice([1,3,5,7])
4,randrange([start,]stop[,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省为1.
random.randrange(1,7,2)
5,random.shuffle(list) --> None 就地打乱列表元素
6,sample(Population,k)从样本空间或者总体(序列或者集合类型)中随机取出K个不同的元素,返回一个新的列表
random.sample(['a','b','c','d'],2)
random.sample(['a','a'],2) 会返回什么结果