Day07 – 字符串和常用数据结构

作者: paranoid 分类: Python 发布时间: 2021-01-24 21:33

日期:2021年1月24日

今天是学习Python的第七天,粗略看了一下,今天的内容太多了,没学过数据结构,还有练习也是有一些没使用过的模块,啃了好久,希望后面不会那么快忘记。

学习用的教材是GitHub上骆昊编写的《Python - 100天从新手到大师》

所有编写的源代码均放在GitHub上:https://github.com/svip886/Python_learning


一、字符串的使用规则

  1. 使用一对单引号或双引号将字符串内容包起来。

  2. 在字符串中使用\来表示转义

    • 常用符号:\n换行符、\t水平制表符、\\表示“\”

    • 使用八进制或十六进制表示字符,例如\145表示e,x45表示E

    • Unicode字符,例如\u54c8\u54c8\u54c8表示的就是“哈哈哈”

    • 不转义:在引号开始前位置加一个r

      s=r'\n hello,world\t'
      print(s)

    💡 感觉上好像只有符号更常用,其他作为了解吧。

  3. 字符串的运算

    • 加法+:使用+号对字符串进行拼接

    • 重复*'hello'*3表示重复3次hello,即hellohellohello

    • 成员运算:使用innot in来判断一个字符串是否包含另一个字符串

      s='hello world'
      print('hi' in s) # False
      print('hi' not in s) # True
    • 切片运算:使用[][:]从字符串提取出某个字符或某些字符

      s='hello world'
      # 指定下标位置的字符
      print(s[1]) # c
      # 切片:从指定的开始索引到指定的结束索引
      print(s[2:5]) # llo
      print(s[2:]) # llo world
      print(s[2::2]) # lowrd 从s[2]开始,每2个位置取一次
      print(s[::2]) # hlowrd 默认从第一位,即s[0]开始
      print(s[::-1]) # dlrow olleh 负号反顺序取位
      print(s[-3:-1]) # rl 从-3取到-1

      💡 注意,到目前为止,在Python内所有的范围区间,均为左边闭区间,右边开区间

  4. 其他对字符串的操作函数(str1='hello,world!')

    函数名 作用 使用示例 返回值
    len 计算字符串长度 len(str1) 12
    capitalize 字符串首字母大写 str1.capitalize() Hello,world!
    title 每个单词首字母大写 str1.title() Hello,World!
    upper 字符串全部大写 str1.upper() HELLO,WORLD!
    find 寻找子串位置 str1.find('or') 7
    index 与find类似但找不到子串会引发异常 str1.index('or') 7
    startswith 判断是否以指定字符串开头 str1.startswith('He') False
    endswith 判断是否以指定字符串结尾 str1.endswith('d!') True
    center 以指定的宽度居中并在两侧填充指定字符 str1.center(14,'*') hello,world!
    rjust 以指定的宽度右置并在左侧填充指定字符 str1.rjust(14,'*') **hello,world!
    isdigit 判断是否以数字构成 str1.isdigit() False
    isalpha 判断是否以字母构成 str1.isalpha() False
    isalnum 判断是否以数字和字母构成 str1.isalnum() False(因为有符号)
    strip 去除字符串两边的空格 str1.strip() hello,world!

    💡 index的功能和find差不多,而且找不到会报错,所以还是用find好一些

二、列表

我的理解:可以把列表当做一个有序容器,容器可以存很多不同的元素,需要的时候直接取用。列表很多运算和字符串是相同的

  1. 列表的定义、遍历以及下标运算

    • 定义:列表以中括号[]包围,不同元素以逗号,隔开

    • 遍历(采用for循环)

      • 直接遍历:for x in list1

      • 下标遍历:利用len()函数取列表数量为循环范围

      • enumerate函数处理列表:enumerate(list1)会同时返回元素索引和值,应使用两个变量来储存,for n,x inenumerate(list1)

  2. 元素的操作

    • 添加元素

      • 末位添加:list1.append(200)

      • 定位插入:list1.insert(1,400) 注意1是第2个

    • 合并列表:直接使用加法+list3=list1+list2

    • 删除元素

      • 查找删除:list1.remove(3),如果该元素不在列表中,会引起程序异常,所以一边需要加个判断条件if 3 in list1

      • 定位删除:list.pop(2)

    • 清空列表元素:list1.clear()

    💡 列表也支持切片操作,使用方法和字符串相同。

  3. 列表排序

    list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
    list2 = sorted(list1)
    # sorted函数返回列表排序后的拷贝不会修改传入的列表
    # 函数的设计就应该像sorted函数一样尽可能不产生副作用
    list3 = sorted(list1, reverse=True)
    # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
    list4 = sorted(list1, key=len)
    print(list1)
    print(list2)
    print(list3)
    print(list4)
    # 给列表对象发出排序消息直接在列表对象上进行排序
    list1.sort(reverse=True)
    print(list1)
  4. 生成式和生成器生成列表

    • 生成式:直接使用内存空间生成,f=[x for x in range(1,10)]

    • 生成器:每次使用时运算一次,f=(x for x in range(1,10))

    💡 生成式占内存,但更快;生成器省时间,但更慢。使用时权衡利弊,注意生成式用中括号[],生成器用小括号()

  5. 元组

    元组和列表一样,唯一的差别在于其元素无法进行更改。

    • 定义:和列表一样,但不使用中括号,用小括号,t=('paranoid',123,'svip886cn')

    • 列表转换为元组:使用关键字touple(t)

    • 使用元组的好处

      • 在项目中尤其多线程环境,使用元组避免因对象修改造成的程序错误,状态不变节省处理同步化开销,方便共享。

      • 创建时间和占用空间优于列表。

三、集合

集合的概念和数学的集合是一样,且可进行交集、并集、差集等运算。注意,集合中的元素不重复,所以有两个重复的元素的时候,会只显示一个。

  1. 集合的定义:使用大括号{}包围元素

  2. 元素的操作:

    • 添加元素:

      • 单个元素使用add,s.add(5)

      • 多个元素使用updata,`s.updata([7,8])

    • 删除元素:

      • remove:删除指定元素,s.remove(3)

      • discord:和remove一样,不同在于可以删除没有的元素,找不到元素不会报错

      • pop:只保留集合的第一个元素(最小),s.pop()

      💡 remove和discord都只是删除单个元素,所以如果需要删除多个元素,可以使用循环。

  3. 集合的运算:

    • 交集&
    • 并集|
    • 差集-
    • 对称差运算^
    • 判断子集和超级>= <=

四、字典

字典同样是可变容器,储存任意类型对象,和列表集合的不同之处在于每个元素。不同之处在于,每个元素都是由一个键和一个值组成的“键值对”,可以当做每个元素都有对应的编码,就像ASCII字符。

# 创建字典的字面量语法
scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
print(scores)
# 创建字典的构造器语法
items1 = dict(one=1, two=2, three=3, four=4)
# 通过zip函数将两个序列压成字典
items2 = dict(zip(['a', 'b', 'c'], '123'))
# 创建字典的推导式语法
items3 = {num: num ** 2 for num in range(1, 10)}
print(items1, items2, items3)
# 通过键可以获取字典中对应的值
print(scores['骆昊'])
print(scores['狄仁杰'])
# 对字典中所有键值对进行遍历
for key in scores:
    print(f'{key}: {scores[key]}')
# 更新字典中的元素
scores['白元芳'] = 65
scores['诸葛王朗'] = 71
scores.update(冷面=67, 方启鹤=85)
print(scores)
if '武则天' in scores:
    print(scores['武则天'])
print(scores.get('武则天'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('武则天', 60))
# 删除字典中的元素
print(scores.popitem())
print(scores.popitem())
print(scores.pop('骆昊', 100))
# 清空字典
scores.clear()
print(scores)

五、练习

  1. 在屏幕上显示跑马灯文字

    import os
    import time
    
    def main():
        string="抬头吧黑暗过后会是晨曦,怀着乐观总有转机······"
        while 1:
            os.system('cls') # 清理屏幕输出
            print(string)
            time.sleep(0.2) # 延时0.2s
            string=string[1:]+string[0]
    
    if __name__=='__main__':
        main()
  2. 设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成

    def yzm(num=4):
        s='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789'
        y=''
        for n in range(num):
            y+=s[randint(0,len(s)-1)]
        return y
  3. 设计一个函数返回给定文件名的后缀名

    def get_suffix(filename):
    point=filename.find('.')
    if point>0:
        return filename[point+1:len(filename)]
    else:
        return '无后缀名'
  4. 设计一个函数返回传入的列表中最大和第二大元素的值

    def m(list1):
    m1=list1[0]
    m2=list1[0]
    for n in range(1,len(list1)):
        if m2
  5. 计算指定的年月日是这一年的第几天

    def is_leap_year(year):
        return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
    
    def which_day(year, month, date):
    
        days_of_month = [
            [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
            [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        ][is_leap_year(year)]
        total = 0
        for index in range(month - 1):
            total += days_of_month[index]
        return total + date
    
    def main():
        print(which_day(1980, 11, 28))
        print(which_day(1981, 12, 31))
        print(which_day(2018, 1, 1))
        print(which_day(2016, 3, 1))
    
    if __name__ == '__main__':
        main()
  6. 打印杨辉三角

    def main():
        num = int(input('Number of rows: '))
        yh = [[]] * num
        for row in range(len(yh)):
            yh[row] = [None] * (row + 1)
            for col in range(len(yh[row])):
                if col == 0 or col == row:
                    yh[row][col] = 1
                else:
                    yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
                print(yh[row][col], end='\t')
            print()
    
    if __name__ == '__main__':
        main()

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

邮箱地址不会被公开。