第二篇*1、Python基本数据类型

 数据类型:

变量可以处理不同类型的值,基本的类型是数和字符串。使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。
Python3 中有六个标准的数据类型:
Number(数字),String(字符串),List(列表),Tuple(元组),Sets(集合),Dictionary(字典)

1. 布尔值bool

布尔值类型: True,False
布尔运算类型: 与and、或or、非not

False: None,"",{},(),[], 0

a = True
print a and 'a=T' or 'a=F'  #计算结果不是布尔类型,而是字符串 'a=T'。因为Python的False只有几种,其他数值和非空字符串都看成 True,所以,计算结果是 'a=T',继续计算 'a=T' or 'a=F' 计算结果还是 'a=T',

2. 字符串

1)定义

是由零个或多个字符组成的有限串行。一般记为s=a[1]a[2]...a[n]。(一般引号引起来)

2) 基本操作

str.index()             # 索引字符
str[N]                  # 索引,可为负值
str[n:m]                # 切片,可为负值
len()                   # 求序列长度
str1 + str2             # 加法:“+”连接字符串连接2个序列  
str1 * n                # 乘法:“*” 重复序列元素,就是重复那个字符串的含义。
in                      # 判断元素是否存在于序列中
max()                   # 返回最大值--ASCII编码
min()                   #返回最小值--ASCII编码
cmp(str1,str2)          #比较2个序列值是否相同,首先将字符串中的符号转化为对应编码的数字,然后比较。如果返回的数值小于零,说明第一个小于第二个,等于0,则两个相等,大于0,第一个大于第二个。

3)扩展操作

● 字符串的拆分和拼接

str2 = str1.split("sep")     #将字符串根据某个sep(分割符)分割成多个字符串组成的列表,默认为空格。
str2 = "sep".join(interable) #将序列中的元素以指定的字符sep连接生成一个新的字符串。列表、元组和字符串都是序列。

● 默认去掉字符串空格:原来的值没有变化,而是新返回了一个结果。也可以指定去除内容(序列或者字符),或者指定内容的子序列

S.strip()   #去掉字符串的左右空格、	、
,也可以指定去除内容(序列或者字符),或者指定内容的子序列
S.lstrip()  #去掉字符串的左边空格、	、
, 也可以指定去除内容(序列或者字符),或者指定内容的子序列
S.rstrip()  #去掉字符串的右边空格、	、
,也可以指定去除内容(序列或者字符),或者指定内容的子序列
str = '12a2b12c212'
print(str.strip('12'))  #a2b12c    删除头尾的1和2
print(str.lstrip('12'))  #a2b12c212     删除开头的1和2
print(str.rstrip('12'))  #12a2b12c    删除结尾的1和2

● 字符大小写的转换:用来实现各种类型的大小写转化

S.upper()     #将S中的字母转换为大写
S.lower()     #将S中的字母转换为小写
S.casefood    #将S中的字母转换为小写,更强大
S.swapcase()  #将S中的字母的大小写全转换
S.title()     #将S中字符串中所有的单词转换成首字母都是大写
S.capitalize()  #首字母大写
S.isupper()  #S中的字母是否全是大写
S.islower()  #S中的字母是否全是小写
S.istitle()  #S中字符串中所有的单词拼写首字母是否为大写,且其他字母为小写

● 字符串填充/宽度设置

S.center(width[, fillchar])  #设置S的宽度,字符串内容在中间,以第二个参数为填充字符,填充字符只能指定一个,可不填,默认为空格
S.ljust(width[, fillchar])   #指定宽度和填充字符,内容放左边,右边填充指定字符,默认填充字符为空格
S.rjust(width[, fillchar])   #指定宽度和填充字符,内容放右边,左边填充指定字符,默认填充字符为空格
S.zfill(width)               #指定宽度,不可指定字符,内容放右边,左边填充0

● 字符串分割

S.partition(sep)                # 从左边起,找到第一个指定的字符sep,将左右两边进行切割,分割为3份。第二份为指定字符sep
S.rpartition(sep)               # 从右边起,找到第一个指定的字符sep,将左右两边进行切割,分割为3份。第二份为指定字符sep
S.split(sep=None, maxsplit=-1)  # 从左边起,找到所有指定的字符sep,将左右两边抽离,分割为n份。指定maxsplit=1则只找一个,左右两边分割一次,匹配的sep不会出现。
S.lstrip([chars])               # 从右边起,找到所有指定的字符sep,将左右两边抽离,分割为n份。指定maxsplit=1则只找一个,左右两边分割一次,匹配的sep不会出现。
S.splitlines([keepends])        #只能以
符号分割,如果()内为True,保留换行符,为False为不保留换行符。

● 字符串内容替换

S.maketrans(self, *args, **kwargs)  #给定替换规则(“m”,“n”)e.g. x=S.maketrans("abc","123")
S.translate(table)                  #按照给给定的替换规则进行替换,类似翻译。e.g. y = S.translate(x) ,if S=abcda, print(y)为123d1
S.replace(old, new[, count])        #字符串替换,把old 替换成new,默认全体替换,可指定替换个数,即替换前面n个数

● 字符串内容判断

S.isalnum()      # 判断字符串是否只包含数字和字母,是返回True,包含其他的字符返回False
S.isalpha()      # 判断字符串是否只包含字母,是返回True,包含其他的字符返回False
S.isdecimal()    # 判断是否为数字
S.isdigit()      # 判断是否为数字,对特殊数字也适用。例如②
S.isnumeric()    # 判断是否都是数字,对中文数字也适用。最牛
S.isidentifier() # 判断是否为标识符
S.isprintable()  # 判断是否存在不可显示的字符,如	、

S.isspace()      # 判断是否都是空格
S.endswith(suffix[, start[, end]])   #判断字符串是否以指定字符为结尾,可指定范围 
S.startswith(prefix[, start[, end]]) #判断字符串是否以指定字符为开头,可指定范围

● 字符串其它魔法

S.count(sub[, start[, end]])  #计算指定子序列在字符串的个数,可指定计算范围
S.expandtabs(tabsize=8)       #把字符串中的 tab 符号('	')转为空格,tabsize用来断句,默认8个字符,即以8个字符为一个断句标准,不足以空格补全。
S.find(sub [,start [,end]])   #查找给定子序列的第一个位置,返回索引值,可指定范围,未找到时返回-1
S.format(*args, **kwargs)     #格式化,将字符串中的占位符替换成指定值
S.format_map({*args: m, **kwargs: n})  #格式化,将字符串中的占位符替换成指定值,必须提供键值对
S.index(sub [,start [,end]])             #查找给定子序列的第一个位置,返回索引值,可指定范围,未找到时返回出错

4) 格式化字符串

待续。。。

 3.  列表

1) 定义

       在python中,用方括号 [ ] 表示一个list。在方括号里面,可以是int,也可以是str类型的数据,甚至也能够是True/False这种布尔值,或者嵌套一个列表。list中的元素是任意类型的。

2) 判断

       bool()是一个布尔函数,作用就是来判断一个对象是“真”还是“空”(假)。如果list中什么也没有,就是空的,用bool()函数来判断,得到False,从而显示它是空的。

3) 生成

 生成list:range()函数和for循环的引用 # e.g. print [ x * y for x, y in zip(range(1,100,2),range(2,101,2))]

4) 修改

      这种修改,不是复制一个新的,而是在原地进行修改。内存地址不变。其存储为链式存储。

5)切片和索引

       list和str两种类型的数据,有共同的地方,它们都属于序列(都是一些对象按照某个次序排列起来,这就是序列的最大特征)。
       索引都是从左边开始编。第一个是0,然后依次增加1。此外,还有一种编号方式,对于list,既然Python支持L[-1]取倒数第一个元素就是从右边开始,右边第一个可以编号为-1,然后向左依次是:-2,-3,...,依次类推下来。这对字符串、列表等各种序列类型都是用。
       序列的切片,左边的数字一定要小于右边的数字。不包括右边的数据。切片结果为新的list。 同样支持倒数切片取倒数。切片操作还可以指定第三个参数:第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。把list换成tuple,切片操作完全相同,只是切片的结果也变成了tuple。

list[:]            #复制出了一个新list。
list[::-1]         #反转,不是在“原地”把原来的值倒过来,而是新生成了一个值,那个值跟原来的值相比,是倒过来了。等同于list(reversed(list0))
list[1:3] = [x, y] #切片赋值

6) 基本操作

len(L)          # 求列表长度 e.g. lst = [1,2,3] len(lst) = 3
L[i]=()         # 替换第i个元素 e.g. lst[2]=(4) = [1,2,4] 
L1+ L2          # 连接2个序列,连接列表 e.g. alst = [5, 6] lst + alst = [1, 2, 3, 4, 5, 6]
L*n             # 重复序列元 素“*” 字符串中的“乘法”,就是重复那个列表的含义。blst = st * 2 = [1,2,3,1,2,3] 
x in list             # 判断元素是否存在于序列中 e.g. x in lst : False
L.append(object)      # 即将新的元素x追加到list的尾部,等效于:a[len(a):]=[x] e.g. lst.append("like") = [1,2,3,like]
cmp(L1,L2)            # 比较2个序列值  e.g.cmp(lst,alst) == False
L.extend(iterable)    # append是整建制地追加,extend是个体化扩编。
    # e.g. lst.append(["qiwsir","github"]) = [1, 2, 3, ['qiwsir', 'github']]; lst2.extend(["qiwsir","github"]) = [1, 2, 3, 'qiwsir', 'github']
L.count(value)        # 计算元素个数 e.g.deblst.count(2) = 2
L.index(value, [start, [stop]])     # 获得索引位置 e.g.lst.index(2) = 1 
L.insert(index, object)             # L.insert(i,x) 在i位置插入元素x e.g. lst.insert(2,"x") = [1,2,x,3]  
del L[n:m]            # 删除元素
L.remove(value) # 移除元素 lst.remove(1) = [2,x,3] L.pop([index]) # 移除索引值位置的元素,L.pop([i]) e.g. list.pop([1]) = [1,x,3] L.reverse() # 列表反转 e.g. lst.reverse () = [3,2,1] L.sort(key=None, reverse=False) # lst.sort(reverse=True) = [3,2,1] L.sort(cmp=None, key=None, reverse=False) -- stable sort IN PLACE; cmp(x, y) -> -1, 0, 1 # lst = ["python","java","c","pascal","basic"]; lst.sort(key=len) =['c', 'java', 'basic', 'python', 'pascal'] L.clear() # 清空列表,参数为空:None 表示 remove all items from L L.copy() # 拷贝列表,浅拷贝

 7) list和str转化

str.split() # S.split([sep [,maxsplit]]) -> list of strings 这个内置函数实现的是将str转化为list。其中str=""是分隔符。返回字符串S中的单词列表,使用sep作为分隔符字符串。 如果给出maxsplit,则最多可以完成maxsplit拆分。 如果未指定sep或无,则空格字符串为分隔符,并从结果中删除空字符串。
"[sep]".join(list) or list(str)  # 字符串转换成列表

4.  元组

1)特点

    用圆括号()括起来的,其中的元素之间用逗号隔开。(都是英文半角)元组只有一个元素的时候(特别是数或者字符串),记得添加“,”才是元组

* 元组中的元素类型是任意的python数据。
* tuple是一种序列类型的数据,这点上跟list/str类似。它的特点就是其中的元素不能更改,这点上跟list不同,倒是跟str类似;它的元素又可以是任何类型的数据,这点上跟list相同,但不同于str。元素不能被增加或删除。tuple指向的list,list可变,所以tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',“可变”是指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!要创建一个内容也不变的tuple,那就必须保证tuple的每一个元素本身也不能变。即一级元素不可变。

* 如果一个元组中只有一个元素的时候,应该在该元素后面加一个半角的英文逗号:因为()既可以表示tuple,又可以作为括号表示运算时的优先级,结果 (1) 被Python解释器计算出结果 1,导致我们得到的不是tuple,而是整数 1。所以 Python 规定,单元素 tuple 要多加一个逗号“,”,这样就避免了歧义。

 2) 索引和切片

 可以正常使用 t[0],t[-1]等索引方式访问元素,但是不能赋值成别的元素。

3) tuple使用的情景:

A.  Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。
B.  如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。
C. Tuples 可以在 dictionary(字典,后面要讲述) 中被用做 key,但是 list 不行。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。
D. Tuples 可以用在字符串格式化中。

4) 列表和元组:用list()和tuple()能够实现两者的转化

5) 基本用法

T.count(value)                  #计算某个值的出现个数
T.index(value, [start, [stop]]) #返回索引位置

5. 字典

1) 特点

 *  查找速度快:无论dict有10个元素还是10万个元素,* 查找速度都一样。而list的查找速度随着元素增加而逐渐下降。不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。由于dict是按 key 查找,所以,在一个dict中,key不能重复。

 * 存储的key-value序对是没有顺序,无序 

 * 作为 key 的元素必须不可变:Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。

 * 可遍历:for

2) 创建

 *  花括号 {} 表示, key: value,最后一个 key: value 的逗号可以省略。

 * 在字典中的“键”,必须是不可变的数据类型;“值”可以是任意数据类型。列表可以修改,所以列表是可变的;字符串和元组都不行,所以它们是不可变的。字典可以原地修改,即它是可变的。列表,字典不能作为key。布尔值True=1, False=0,当与其他key值重复的时候,会出现冲突,其可以当成key的。

  * 直接创建:
 a. 创建一个空的dict,这个空dict,可以在以后向里面加东西用。

mydict = {}

 b. 创建有内容的dict。

person = {"name":"qiwsir","site":"qiwsir.github.io"}

"name":"qiwsir":键值对。前面的name叫做键(key),后面的qiwsir是前面的键所对应的值(value)。在一个dict中,键是唯一的,不能重复。值则是对应于键,值可以重复。键值之间用(:)英文的冒号,每一对键值之间用英文的逗号(,)隔开。

 * 利用元组建构字典

name = (["first","Google"],["second","Yahoo"])      
website = dict(name)                 #website = {'second': 'Yahoo', 'first': 'Google'}
ad = dict(name = "qiwsir", age = 42) #ad = {'age': 42, 'name': 'qiwsir'}

 * 使用fromkeys,这种方法是重新建立一个dict。

website = {}.fromkeys(("third","forth"),"facebook")  #website = {'forth': 'facebook', 'third': 'facebook'}

3) 访问dict的值

dict数据类型是以键值对的形式存储数据的,所以,只要知道键,就能得到值。这本质上就是一种映射关系。通过字典的“键”找到相应的“值”。通过“键”能够增加dict中的“值”,通过“键”能够改变dict中的“值”,通过“键”也能够访问dict中的“值”。字典没有索引。

person = {'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
person['name']       #'qiwsir'
person['language']   #'python'

4)基本操作

len(d)          # 返回字典(d)中的键值对的数量
d[key]          # 返回字典(d)中的键(key)的值
d[key]=value    # 将值(value)赋给字典(d)中的键(key)
del d[key]      # 删除字典(d)的键(key)项(将该键值对删除)
key in d        # 检查字典(d)中是否含有键为key的项

5)要避免 KeyError 的两个办法:

key in d

先判断一下 key 是否存在,用 in 操作符:

dict.get()

使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None。

 6) 其他操作

D.clear()                       #Remove all items from D
D.copy()                        #浅拷贝
D.get(k[,d])                    #-> D[k] 获取key的value值,获取不到返回None
D.items()                       #D.iteritems(...)
D.keys()                        #获取字典的key集合
D.values()                      #D. itervalues()
D.pop(k[,d])                    #删除指定键的键值对。
D.popitem()                     #随机删除字典的键值对。
D.setdefault(k[,d])             #设置键值对,若存在不设置,获取当前的key对应得值,不存在的话,添加。
D.update([E, ]**F)              #更新键值对。存在的覆盖,不存在的更新上去。e.g. dic.update({'k1':'111','k2':'123'})  or dic.update({k1=111,k2=123}) 
dict.fromkeys(*args, **kwargs)  #根据序列创建字典,指定的值统一。参数只能两个,静态方法 e.g. v=dict.fromkeys(["k1",123],123); v={"k1":123, 123:123}

6. 集合set

1)定义

 由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key。即列表,字典不可以,数字,字符串,元组可以。

2)特点

不同的集合间用来做关系运算,无需纠结于集合中单个值.list和dict的杂合。set拥有类似dict的特点:可以用{}花括号来定义;其中的元素没有序列,也就是是非序列类型的数据;而且,set中的元素不可重复,这就类似dict的键。

3)创建

用set()来创建集合,即创建的集合可变。

s2 = set([123,"google","face","book","facebook","book"])   #set(['facebook', 123, 'google', 'book', 'face'])

使用{}的方式创建集合,但无法创建含有list/dict元素的set。这种方式不提倡使用,因为在某些情况下,python搞不清楚是字典还是集合。创建的集合可变。

>>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> s3 = {"facebook",[1,2],123}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

集合另一个创建方法是用frozenset(),hashable类型,不能在原处修改。即创建的集合不可变。

f_set = frozenset("qiwsir")            # frozenset(['q', 'i', 's', 'r', 'w'])
f_set.add("python")                    #报错,不能修改,则无此方法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
a_set = set("github")                  #对比看一看,这是一个可以原处修改的set, set(['b', 'g', 'i', 'h', 'u', 't'])
a_set.add("python")                    #set(['b', 'g', 'i', 'h', 'python', 'u', 't'])

4) 关系运算

in            #属于  
not in        #不属于
A==B          # A等于B,即两个集合的元素完全一样或使用A!=B           
A<B           #A是B的子集,或者反过来,B是否是A的超集。即A的元素也都是B的元素,但是B的元素比A的元素数量多。判断集合A是否是集合B的子集,可以使用A<B,返回true则是子集,否则不是。另外,还可以使用函数A.issubset(B)判断。
A<=B
A>B
A>=B
A|B.          #A、B的并集,即A、B所有元素。可以使用的符号是“|”,是一个半角状态写的竖线,输入方法是在英文状态下,按下"shift"加上右方括号右边的那个键。找找吧。表达式是A | B.也可使用函数A.union(B),得到的结果就是两个集合并集,注意,这个结果是新生成的一个对象,不是将结合A扩充。
A|=B          #合集
A & B         #交集,A、B的交集,即A、B所有的元素:A & B 或A.intersection(B)
A&=B
 A - B        #A相对B的差(补),即A相对B不同的部分元素: A - B或A.difference(B)
^,^=          #对称差分
(A-B)|(B-A)   # A、B的对称差集:(A-B)| (B-A)或A.symmetric_difference(B) 

 5) 其他操作

S.add(self, *args, **kwargs)              #添加元素
S.clear(self, *args, **kwargs):           #清空元素
S0=S.copy(self, *args, **kwargs):     #拷贝集合
S.pop(self, *args, **kwargs):             #随机删除一个元素
S.remove(self, *args, **kwargs):          #删除某个指定元素,如果元素不存在,会报错。 e.g. S.remove('sb')
S.discard(self, *args, **kwargs):         # 与remove功能相同,删除元素不存在时不会抛出异常
S.union(self, *args, **kwargs):           # 求并集,相当于s1Us2
S.difference(self, *args, **kwargs):      #求差集,相当于s1-s2
S.difference_update(self, *args, **kwargs):     #求完交集求补集,相当于s1=s1-(s1&s2)
S.intersection(self, *args, **kwargs):          #求交集,相当于s1&s2 e.g. s1.intersection(s2)
S.intersection_update(self, *args, **kwargs):   # 求交集之后将结果赋值给S,相当于s1=s1&s2
S.symmetric_difference(self, *args, **kwargs):  # 求交叉集的补集,相当于s1^s2      ((s1-(s1&s2))U((s2-(s1&s2))
S.symmetric_difference_update(self, *args, **kwargs): #求交叉集的补集,并赋值给S。相当于:s1=((s1-(s1&s2))U((s2-(s1&s2))
S.update(self, *args, **kwargs):           #把新的可迭代的值更新到S
S.isdisjoint(self, *args, **kwargs):       # 判断是否有交集
S.issubset(self, *args, **kwargs):         # 判断s1是否包含于s2,即s1是否为s2的子集,相当于s1<=s2
S.issuperset(self, *args, **kwargs):       #判断s2是否包含于s1,即s2是否为s1的子集,相当于s1>=s2

 

《参考文献》

https://www.cnblogs.com/wupeiqi/articles/5433893.html

http://www.cnblogs.com/linhaifeng/articles/5935801.html

http://www.cnblogs.com/wupeiqi/articles/5444685.html

https://www.cnblogs.com/nulige/p/6102645.html

http://www.cnblogs.com/alexzp/p/3377921.html

原文地址:https://www.cnblogs.com/chenyuting/p/8418724.html