Python基础部分3——数据类型的各种用法--[布尔,可变与不可变,int,float,str,list,tuple,dict]

一.数据类型

1.1 数字类型

    1.1.1 整数 int                 例子:age=18   完整写法 age=int(18)      #用来表示整数

        用途:表示整数相关的比如:年龄,等级,编号

        定义方式:age=18,level=10,num=999

        n=int('123123123')    #整数类型只能对字符串内的数字转换为整数,不能加小数点或者字符串

    1.1.2 浮点性 float            例子:age=18.1   完整写法 age=float(18.1)    #用来表示小数点

        n = float('121111')     #浮点性只能对字符串内的数字或者带小数点(最多一个小数点)的数字转换为浮点型

总结:int 与float类型

        1.只能存一个值       2.属于不可变类型

 

1.2 字符串类型 str

    1.用来表示描述性的东西等~

    2.定义方式:name='sudada'    #定义字符串类型需要加引号 (单 '',双 "",三 (''' ''' 或 """ """))

        name='sudada'

        print(type(name))     

        <class 'str'>

   反而言之:name="111111"       引号内"111111"也被定义为字符串类型,或者说加了引号的内容都被认为是字符串  

   当一段内容里面有单引号和双引号时:

    怎么区分:外面用单引号里面就用双引号,反之亦然

    name='my name is "szq"'    

    print(name)

    my name is "szq"

  1.2.1 字符串str的常用操作和内置方法

     1.2.1.1 字符串str优先掌握的操作:

        1、按索引取值(正向取+反向取) :只能取,不能修改索引值

msg='hello'
msg[1]='E'
print(msg)
运行后会报错:提示字符串不能修改
TypeError: 'str' object does not support item assignment

        2、切片--顾头不顾尾([0:3]切片时不能取到最后一个索引值),切片--步长([0:3:2]隔2个步长取一个索引值)

            切片切分的区别:1.切片按照索引取值切分(split)指定分隔符取值

                                            2.切片后得到的值为"字符串类型"切分(split)后得到的值为"列表类型",可将字符串类型的数据通过切分(split)转换为列表类型的数据。

msg='hello world'
print(msg[0:9])     #从'hello world'中取值,取从0开始9结束的索引值
运行后得到     hello wor

print(msg[0:9:2])   #从'hello world'这个值的[0-9]索引数据中取值,每隔2个步长取一个值
运行后得到   hlowr

msg='hello world'
print(msg.split())  #默认以空格分隔
运行后得到['hello', 'world']

 例子如下:切片([0:9])后得到的值为"字符串类型"切分(split)后得到的值为"列表类型"

msg='hello world'
print(type(msg[0:9]))            运行后得到   <class 'str'> 
print(type(msg.split(' ')))      运行后得到   <class 'list'>

        3、长度len   #查看字符串的长度(有几个字符串)

msg = 'hello world'
print(len(msg))
运行后得到
11

        4、成员运算in和not in      #判断某一个值(字符串)是否存在与一个变量中   in 表示存在,not in 表示不存在

msg='szq is baby'

print('szq' in msg)      运行后得到    True

print('szq' not in msg)  运行后得到    False

        5、移除空白strip    strip 首先设定一些需要被移除的字符,然后strip从左右两边开始匹配,当左右两边的任意一个值不等于被移除的字符,那么匹配结束。

        举例说明:

        5.1、name='*** szq* /**',现在我要保留'szq'这个值

name="****_szq**/*"
res=name.strip('*_/')

print(res)
szq                 #打印后得到的值为"szq",而字符"szq"左右两边的其他符号" * /"都被移除了

        5.2、name='s   /   *** szq* /**',现在我要保留'szq'这个值

name='s   /   *** szq* /**'
res=name.strip('* /')

print(res)
s   /   *** szq

    这里得到的值为"s   /   *** szq",因为strip('* /')(要移除的字符'* /'),而左边的第一个字符为"s",那么左边就不满足匹配条件,右边第一个字符为"*",属于要移除的字符,那么继续往左一直到字符"q"这里时结束,因为字符"q",不属于移除的字符

        5.3、name='s   /   *** szq* /**',设置name.strip('* s'),需要移除的字符为"* s"

name='s   /   *** szq* /**'
res=name.strip('* s')
print(res)

/   *** szq* /

    这里得到的值为"/   *** szq* /",strip('* s')(要移除的字符'* s'),从左边开始匹配,第一个不满足的是"/",那么左边的匹配结束,然后从右边开始,第一个不满足的是"/",那么右边的匹配结束

        6、切分-split(Python内置参数)   #msg.split() 默认以"空格"为分隔符  msg.split() == msg.split(' ')

msg='root:x:0:0::/root:/bin/bash'
res=msg.split(':')   #对变量"msg"的值进行切分,以":(冒号)"为分隔符
print(res)

运行后得到一个新的值:(id,值都会发生改变)
['root', 'x', '0', '0', '', '/root', '/bin/bash']   #这里看出,原值已被修改,:(冒号)已替换为逗号分隔

        #split把字符串切分成了一个列表

        7、循环

name='szq'
for n in name:       #相当于:for n in 'szq'
    print(n)   
>>:s
>>:z
>>:q

       这里可以看出,for循环内,对变量n依次赋值为"szq"(依次赋值为"s" "z" "q"),那么在取变量n的值的时候,就能够依次取出"s" "z" "q"多个值

        8、实践用法

while True:
    cmd=input('>>:').strip()         #把用户输入的"空"值都给移除掉(空格也被包含在内)
    #cmd=cmd.strip()
    if len(cmd) == 0 :continue      #配置len使用,只用输入的值不为"空"时,程序才会做出回应
    elif cmd == 'q':break
    print('%s is running' %(cmd))

    这段代码的意思是:除了输入"q"将退出外,无论输入任何空的值,都将跳过(可以理解为Xshell里面再命令行里面一直敲回车或者空格时,Xshell并不会回应任何类容)

 

    1.2.1.2 字符串str需要掌握的操作:

    strip的多种用法:lstrip和rstrip,lstrip:移除左边指定的字符串,rstrip:移除右边指定的字符串

name='**********sudada////'
lres=name.lstrip('*')      #移除字符串"**********sudada////",左边所有的字符"*"
rres=name.rstrip('/')      #移除字符串"**********sudada////",右边所有的字符"/"
print(lres)
print(rres)

>>:sudada////
>>:**********sudada

    lower和upper的用法:lower将大写的字符串改为小写,upper将小写的字符串改为大写

msg='Abc'
print(msg)
print(msg.lower())
print(msg.upper())

>>:Abc    #原值不会受到影响
>>:abc    #使用lower后,大写的字符串会改为小写
>>:ABC    #使用upper后,小写的字符串会改为大写

    startswith和endswith的用法:startswith:以~~开头,endswith:以~~结尾

msg='my name is sudada'
print(msg.startswith('my'))    #判断当前字符串是否以字符串"my"开头
print(msg.endswith('da'))      #判断当前字符串是否以字符串"da"结尾

>>:True
>>:True

  format格式化输出的三种玩法:在这里我们使用第3种用法  --可自定义的格式化输出

print('my name is %s my age is %s' %('sudada',18))   #格式化输出%s的用法
>>:my name is sudada my age is 18

print('my name is {} my age is {}'.format('sudada',18))   #{}不指定内容,在传参时会根据.format('sudada',18)的值来依次传参
>>:my name is sudada my age is 18

print('my name is {name} my age is {age}'.format(name='sudada',age=18))   #{}指定了变量名"{name}",在传参时会根据变量名这只的值来传参
>>:my name is sudada my age is 18     #使用这种方式

    split与rsplit:split从左往右切分,rsplit从右往左切分   #split把字符串切分成了一个列表

info='root:0:0::/root:/bin/bash'
print(info.split(':',1))                    #split设置切分的分隔符为":"(冒号),从左往右切分1次
>>:['root', '0:0::/root:/bin/bash']        #第一个切分出来的当做一个值,后面剩余所有值当做一个值
print(info.rsplit(':',1))                   #rsplit设置切分的分隔符为":"(冒号),从右往左切分1次
>>:['root:0:0::/root', '/bin/bash']      

print(info.split(':',-1))                   #split(':')不加切分次数,默认切分所有
>>:['root', '0', '0', '', '/root', '/bin/bash']  

    join的用法:把列表拼接成字符串(与split相反)   join只能用于值全都为字符串的列表,如果列表中的某一个值为数字或其他,则会报错!

a=['root', '0', '0', '', '/root', '/bin/bash']  #这是一个列表
a_list=':'.join(a)     #指定分隔符为":"(冒号),join(a):可以理解为"join(['root', '0', '0', '', '/root', '/bin/bash'])"
print(a_list)
# >>:root:0:0::/root:/bin/bash

b_list=':::'.join(a)   #指定分隔符为":::"(冒号),join(a):可以理解为"join(['root', '0', '0', '', '/root', '/bin/bash'])"
print(b_list)
# >>:root:::0:::0::::::/root:::/bin/bash

例子:join与split功能对比使用
linux="root:/bin/bash:/sbin/:/usr/bin/"
print(linux.split(":"))
# ['root', '/bin/bash', '/sbin/', '/usr/bin/']

linux_list=['root', '/bin/bash', '/sbin/', '/usr/bin/']
data=":".join(linux_list)
print(data)
# root:/bin/bash:/sbin/:/usr/bin/

    replace的用法:将一个值替换成另外一个值

msg='wsp say name is wsp'        
print(msg.replace('wsp','SB'))     #把"wsp"替换成"SB",默认替换所有的值
>>:SB say name is SB

print(msg.replace('wsp','SB',1))   #只对第一个"wsp"替换成"SB"
>>:SB say name is wsp

    isdigit的用法:判断一个值的内容是否全为数字,例子"aaa123123aaa":这个就不满足

while True:
    age=input('>>:').strip()
    if not age.isdigit():continue    #判断输入的值是否为数字,如果不为数字的话,那么就continue,重新输入
    age=int(age)
    if age > 30:
        print('too big')
    elif age < 30:
        print('too small')
    else:
        print('success')

    1.2.1.3、字符串str总结

        1.字符串只能存一个值,因为字符串是一个整体,也可以把字符串当做一个列表,通过索引取值

        2.字符串属于有序(能够通过索引取值的都可以称为"有序")

        3.字符串属于不可变类型(无论通过lower或upper或split或者strip,它的原值一直没有发生任何改变)

 

1.3 列表类型 list

    作用:存放多个值,存取按照索引来获取值 status[0],status[1],0代表第一个位置,1代表第二个位置

    定义:在[]内,用逗号分开多个值,每个值可以是任意数据类型

    打印一个列表的值:print(变量名[索引])

    例子1:定义一个列表

status=[1,'sudada',[1,2,'hah']]   #定义一个变量status,赋值为 [1,'sudada',[1,2,'hah']]

print(status[0])     #取第1个值  status[0]   #类似Shell里面的数组
print(status[1])     #取第2个值  status[1]
print(status[2])     #取第3个值  status[2]
print(status)        #取全部的值 
print(type(status))  #取类型

1                               #取第1个值
sudada                          #取第2个值
[1, 2, 'hah']                   #取第3个值
[1, 'sudada', [1, 2, 'hah']]    #取全部的值
<class 'list'>                  #打印类型

例子2:当列表里面定义列表,并取列表的值

szq_info=['szq',18,['mutong',200,'shanghai']]

print(szq_info[1])
18                            #print(szq_info[1])     #得到的值 18

print(szq_info[2])
['mutong', 200, 'shanghai']  #print(szq_info[2])     #得到的值 ['mutong', 200, 'shanghai']
shanghai

print(szq_info[2][2])
#print(szq_info[2][2])  #得到的值shanghai,   #这里就相当于取['mutong', 200, 'shanghai']这个列表里面的第3个值

 

    1.3.1 列表得取值多种用法
    str = [1, 4, 5, 6, 7, 9, 11, 14, 16]

    print(str[-1])           # 截取最后一个元素
    print(str[0:3])         # 截取第一位到第三位的字符
    print(str)                 # 截取字符串的全部字符
    print(str[6:])           # 截取第七个字符到结尾
    print(str[:-3])          # 截取从头开始到倒数第三个字符之前
    print(str[2])            # 截取第三个字符
    print(str[::-1])         # 创造一个与原字符串顺序相反的字符串
    print(str[-3:-1])       # 截取倒数第三位与倒数第一位之前的字符
    print(str[-3:])          # 截取倒数第三位到结尾
    print(str[:-5:-3])      # 逆序截取后个数,每3个取一个,而且取是逆向取值
    print(str[:10:2])       # 前10个数,每两个取一个

 

Python -- 去除list中的空字符:

  方法1:

Python内建filter()函数 - 过滤list 
filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

def not_empty(s):
    return s and s.strip()

res = filter(not_empty, ['1', '', '2', None, '3', '  '])
# 结果: ['1', '2', '3']

  方法2:

while '' in index:
    index.remove('')


  1.3.1 列表list的常用操作和内置方法

     1.3.1.1 列表list优先掌握的操作:

    1、按索引存取值(正向存取+反向存取):即可以取也可以改(属于可变类型)      

sudada=['a','b','c','d','e','f']
print(sudada[-1])         #取倒数第一个索引的值
>>:f

print(id(sudada))   #sudada[0]未修改之前的ID
>>:2374574175368

sudada[0]='A'
print(sudada[0])
>>:A
print(id(sudada))   #sudada[0]修改过之后的ID
>>:2374574175368

    对列表中的某一个值(sudada[0]='A')做修改之后,虽然值发生了改变,但是值的id不会改变,符合可变类型

    注意:列表修改值得时候,只能对已存在的值进行修改,若值或者索引不存在,那么不能修改

sudada=['a','b','c','d','e','f']
sudada[10]='A'
print(sudada[10])

报错:IndexError: list assignment index out of range

 

    2、切片(顾头不顾尾,步长)

sudada=['aaaa','b','c','d','e','f']
print(sudada[0:5])                #取索引0-5的值(正向取值)
>>:['aaaa', 'b', 'c', 'd', 'e']

print(sudada[0:5:2])              #取索引0-5的值,每隔2个步长取一个值
>>:['aaaa', 'c', 'e']

print(sudada[-1::-1])
>>:['f', 'e', 'd', 'c', 'b', 'aaaa']  #把列表反向取值

    反向索引--也要记住顾头不顾尾:

sudada=['a','b','c','d','e','f']
print(sudada[5:0:-1])                  #可以理解为:取索引5-0的值(也就是反过来取值)
>>:['f', 'e', 'd', 'c', 'b']

print(sudada[5:0:-2])                 #取索引5-0的值,每隔2个步长取一个值
>>:['f', 'd', 'b']

 

    3、长度 len

sudada=['aaaa','b','c','d','e','f']
print(len(sudada))

>>:6       #可以理解为索引的个数(或者说是字符串的个数)

 

    4、成员运算in和not in      #判断某一个值(字符串)是否存在与一个变量中   in 表示存在,not in 表示不存在。

msg='sudada is baby'

print('sudada' in msg)      运行后得到    True

print('sudada' not in msg)  运行后得到    False

 

    5、追加append插入insert

    5.1 追加append:name.append('FFF')     #从列表末尾开始追加内容

name=['aaa','bbb','ccc','ddd','eee']   #这里5个索引值
name.append('FFF')    #使用内置参数name.append('FFF'),往列表末尾追加一个索引内容'FFF'
print(name)

>>:['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'FFF']   #追加一个索引内容后的现实效果

    5.2 插入insert:name.insert(2,'AAA')     #根据指定的索引值插入,插入到指定的索引值前面

name=['aaa','bbb','ccc','ddd','eee']
name.insert(2,'AAA')    #指定插入的内容在哪一个索引前面
print(name)

>>:['aaa', 'bbb', 'AAA', 'ccc', 'ddd', 'eee']   #插入后的效果

 

    6、删除列表中某一个元素 del

    方法1使用del指定列表的索引删除   #这种方法不是列表特有的删除方法

name=['aaa','bbb','ccc','ddd','eee']
del name[0]   #可以使用del,然后指定列表的索引删除
print(name)

>>:['bbb', 'ccc', 'ddd', 'eee']

    方法2:name.remove('aaa')   #指定要删除的元素,remove方法没有返回值

name=['aaa','bbb','ccc','ddd','eee']
name.remove('aaa')

print(name)
>> :['bbb', 'ccc', 'ddd', 'eee']

name.remove(0)            #使用name.remove删除列表的元素是,删除的元素必须是"in list"存在于列表中的,否则报错如下
ValueError: list.remove(x): x not in list

    方法3:从列表中取走一个值pop,被取走的值,可以被引用    # name.pop(0),指定索引删除,原值会改变 

name=['aaa','bbb','ccc','ddd','eee']
name.pop(0)   #按照索引删除一个元素

print(name)
#>>:['bbb', 'ccc', 'ddd', 'eee']   #已经把列表的索引"0"删除了

print(name.pop(0))   #删除后有返回值(已经删掉的元素),超出索引则报错
#>>:bbb

 

    7、for 循环

name='szq'
for n in name:       #相当于:for n in 'szq',把字符串'szq'的每一个字符单独打印出来
    print(n)   
>>:s
>>:z
>>:q

       这里可以看出,for循环内,对变量n依次赋值为"szq"(依次赋值为"s" "z" "q"),那么在取变量n的值的时候,就能够依次取出"s" "z" "q"多个值

 

     1.3.1.2 列表list需要掌握的操作:

    1、反转 reverse     #反转(修改列表的值,按照倒序排列,使用reverse后原值也会被修改)

name=['aaa','bbb','ccc','ddd','eee']
name.reverse()   #反转,把列表里面的值倒序排列
print(name.reverse())
>>:None
print(name)      #reverse修改的是原值,直接把原值从正序改为了倒序
>>:['eee', 'ddd', 'ccc', 'bbb', 'aaa']

    2、count  统计元素的个数(当前列表中有几个'aaa')

name=['aaa','bbb','ccc','ddd','eee']
name.count('aaa')
print(name.count('aaa'))   #统计元素的个数(当前列表中有几个'aaa')

>>:1

    3、clear 清空列表中所有的值

name=['aaa','bbb','ccc','ddd','eee']
name.clear()
print(name.clear())    #清空列表中所有的值
>>:None
print(name)
>>:[]

    4、copy  复制

name=['aaa','bbb','ccc','ddd','eee']
l=name.copy()   #复制一份内容
print(l)
>>:['aaa', 'bbb', 'ccc', 'ddd', 'eee']

    5、index 查看索引值的序列号

name=['aaa','bbb','ccc','ddd','eee']
name.index('aaa')
print(name.index('aaa'))
>>:0   #'aaa'在列表中处于第0个索引

    6、sort 排序     #对同类型的元素排序从小到大排序(数字和字符串不能做比较)

name=[-1,99,22,-3,23]
name.sort()   #对同类型的元素排序,从小到大
print(name)
>>:[-3, -1, 22, 23, 99]
name=['aaa','bbb','ccc','ddd','eee']
name.sort()   #字符串比较大小,从字符串的第一个元素开始比较谁大谁小
print(name)
['aaa', 'bbb', 'ccc', 'ddd', 'eee']

    1.3.1.3、列表list总结

    1、列表能存多个值

    2、列表属于有序(可以按照索引取值的都为有序)

    3、列表属于可变类型

 

1.4 队列堆栈

    1.4.1 队列-(先进先出)

#入队列:
name=[]
name.append('aaa')       #使用append追加,每次追加的内容都在末尾
name.append('bbb')
name.append('ccc')
print(name)
>>:['aaa', 'bbb', 'ccc']

#出队列:
name.pop(0)              #使用pop取值,符合先进先出的规则,那么就要取第一个索引的值'aaa'
print(name)
>>:['bbb', 'ccc']      #取出'aaa',之后剩下['bbb', 'ccc']

name.pop(0)              
print(name)
>>:['ccc']             #取出'bbb',之后剩下['ccc']

name.pop(0)
print(name)
>>:[]                   #取出'ccc',之后剩下[]

或者:

#入队列:
name=[]
name.append('aaa')
name.append('bbb')
name.append('ccc')
print(name)

#出队列:
print(name.pop(0))
>>:aaa             #第一个取出的值
print(name.pop(0))
>>:bbb             #第二个取出的值
print(name.pop(0))
>>:ccc             #最后一个取出的值

 

    1.4.2 堆栈-(先进后出,或后进先出)

#入栈
name=[]
name.append('aaa')
name.append('bbb')
name.append('ccc')
print(name)

#出栈
name.pop(-1)          #这里是有pop(-1),取倒数第一个值
print(name)
>>:['aaa', 'bbb']   #取出'ccc'后,还剩下['aaa', 'bbb'] 

name.pop(-1)
print(name)
>>:['aaa']          #取出'bbb'后,还剩下['aaa'] 

name.pop(-1)
print(name)
>>:[]               #取出'aaa'后,还剩下[] 

或者:

#入栈
name=[]
name.append('aaa')
name.append('bbb')
name.append('ccc')
print(name)
>>:['aaa', 'bbb', 'ccc']

#出栈
print(name.pop(-1))
>>:ccc              #第一个取出的值
print(name.pop(-1))
>>:bbb              #第二个取出的值
print(name.pop(-1)) 
>>:aaa              #最后一个取出的值

 

1.5 元组 tuple (不可变的列表)       #可以理解为一个列表但是值不能被修改

    1.5.1 元组的用法和列表是一样的,只不过元组属于不可变类型

    1.5.2 元组属于有序,可以存多个值,属于不可变类型

 

1.6 字典类型 dict

    定义:在{}内,以逗号分隔,每个元素是用key : value的形式

    强调:key通常是字符串类型(不可变类型),value可以是任意类型keyvalue之间通过冒号":",来建立对应关系

    打印一个字典的值:print(变量名[Key])

    例子1:字典的写法

szq_info={'aaa':111,                 #'aaa'就是一个Key
          'bbb':222,
          'ccc':333,
          'ddd':['11','22','33']    #'ddd'也是一个Key,它的值为['11','22','33']
}

print(szq_info['aaa'])   
111    #获取到Key(aaa)对应的value(111)
   
print(szq_info['ddd'][1])   
22     #获取到Key(ddd)对应的value['11','22','33'],取第二个索引

 

    1.6.1 列表List与字典Dict的组合应用

students=[
    {'name':'szq','age':18,'hobby':['read','sleep']},
    {'name':'wusp','age':28,'hobby':['read','sleep']},
    {'name':'zhangold','age':38,'hobby':['read','sleep']}
]

print(students[1])              #取第2个索引的值
{'name': 'wusp', 'age': 28, 'hobby': ['read', 'sleep']}

print(students[1]['name'])      #取第2个索引的值,然后取Key 'name',取Key 'hobby'
wusp

print(students[1]['hobby'])     #取第2个索引的值,然后取Key 'hobby'
['read', 'sleep']

print(students[1]['hobby'][1])  #取第2个索引的值,然后取Key 'hobby' 得到['read','sleep'],然后在取第2个索引的值
sleep

 

    1.6.1.1 字典dir优先掌握的操作:

    1、按key存取值:可存可取

name={'aaa':1123,'bbb':1223}
name['aaa']=333     #修改key'aaa'对应的value的值为'333'
print(name)         #字典属于可变类型

>> :{'aaa': 333, 'bbb': 1223}   #发现key对应的值已经被改变

    2、长度len      #判断字典中 Key的个数

name={'aaa':1123,'bbb':1223}
name['aaa']=333
print(len(name))

>> :2

    3、成员运算in和not in     #for循环中取得变量是key

name={'aaa':1123,'bbb':1223}
name['aaa']=333

for n in name:     #for循环中取得变量是key
    print(n)
>> :    aaa
>> :    bbb

    4、删除   popitem的用法和pop的用法

    4.1、popitem的用法:删除字典中里面的最后一个键值对,通过调用name.popitem()获取到被删除的键值对

name={'aaa':111,'bbb':222,"ccc":333}
print(name.popitem())  # popitem表示删除掉一个键值对items()
>> :('ccc', 333)      # 执行name.popitem(),得到一个元组类型数据

    4.2、pop的用法:删除字典里面的一个key,通过调用name.pop('aaa')获取到被删除key对应的value

name={'aaa':1123,'bbb':1223}
print(name.pop('aaa'))   #pop后面接key,那么得到删除的key对应的值
>> :1123

print(name)               #使用pop删除后,那么这个key对应的键值对就会被删除
>>:{'bbb': 1223}

    4.3、如果删除的key不存在,那么使用default默认输出一个值,但是原值不会改变

name={'aaa':1123,'bbb':1223}
print(name.pop('aaaaaa','没有这个key,请重新定义Key'))   #如果定义了一个不存在的key,那么给一个默认输出
>>:{没有这个key,请重新定义Key

print(name)                      #那么原值不会发生任何改变
>>:{{'aaa': 1123, 'bbb': 1223}

    5、键keys()值values()键值对items()

    5.1、keys   取出所有的key

msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}

print(msg_dic.keys())    #.keys指的是字典的所有key
>>:dict_keys(['apple', 'tesla', 'mac', 'lenovo', 'chicken'])

    在使用for循环时,使用.keys可以拿到字典中所有的key(不过for循环本身即可完成)

for n in msg_dic.keys():
    print(n)
>>:apple
>>:tesla
>>:mac
>>:lenovo
>>:chicken

  5.2 values  取出所有的value

msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}

print(msg_dic.values())  #.value指的是所有的key对应的value
>>:dict_values([10, 100000, 3000, 30000, 10])

    在使用for循环时,使用.values可以拿到字典中所有的key对应的value(相当于取所有的值)

for n in msg_dic.values():
    print(n)
>>:10
>>:100000
>>:3000
>>:30000
>>:10

    5.3 items  取出所有的键值对

msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}

print(msg_dic.items())
>>:dict_items([('apple', 10), ('tesla', 100000), ('mac', 3000), ('lenovo', 30000), ('chicken', 10)])

    在使用for循环时,使用.items可以拿到字典中所有的键值对 (转换成了元组的形式)

for n in msg_dic.items():
    print(n)

>>:('apple', 10)
>>:('tesla', 100000)
>>:('mac', 3000)
>>:('lenovo', 30000)
>>:('chicken', 10)

    使用for循环转换,把items拿到的元祖形式装换为普通形式:

for k,v in msg_dic.items():    #items取出的是所有的键值对,那么定义变量k==keys,v==values,就能得到所有的keys和values
    print(k,v)

>>:apple 10
>>:tesla 100000
>>:mac 3000
>>:lenovo 30000
>>:chicken 10

    6、循环(循环字典)

msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}

for n in msg_dic:       #n定义为字典的中所有的key
    print(n)            #打印n得到所有的key
>>:apple
>>:tesl
>>:mac
>>:lenovo
>>:chicken

    print(msg_dic[n])   #打印字典中所有的key,得到所有的key对应的value
>>:10
>>:100000
>>:3000
>>:30000
>>:10

    print(n,msg_dic[n]) #打印字典中所有的key及对应的value
>>:apple 10
>>:tesla 100000
>>:mac 3000
>>:lenovo 30000
>>:chicken 10

       1.6.1.2 字典dir需要掌握的操作:

  1、msg.get('aaa')          # 如key('aaa')不存在字典中,那么返回空值,而不是报错

msg={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}

print(msg.get('aaa','值不存在'))
>> :None        #默认返回空值
>> :值不存在      #可以添加提醒项,若key不存在则返回提示项

  2、msg.update({'a':1,'b':2})        # 修改字典的值为设定的值

msg={'aaa':111,'bbb':222}
print(msg)
>> :{'aaa':111,'bbb':222}

msg.update({'aaa': 'AAA', 'bbb': 'BBB', "ccc":333})  
# 把.update({'aaa':'AAA','bbb':'BBB'})里面的键值赋值给msg,有则修改,无则添加。
print(msg)
{'aaa': 'AAA', 'bbb': 'BBB', 'ccc': 333}

  3.1、 msg.setdefault('aaa',666)      #若key('aaa')存在字典中,那么则不会修改原有的值

msg={'aaa':111,'bbb':222}
msg.setdefault('aaa',666)   #若key('aaa')存在字典中,那么则不会修改原有的值
print(msg)
>> :{'aaa': 111, 'bbb': 222}

  3.2、msg.setdefault('sudada',666)  #若key('sudada')不存在字典内,那么则在字典中追加一个键值对{'sudada': 666}

msg={'aaa':111,'bbb':222}
msg.setdefault('sudada',666)   #若key('sudada')不存在字典内,那么则在字典中追加一个键值对{'sudada': 666}
print(msg)
>> :{'aaa': 111, 'bbb': 222, 'sudada': 666}

    总结setdefault:有则不变,无则增加

    setdefault例子:博客里面,统计单词个数

 

   1.6.1.3、字典dir总结

    1、字典能存多个值

    2、字典属于无序(可以按照索引取值的都为有序)

    3、字典属于可变类型

 

    1.6.1.3、python dict与zip的使用

    1、zip函数:接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。

# 例子1:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
注意:Python3.x和Python2.x这里的差别
Python3.x
xyz = list(zip(x, y, z))

Python2.x
xyz = zip(x, y, z)
print(xyz)
输出结果:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

# 例子2:
x = [1, 2, 3]
y = [4, 5, 6, 7]
xy = list(zip(x, y))
print(xy)
输出结果:[(1, 4), (2, 5), (3, 6)]

# 例子3:
x = [1, 2, 3]
x = list(zip(x))
print(x)
输出结果:[(1,), (2,), (3,)]

# 例子4:
x = list(zip())
print(x)
输出结果:[]

# 例子5:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = list(zip(x, y, z))
print(xyz )
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

u = list(zip(*xyz))
print(u)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

一般认为这是一个unzip的过程,它的运行机制是这样的:
在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))
所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
注:在函数调用中使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数(前提是对应函数支持不定个数的位置参数)

    2、zip函数在字典里面的使用

# 例子1:zip函数利用字符串创建字典
key = 'abcde'
value = range(1, 6)
print(dict(zip(key, value)))
输出结果:{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

# 例子2:使用items()来遍历字典
d={'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
for key,value in d.items():
    print(key,value)
或者:
for n in d:
    print(n,d[n])

a 1
b 2
c 3
d 4
e 5

# 例子3:dict(dict1, **dict2)合并两个字典
a={'a':1,'b':2,'c':3}
b={'d':11,'e':22,'f':33}

print(dict(a,**b))
输出结果:{'a': 1, 'b': 2, 'c': 3, 'd': 11, 'e': 22, 'f': 33}

# 例子4:合并多个字典:如果多个字典内有重复的key,那么以"**b"字典为准
a={'a':1,'b':2,'c':3}
b={'d':11,'e':22,'f':33}
c=dict(a,**b)
d={'aa': 1, 'bb': 2, 'c': 3333, 'd': 4, 'e': 5}

print(dict(c,**d))
输出结果:{'a': 1, 'b': 2, 'c': 3333, 'd': 4, 'e': 5, 'f': 33, 'aa': 1, 'bb': 2}

# 例子5:使用fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
seq={'name','age','score'}
d=dict.fromkeys(seq,100)

print(d)
输出结果:{'score': 100, 'name': 100, 'age': 100}

 

 

1.7 布尔类型  -  只有2种值,  "True"或者"False"

a=3
b=5
print(a>b)
False                 #3>5不成立则为False

print(a<b)
True                  #3<5成立则为True

    1.7.1 布尔类型补充知识:所有的数据类型都自带布尔值(True或False )

    1.这里需要知道:什么样的数据类型自带的布尔值是为False(假)

        即:0,None,空(字符串没有定义的值)

        if not cmd:continue   #if 后面接条件,当条件为真(True)时,执行continue。那么只有在cmd的值为"空"(False)时,cmd为假,那么not cmd即为"真"(True)。 #这里取了个反值

 

1.8 可变或者不可变类型

    1.8.1 可变类型定义值发生改变,但是id没有发生改变--【可变类型是不可hash的】

     1.列表类型(list)

     2.字典类型(dict)

l=['a','b','c','d']

print(id(l),l)
3130959555272 ['a', 'b', 'c', 'd']   #第一次打印得到ID和值

l[0]='A'
print(id(l),l)
3130959555272 ['A', 'b', 'c', 'd']   #第二次打印得到ID和值

    #运行后可以看出,第二次与第一次相比较,值发生改变,但是id没有发生改变,满足可变数据类型!

1.8.2 不可变类型定义:值发生改变,id也发生改变--【不可变类型是可以hash的】

      1.数字类型(int与float),

      2.字符串类型(str),

      3.元组类型(tuple),

 

1.9、集合{}类型(set)

    2.定义方式

    2.1 {}内用逗号分隔开多个元素,每一个元素必须为不可变类型(也就是集合内只能存不可变类型)

    2.2 集合内的元素不能重复

    2.3 集合无序(不能被索引取值)

s={1,'a',3}      #集合内定义值得方式
print(type(s))
>>:<class 'set'>

 

    3、集合优先掌握的操作

  1、长度len

s={1,'a',3}
print(len(s))
>>:3

 2、成员运算in和not in

s={1,'a',3}
print('a' in s)
>>:True

print('b' not in s)
>>:True

 3、|合集

A={111,'aaa',3333,333}
B={111,222,333,'aaa','bbb'}

print(A | B)      #并集(A与B所有的值加起来)
>>:{3333, 333, 111, 'bbb', 222, 'aaa'}

 4、&交集

A={111,'aaa',3333,333}
B={111,222,333,'aaa','bbb'}

print(A & B)      #交集(A与B都存在的值)
>>:{333, 'aaa', 111}

 5、-差集

A={111,'aaa',3333,333}
B={111,222,333,'aaa','bbb'}

print(A - B)       #差集(A减B:该值在A存在但是在B不存在)
>>:{3333}
>print(B - A)      #差集(B减A:该值在B存在但是在A不存在)
>>:{'bbb', 222}

 6、^对称差集

A={111,'aaa',3333,333}
B={111,222,333,'aaa','bbb'}

print(A ^ B)       #对称差集(取A与B之间不重复的值(A与B去重后得到的值))
>>:{3333, 'bbb', 222}

 7、父集(>,>=)  与  子集(<,<=) 

# 集合之间做比较:指的是包含于被包含的关系
s1={1,2,3}
s2={1,2}

print(s1 >= s2)    #s1包含s2
>>:True
print(s2 <= s1)    #s2被s1包含
>>:True

 

    4、集合需要掌握的操作

    1、difference与difference_update(差集)

s1={'a','b','c'}
s2={'b','d','f'}
print(s1.difference(s2))   #s1与s2的差集
# >>:{'a', 'c'}

s1.difference_update(s2)  #这步操作实际上就是把s1与s2的差集赋值给s1(重新定义了s1)
print(s1)
# >>:{'a', 'c'}

  2、add(添加)

s1={'a','b','c'}
s2={'b','d','f'}

s1.add('d')     #在集合内添加一个值
print(s1)
# >>:{'c', 'd', 'a', 'b'}

  3、删除集合内的元素

s1={'a','b','c'}
s2={'b','d','f'}

s1.remove('a')    #把集合内的元素'a'删除(删除后无返回值)
print(s1)
# >>:{'c', 'b'}

s1.discard('a')     #把集合内的元素'a'删除(删除后无返回值)
print(s1)
# >>:{'b', 'c'}

s1.pop()           #随机删除集合内的元素(有返回值)
print(s1)
# >>:{'a', 'c'}
# >>:{'b', 'c'}

 

例子1:替换列表里面的某个元素(这里指的某些特殊字符)  -- 根据excel获取IP值那个脚本学到的

import re

list_a=['外网IP', '75.126.166.229', '75.126.134.229', '75.126.214.83|10.80.142.94', '75.126.134.226',]
list_d={' ':'\|'}        """ key=" " 空  value='\|' """
list_b=",".join(list_a)

for n in list_d.keys():
    list_b=re.sub(list_d[n],n,list_b)
    """
    参数介绍:
        re.sub 正在表达式里面'替换'的用法
        list_d[n] == '\|'
        n == ' '
        list_b == '外网IP,75.126.166.229,75.126.134.229,75.126.214.83 10.80.142.94,75.126.134.226'
    意思介绍:
        把字符'\|'替换为空' ',针对内容'外网IP,75.126.166.229,75.126.134.229,75.126.214.83 10.80.142.94,75.126.134.226'
    """
print(list_b.split(","))

>>:['外网IP', '75.126.166.229', '75.126.134.229', '75.126.214.83 10.80.142.94', '75.126.134.226']

例子2:替换列表里面的某个元素

import re

a = ["123", "456", "789"]
d = {
    "B": "2",
    "E": "5",
    "H": "8"
}
b = ",".join(a)
print(b)
#  123,456,789

for i in d.keys():
    b = re.sub(d[i], i, b)
    """
    参数介绍:
        d[i] = key对应的值
        i = 字典d里面的key
        b = '123,456,789' 
    意思介绍:
        把数字"2" "5" "8"替换为"B" "E" "H",针对内容'123,456,789'
    """

print(b.split(","))
# ['1B3', '4E6', '7H9']

 

例子:将三个列表内的数据并排显示

total = []
a=['外网IP', '75.126.166.229', '75.126.134.229', '75.126.214.83']
b=['内网IP', '10.84.248.207', '10.86.92.198', '10.81.223.142']
c=['root', 'C6SWlKJ3', 'F3PcL98m', 'Dd59nlVA', 'AqGb6qfh', 'V5']

for q,w,e in zip(a,b,c):
    total.append(q+' '+w+' '+e)

for n in total:
    print(n)

>>:外网IP 内网IP root
>>:75.126.166.229 10.84.248.207 C6SWlKJ3
>>:75.126.134.229 10.86.92.198 F3PcL98m
>>:75.126.214.83 10.81.223.142 Dd59nlVA

1.10、eval函数   eval函数就是实现list、dict、tuple与str之间的转化

1、字符串转换成列表
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
print(b)
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]

2、字符串转换成字典
aa = "{1: 'a', 2: 'b'}"
bb = eval(aa)
print(bb)
{1: 'a', 2: 'b'}

3、字符串转换成元组
aaa = "([1,2], [3,4], [5,6], [7,8], (9,0))"
bbb = eval(aaa)
print(bbb)
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章