• 三、Python基础(2)


    (一)字典,dict全称“dictionary”,使用键值对(key-value)存储。各元素对应的索引或者下标称为键(key),各个键对应的元素称为值(value),字典中各元素的键都只能是字符串、元组或数字,不能是列表(列表时可变的)。字典是任何数据类型可变的无序集合,键值必须唯一不可变。

     1、使用 { } 创建字典:

    d = { key1 : value1, key2 : value2...}
    # 根据同学的名字查找对应的成绩
    score = {'Mike': 95, 'Nancy': 85, 'Helen': 89, 'John':65, 'Sarah':100}

    2、通过 fromkeys() 方法创建字典

    # 使用fromkeys()方法创建带有默认值的字典
    
    d = dict.fromkeys(list, value = None)
    
    

    实例练习:

    3、通过 dict() 映射函数创建字典

    # 字符串键值对,字符串不能带引号
    a1= dict(str1=value1, str2=value2, str3=value3)
    
    # dict()函数传入列表或元组
    #方式1
    demo = [('abc',1), ('cde',2), ('efg',3)]
    #方式2
    demo = [['abc',2], ['cde',1], ['efg',3]]
    #方式3
    demo = (('abc',2), ('cde',1), ('efg',3))
    #方式4
    demo = (['abc',2], ['cde',1], ['efg',3])
    a2= dict(demo)
    
    # 通过dict()函数和zip()函数,两个列表转换为对应的字典
    keys =['abc', 'cde', 'efg']
    values = [1,2,3]
    a3 = dict(zip(keys, values))

    4、访问字典

    # Python中访问字典元素的格式为:
    dict[key]

    实例练习:

     若键值不存在,则会抛出异常提示,如图:

    5、通过使用 get() 方法来获取指定键对应的值,当指定的键不存在时,get()方法不会抛出异常。

    dict.get(key[,default])

    实例练习:

    若 get() 方法返回的是空值,则显示None

     6、删除字典dict,可以使用 del 关键字删除字典

    实例:

     图中的del操作后,引发异常提示,del 删除后该score字典不再存在了。

    7、dict 字典基本操作(添加、修改、删除键值对)

    7.1 添加键值对

    dict[key] = value

    实例:

    7.2 修改键值对,字典中键(key)不能被修改,只能修改值(value),新添加的键与已存在的键相同,那么所对应的键的值就会被新的值所替换。

    实例:

    比较 dict[key] 和 dict.setdefault(key, default =None)区别:

    dict[key]会把之前key对应的值修改掉,而dict.setdefault(key, default =None)不会修改键之前的对应的值(添加学生信息,一般使用setdefault来添加信息)

    dict.setdefault(key, default=None)

    7.3 删除键值对,用 del 语句删除键值对

    实例:

    7.4、判断字典中是否存在指定键值对:首先判断字典中是否有对应的键值对,可以使用 in 或 not in 运算符。

    8、字典数据类型为 dict ,该类型的基本方法

    8.1 dict.keys() 方法:以列表返回一个字典所有的值

       dict.values() 方法:以列表返回字典中所有值

    8.2 dict.items() 方法:以列表返回可遍历的(键、值)元组数组

    实例中包含key()、value()、items():

    输出结果中,在 Python 2.x 中,上面三个方法的返回值都是列表(list)类型。但在 Python 3.x 中,它们的返回值并不是我们常见的列表或者元组类型,因为 Python 3.x 不希望用户直接操作这几个方法的返回值。

    python 3.X中一般返回的数据方法为:list() 函数 和 for in 循环变量它们的返回值

    (1)list() 函数实例:

     (2)for in 循环遍历

    8.3 dict.clear() :删除字典内所有元素

    8.4 dict.copy() :返回一个字典的浅复制

    实例如图:copy()  方法将字典score 的数据全部拷贝给了字典score1

    8.5 dict.get(key,default=None):返回指定键的值,如果值不存在返回default默认的None值:

    (1)dict.get()

     (2)dict[]和dict.(key,default=None)qq区别:

    8.6 dict.has_key(key):若键在字典返回True,反之返回False   (Python 2.X函数使用方法)

          Python 3.X的使用方法为:

    score = {'Mike': 95, 'Nancy': 85, 'Helen': 89, 'John':65, 'Sarah':100, 'Tom':77}
    # score.has_key('Mike')  python2的函数
    print(score.__contains__('Mike'))   # Python 3 的函数使用

    8.7 dict.setdefault(key,default = None):与get()方法类似,若键不存在字典中,将会添加键并将值设为指定值默认None

      get() 和 setdefault() 区别在于:当指定的键不存在时,setdefault() 可以通过增加键值对来更新字典。

    8.8 dict.update(dic2):字典dict2的键值对更新到dict里

     实例中,update()操作如图

    8.9 dict.pop(key[,default]):删除字典给定的键对应的值,返回值为被删除的值。

    (1)dict.popitem() :返回并删除字典中最后一对键值对

    实例中,pop() 和 popitem() 删除操作

     (2)del d[ key] 和 dict.pop(key)删除不存在的key时:

     

    8.10 dict.fromkeys(seq[,val]):创建一个新字典,四五千中元素做字典的值,val为字典所有键对应的初始值

    9.利用字典判断字典里面的值存不存在

    users ={
        'Amy': '123456',
        'Bob': '456789',
        'Mike': '147258'
    }
    username = 'Amy'
    # print(username in users.keys())
    # print(username in users)  # 推荐使用这个,判断Key是否存在
    # users.has_key(username)   # python2 方法
    print(users.items())      # 循环遍历字典,以列表方式展示
    for k,v in users.items():
        print(k,v)
    for k in users:
        print(k,users.get(k))   # 推荐循环字典操作

    字典练习:注册用户,用户名,密码,确认密码,最多输入3次,超过3次提示错误次数超限,账号密码不能为空,两次输入密码是否一致,输入的用户是否存在

    users = {
        'Amy':'123456',
         'Bob': '456789',
        'Mike':'147258'
    }
    for i in range(3):
        username = input('用户名:').strip()
        password = input('密码:').strip()
        cpwd = input('再次确认密码:').strip()
        if username == '' or password =='' or cpwd == '':
            print('账号或密码不能为空!')
        elif password != cpwd:
            print('两次输入的密码不一致!')
        elif username in users:
            print('用户名已存在!')
        else:
            users[username] = password
            print('注册成功!')
            break
    else:
        print('错误次数过多!')
    print(users)

    (二)list字典嵌套

    实例:字典里嵌套字典,字典里面嵌套list

    info = {
        'Amy':{
            'age':18,
            'addr':'beijing',
            'tel':'18801124520',
            'hobby':['reading', 'running', 'playing tennis']
        },
        'Nick':{
            'age':20,
            'addr':'tianjin',
            'tel':1302254850,
            'hobby':['movies', 'cooking', 'playing badminton']
        }
    
    }
    # Amy hobby中不喜欢running了,喜欢上了art
    # Nick Tel 手机变成了:15055001550
    
    info['Amy']['hobby'].remove('running')
    info['Amy']['hobby'].append('art')
    info['Nick']['tel']=(15055001550)
    print(info)

    (三)元组(tuple):元组的元素不能修改

    1、元组、列表、字典表示方式:

    # 元组用小括号()
    a = (1,2,3,4,5)
    
    # 列表用方括号[]
    b = [1,2,3,4,5]
    
    # 字典用花括号{}
    c = {key:value}

    2、元组和列表(list)的不同之处在于:

    • 列表的元素是可以修改的,包括修改元素值,删除和插入元素,所以列表是可变序列;
    • 元组一旦被创建,其元素不可修改,故元组是不可变序列。通常情况下,用于保存无需修改的内容。

    3、创建元组

    (1)使用()直接创建元组

    # 创建元组
    tuple = (a1,a2,a3,..,n)

           若元组中只包含一个元素时,需要在元素后面添加逗号,否则解释器会将它视为字符串:

    # 元组中只包含一个元素时:
     tup1 = (a1,)

    实例:

     # int float bool None list str dict tuple
    n= (1,2,3,4,5) # 不可变的列表
     # 元组一旦被创建,不能改变里面的值
    print(n[0])

    (2)使用tuple()函数创建元组

        使用内置函数 tuple()

    # data可以是字符串,元组,range对象转换为元组
    tuple(data)
        #将字符串转换成元组
        tup1 = tuple("hello")
        print(tup1)
        #将列表转换成元组
        list1 = ['Python', 'Java', 'C++', 'JavaScript']
        tup2 = tuple(list1)
        print(tup2)
        #将字典转换成元组
        dict1 = {'a':100, 'b':42, 'c':9}
        tup3 = tuple(dict1)
        print(tup3)
        #将区间转换成元组
        range1 = range(1, 6)
        tup4 = tuple(range1)
        print(tup4)
        #创建空元组
        print(tuple())

    4、元组的index()方法和count()方法

    m = ('1245521.2555', 'admin', '1545646')
    print(m.index('admin'))
    print(m.count('admin'))

    5、访问元组,可以使用索引index()访问元组中的某个元素,也可以使用切片访问元组

    # 使用索引访问元组元素:
    m = ('1245521.2555', 'admin', '1545646')
    print(m[2])
    
    # 使用切片访问元素
    word=tuple('wearefamily')
    print(word[2:5:1]))

    6、修改元组:不可变序列,元组中元素不能被修改。只能创建新的元组替换旧的元组。

     
    tup1 = (100, 55.26)
    tup2 = ('hello', 'hi')
    print(tup1)
    print(tup2)
    # 创建一个新的元组
    tup3 = tup1 + tup2
    print(tup3)

    7、删除元组:可以通过del 关键字删除整个元组。

         实例如图:

    (四)集合:是一个无序的不重复的元素序列,可以使用大括号 { } 或者 set() 函数创建集合,创建一个空集合必须用 函数 set() 不能用 { } (用{ }创建一个空字典)。

    1、创建集合

    # 创建集合
    
    setname = {value1, value2, value3,...}
    
    # 使用 set() 函数
    setname = set(vlaue)

    2、访问set集合元素:使用循环结构,逐一读取数据。

    a = {1,2,3,4,5,6,7,8,9}
    for b in a:
        print(b,end=' ')

    3、删除 set 集合,使用 del() 语句

    a = {1,2,3,4,5,6,7,8,9}
    print(a)
    del(a)
    print(a)

    4、集合中,添加元素

    (1)使用 add() 方法

    注意:使用add()方法添加元素,若元素已存在则不进行该添加操作,只能添加数字、字符串、元组或布尔类型,不能添加列表、字典、集合可变数据,否则会报错,例如:TypeError: unhashable type: 'list'

    # 集合中添加元素
    setname.add(x)
    # 例如:
    a = {1,2,3,4,5}
    a.add((1,2))
    print(a)

    (2)还可以使用 update() 方法,且参数可以是列表、元组、字典

    # 添加元素,使用 update() 方法
    a = {1,2,3,4,5,6,7,8,9}
    print(a)
    a.update(['ab','bc'])
    print(a)

    5、集合中删除元素

    (1)可以使用remove()  方法,若元素不存在,则会发生错误,例如:KeyError: 'a'

    # 移除集合中的元素,使用remove()
    setname.remove()
    
    a = {1,2,3,4,5,6,7,8,9}
    print(a)
    a.remove(1)
    print(a

    (2)移除集合中的元素,使用 discard() 若元素不存在,不会发生错误

    # 移除集合中的元素,使用 discard() 方法
    
    a = {1,2,3,4,5,6,7,8,9}
    print(a)
    a.discard('a')
    print(a)

    (3)随机删除集合中的一个元素

    # 使用 pop() 方法随机删除
    a = {1,2,3,4,5,6,7,8,9}
    print(a)
    print(a.pop( ))

    (五)字符串常用方法

    s = '  abcdefgABCDEabcdefg  '
    # 常用的字符串方法
    # s.count('a')    # 统计字符串出现的次数
    # print(s.count('a'))
    
    # s.index('a')     # 检索是否包含指定的字符串,不存在抛出异常:ueError: substring not found
    # print(s.index('b'))
    # print(s.find('b')) # 检索字符串中是否包含目标字符串,不存在会抛出异常,以:-1 返回
    
    # s.strip()       # 删除字符串前后(左右两侧)的空格或特殊字符
    # print(s.strip())
    # s.lstrip()      # 删除字符串前面(左边)的空格或特殊字符
    # print(s.lstrip())
    # s.rstrip()      # 删除字符串后面(右边)的空格或特殊字符
    # print(s.rstrip())
    
    # s.replace()     # 把字符串中的 old(旧字符串) 替换成 new(新字符串)
    # print(s.replace('a','A',1))  # (将被替换的子字符串,新字符串,替换次数)
    
    # s.format()      # 字符串格式化
    # print("{} {}".format("hello", "world") ) # 不设置指定位置,按默认顺序
    # print("{0} {1}".format("hello", "world") ) # 设置指定位置
    # print( "{1} {0} {1}".format("hello", "world"))  # 设置指定位置
    
    # s.upper()
    # print(s.upper())                         # 将字符串中的小写字母转为大写字母
    
    # # s.lower()                              # 将字符串中的大写字母转为小写字母
    # print(s.lower())
    
    # s.zfill()                                # 返回指定长度的字符串,原字符串右对齐,前面填充0
    # s1= '12'
    # print(s1.zfill(3))
    
    # s.isdigit()                              # 判断是否为纯数字
    # s2 = '1.23'
    # print(s2.isdigit())
    
    # s.endswith()                             # 判断字符串是否以指定后缀结尾
    # print(s.endswith(','))
    # s.startswith()                           # 判断是否以指定字符串开头
    # print(s.startswith(' '))
    
    # 用的比较少些
    # s.format_map()                            # 字典字符串
    # print('{name},{value}'.format_map({"name":"Amy","value":250}))
    
    # s.center()                               # 字符串居中
    # print('欢迎登陆'.center(50,'*'))
    # print('登陆结束'.center(50,'*'))
    
    # s.title()                        # 返回"标题化"的字符串,所有单词都是以大写开始,其余字母均为小写
    # print('hello world'.title())
    
    # s.isspace()                     # 判断字符串是否含有空格
    # print('   '.isspace())
    
    # s.isupper()                    # 判断字符串中所有的字母是否都为大写
    # print(s.isupper())
    
    # s.islower()                    # 判断字符串中所有的字母是否都为小写
    # print(s.islower())
    
    # s.capitalize()                 # 将字符串的第一个字母变成大写,其他字母变小写
    # print('hello world'.capitalize())
    
    # 重要的
    # s.split()                     # 分隔字符串
    # s2 = '''hello
    # nihao
    # hi
    # good
    # bad
    # worse'''
    # print(s2.split('
    '))
    # print(s2.split('#'))  # 以不存在的分隔符进行分隔,分隔不了把原来的字符串放在list中,不报错
    
    # s.join()              # 将序列中的元素以指定的字符连接生成一个新的字符串
    # l = ['art', 'English', 'Math', 'Chinese', 'Music']
    # l_str =' '.join(l)
    # print(l_str)
    # print(type(l_str))

    (六)切片:是list范围取值的一种方式

    import string
    # print(string.ascii_lowercase)
    # print(string.ascii_uppercase)
    # print(string.digits)
    # print(string.ascii_letters)
    # print(string.punctuation)
    #     0    1    2    3    4    5    6    7    8    9    10   11   12   13
    l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
    #    -14  -13   -12  -11  -10   -9  -8   -7    -6  -5   -4    -3    -2   -1
    print(l[2:10])
    print(l[2:])     # 取值到末尾
    print((l[:5]))    # 从最前面取值
    print(l[:])       # 取所有的元素
    print(l[0:10:1])   # 从最前面开始,取值到第10个,步长为1
    # 切片的时候顾头不顾尾的
    print(l[::-1])      # 取所有的元素,步长为负数时,取值范围就要从右往左开始取,同时开始和结束下标也要写成负数

    (七)深拷贝和浅拷贝

    1、copy.copy() 浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象;

    2、copy.deepcopy() 深拷贝,只拷贝对象及其子对象

    3、拷贝对象是个一维列表,浅拷贝和深拷贝没有区别,均是重新申请一个新的内存地址;

    4、嵌套列表、字典嵌套列表,深拷贝和浅拷贝完全不同。

    (1)列表:进行浅拷贝和深拷贝

    # 浅拷贝
    import copy
    # 定义一个列表,其中一个元素是可变类型
    list1 = [[1,2], 'sun', 55]
    print(list1)
    # 进行浅拷贝
    list2 = copy.copy(list1)
    print(list2)
    # # 查看对象地址是否相同(答案是结果是不同的)
    print(id(list1))
    print(id(list2))
    # # 查看第一个元素地址是否相同(答案是结果是相同的)
    print(id(list1[0]))
    print(id(list2[0]))
    # 查看第二个元素地址是否相同(答案是结果是相同的)
    print(id(list1[1]))
    print(id(list2[1]))
    # 改变第一个值,查看复制对象变化  (结果复制对象发生变化)
    list1[0][0] = 2
    print(list1)
    print(list2)
    # 改变第二个值,查看复制对象变化(复制对象没有发生变化)
    list1[1] = 'moon'
    print(list1)
    print(list2)
    # 深拷贝
    import copy
    # 定义一个列表,其中一个元素是可变类型
    list1 = [[1,2], 'sun', 55]
    print(list1)
    # 进行深拷贝
    list2 = copy.deepcopy(list1)
    print(list2)
    # 查看对象地址是否相同(结果是不同的)
    print(id(list1))
    print(id(list2))
    # 查看第一个元素地址是否相同(结果是不同的)
    print(id(list1[0]))
    print(id(list2[0]))
    # 查看第二个元素地址是否相同(答案是结果是相同的)
    print(id(list1[1]))
    print(id(list2[1]))
    # # 改变第一个值,查看复制对象变化  (复制对象没有发生变化)
    list1[0][0] = 2
    print(list1)
    print(list2)
    # 改变第二个值,查看复制对象变化(复制对象没有发生变化)
    list1[1] = 'moon'
    print(list1)
    print(list2)

     (2)字典:进行浅拷贝和深拷贝

    import copy
    a = {1:[1,2,3]}             # 原始对象
    b = a                      # 赋值,穿对象的引用
    c= copy.copy(a)            # 浅拷贝
    d = copy.deepcopy(a)       # 深拷贝
    print(a)
    print(b)
    print(c)
    print(d)
    a[1].append(4)             # 修改对象a的list
    print(a)
    print(b)
    print(c)
    print(d)

    (八)非空即真,非0即真

    # None {} () [] ''
    # True False
    # username =input('username:')
    # password =input('password:')
    # if username.strip():
    #     print('你输入的不为空',username)
    # else:
    #     print('username不能为空')

    (九)操作文件

    1、绝对路径和相对路径

    (1)绝对路径:从根文件夹开始,Windows系统以(C: 或D:)作为根文件夹;OS系统或者Linux系统以 / 作为根文件夹。

    (2)相对路径:指文件相对于当前工作目录所在的位置。

    2、打开文件:open(文件路径和文件名,打开模式)

    (1)绝对路径的打开方式

    #Windows 系统
    open(r'D:userXXXa.txt')
    
    # OS或Linux系统
    open('/XXX/XXX/a.txt')

    注:“r”表示字符串中的转义字符不进行转义。

    (2)打开模式分别为:r、w、a、r+、w+、a+、x、b、t、+

    r:只读模式,如果文件不存在,返回异常FileNotFoundError,默认值;只能读不能写,写入的时候报错:                             io.UnsupportedOperation: not writable

    r+:打开不存在的文件报错:FileNotFoundError

    w:覆盖写模式,文件不存在则创建一个文件,存在则完全覆盖源文件;只能写,不可读报错:

         io.UnsupportedOperation: not readable

    w+:都会清空文件

    a:追加写模式,文件不存在则创建一个文件,存在则在原文件最后追加内容;只能写,不可读,报错:io.UnsupportedOperation: not readable

    a+:追加文件,可读,但读不到内容

    b:二进制文件模式

    t:文本文件模式,默认值

    +:与r/w/x/a一同使用,在原功能基础上增加同时读写功能

    3、读取文件内容:read()

    (1)打开文件,进行读取文件,当文件中含有中文时,报错:UnicodeDecodeError,这是需要加上字符集:encoding='utf-8'

    # r:只读模式
    f = open('a.txt', 'r',encoding='utf-8')
    result = f.read()
    print(result)

    (2)读取的文件不存在时,报错:FileNotFoundError

    (3)read()、readline()和readlines()的区别

    •  f.read():从文件中读取整个文件内容,结果是一个字符串;

    • f.readline():从文件中读取一行内容,结果是一个字符串

    • f.readlines:从文件中读取所有行,以每行元素组成一个列表;

    •  read和reline操作在文件的读取时,会记录上次读取的位置,继续往下读取,而readlines是将原来的文件的最初的每一行   内容输出为列表。

    4、写入文件内容:write()

    (1)向文件写入字符串S,每次写入后,记录写一个写入指针。

    (2)写入文件,write() 不能以列表写入,必须是字符串,否则报错:TypeError: write() argument must be str, not list

     (3)写入文件,writelines()可以以列表写入文件里面

     注意:writelines()其实封装write()字符串类型,不能是整型

    (4)write()写完之后,输出返回值为None

    (5)写入内容需要换行展示:' '.join()

     (6)将int类型转换string类型写入

    5、文件指针:记录文件读取到哪一行

    (1)seek() 函数:改变当前文件操作指针的位置,0代表文件开头,2代表文件结尾。

    file.seek(放置位置,偏移量)

     (2)清空文件内容后,添加修改内容

    实例1:

     实例2:

     

    6、关闭文件

    变量名.close()
    温故而知新
  • 相关阅读:
    写作 —— 细节与画面感
    写作 —— 细节与画面感
    诸子经典 —— 《管子》
    诸子经典 —— 《管子》
    金庸小说的模式
    金庸小说的模式
    SQLite中如何用api操作BLOB类型的字段
    Android WebView挂马漏洞--各大厂商纷纷落马
    [置顶] android开发之来电自动拒接并自动回复短信_上课模式app
    步步为营Hibernate全攻略(四)剪不断理还乱之:复合主键 && 组合映射
  • 原文地址:https://www.cnblogs.com/krystal-xiao/p/13516333.html
Copyright © 2020-2023  润新知