zoukankan      html  css  js  c++  java
  • 第二篇*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

  • 相关阅读:
    mysql 查看存储过程 并导出
    mysql 添加记录或者删除记录
    mysql 修改表的字段
    搭建docker私有仓库
    安装gitlab并配置邮箱
    Mac 安装MySQL-python
    android studio 调试安装
    给定日期求星期几
    数字三角形
    程序设计实训-课程表管理系统项目中遇到的问题
  • 原文地址:https://www.cnblogs.com/chenyuting/p/8418724.html
Copyright © 2011-2022 走看看