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

 数据类型:

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

1. 布尔值bool

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

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

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]。(通常引号引发来)git

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)扩展操做

● 字符串的拆分和拼接github

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

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

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

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

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

● 字符串分割app

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])        #只能以\n符号分割,若是()内为True,保留换行符,为False为不保留换行符。

● 字符串内容替换ide

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()  # 判断是否存在不可显示的字符,如\t、\n
S.isspace()      # 判断是否都是空格
S.endswith(suffix[, start[, end]])   #判断字符串是否以指定字符为结尾,可指定范围 
S.startswith(prefix[, start[, end]]) #判断字符串是否以指定字符为开头,可指定范围

● 字符串其它魔法

S.count(sub[, start[, end]])  #计算指定子序列在字符串的个数,可指定计算范围
S.expandtabs(tabsize=8)       #把字符串中的 tab 符号('\t')转为空格,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

相关文章
相关标签/搜索