字符串用法

发布时间 2023-12-11 14:05:26作者: 蓝幻ﹺ
  • 数字类型

    • 整数类型
      • oct
        • 八进制
      • hex
        • 十六进制
      • bin
        • 二进制
    • 浮点数类型
    • isdigit()
    • isdecimal()
  • 字符串类型

    • 拼接

      • join
    • 索引取值

      • 正向索引
      • 负向索引
    • 切片

      name = 'dream'
      
      # 顾头不顾尾
      print(name[0:3])
      # [0:end]
      print(name[:3])
      # [0:结尾]
      print(name[0:])
      # [start:end:step]
      print(name[0:3:2])
      
    • 长度计算

      • len()
    • 成员运算

      • in / not in
    • 去除空格

      • strip()
      • rstrip()
      • lstrip()
    • 切分

      • split('默认是空格或\n')
      sentence = 'my age is dream'
      sentence_one = '''
      my 
      age 
      is 
      dream
      '''
      print(sentence.split())
      print(sentence_one.split())
      
      • rsplit()
    • 遍历

    • 重复

    • 大小写转换

      • upper
      • lower
      • captalize
        • 只能将这句话的收个单词的首字母大写
      • title
        • 能将句子中的每一个单词的首字母大写
      • swapcase
        • 将你的单词,大写编小写,小写变大写
    • 首尾字符判断

      • startswith
      • endswith
    • 格式化输出

      • %s %d
      • f + {}
      • format
        • 按位置传参数
        • 按索引传参数
        • 按关键字
    • 替换

      • replace('原来的内容','新的内容')
    • 判断类型

      • isdigit
    • 查找

      • find/rfind
      • index/rindex
    • 计数

      • count
    • 填充

      • center
      • ljust
      • rjust
      • zfill
  • 列表

    • 类型转换
    • 按索引取值
    • 切片
    • 计算长度
    • 成员
    • 增加
      • append()
      • extend()
      • insert()
    • 删除
      • del
      • pop()
      • remove()
    • 颠倒元素
      • reverse
    • 排序
      • sort(reverse=False)
      • sorted()
    • 遍历
      • for
        • for循环列表
        • for循环索引
      • while
  • 元组类型

    name_tuple = ('dream',)
    name = 'dream'
    
    • 类型转换
    • 索引取值
    • 切片
    • 成员运算
    • 计算长度
    • 遍历循环
    • 拼接
      • 将两个元组内的元素合并到一起
  • 布尔类型

      • 1 和 大于和小于1 的数字
      • 有值的字符串 / 列表/元组/集合
      • 0
      • 无值的字符串 / 列表/元组/集合
  • 字典类型

    • 取值
      • ['key']
        • 取不到就会报错
      • get('key',default)
    • 计算长度
    • 成员运算
    • 增加
      • update(key=value) / update({'key':'value'})
      • setdefault()
    • 删除
      • del dict['key']
      • pop('key')
      • popitem()
      • clear()
    • 键对 / 值对 / 键值对
    • 遍历循环
    • sorted()
      • 如果是中文字符,排序的依据就是中文字符对应的ASCII码的位置
  • 集合

    • 两大特性

      • 去重
      • 无序
    • 类型强转

    • 添加

      • add
      • update('类标/元祖')
    • 删除元素

      • remove('value')
      • discard('value')
    • 并集

    • 交集

    • 差集

    • 计算长度

    • 遍历循环

    • 成员运算

今日内容概要

  • 垃圾回收机制

    • 引用计数
    • 标记清除
    • 分代回收
  • 字符编码

  • 文件操作

今日内容详细

【一】垃圾回收机制(GC)

  • 十二个字

    • 引用计数
    name = 'dream' # 'dream' 的 引用计数就是 1 
    a = name # 'dream' 的 引用计数就是 2 
    
    • 标记清除
    # 一旦你的内存空间装满了,溢出,那此时程序就会停止,然后进行两项工作
    # 标记 : 'dream' : 0
    # 清除 : 
    
    • 分代回收
    # 'dream'
    # 第一阶段 : 新生代 # [] --- 30s扫描一次 
    # 第二阶段 : 青春代 [] ---- 3 min扫描一次 
    # 第三阶段 : 老年代 [] ---- 5min扫描一次
    

【二】字符编码

【补充】字符串的编码

【1】阶段一:一家独大(ASCII)

(1)ASCII表的诞生

  • 现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表

(2)ASCII表的特点

  • 只有英文字符与数字的一一对应关系
  • 一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符

(3)字母对应ASCII表

  • A-Z : 65-90
  • a-z : 97-122
  • 0-9 : 48-57
  • 小写字母对应的数字一定大于大写字母

【2】阶段二:诸侯割据(ASCII/GBK/Shift_JIS)

  • 为了让计算机能够识别中文和英文,中国人定制了 GBK

(1)GBK表的特点

  • 只有中文字符、英文字符与数字的一一对应关系
  • 一个英文字符对应1Bytes 一个中文字符对应2Bytes
  • 补充说明
    • 1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
    • 2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符

(2)各国不同的编码表

  • 为了让计算机能够识别日文字符、英文字符与数字的一一对应关系,日本定制了 Shift_JIS
  • 为了让计算机能够识别韩文字符、英文字符与数字的一一对应关系,韩国定制了 Euc-kr
  • 美国人用的计算机里使用字符编码标准是ASCII
  • 中国人用的计算机里使用字符编码标准是GBK
  • 日本人用的计算机里使用字符编码标准是Shift_JIS

【3】阶段三:一统天下(unicode)

  • unicode于1990年开始研发,1994年正式公布

(1)unicode的特点

  • 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
  • 与传统的字符编码的二进制数都有对应关系,详解如下
    • 很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。
    • 此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由

(2)字符的存储

  • 文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的
    • 存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符
  • 英文字符可以被ASCII识别
    • 英文字符--->unciode格式的数字--->ASCII格式的数字
  • 中文字符、英文字符可以被GBK识别
    • 中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
  • 日文字符、英文字符可以被shift-JIS识别
    • 日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字

【三】可变和不可变数据类型

【1】堆

# 堆的操作是先进先出(FIFO)
list_queue = []
for i in range(0, 5):
    print(f'{i} 已入堆(队列)')
    list_queue.append(i)
print('------入堆完毕--------')
while list_queue:
    print(f'{list_queue.pop(0)} 已出堆(队列)')
print('------出堆完毕--------')
0 已入堆(队列)
1 已入堆(队列)
2 已入堆(队列)
3 已入堆(队列)
4 已入堆(队列)
------入堆完毕--------
0 已出堆(队列)
1 已出堆(队列)
2 已出堆(队列)
3 已出堆(队列)
4 已出堆(队列)
------出堆完毕--------

【2】栈

# 栈的操作是先进后出(LIFO)
list_stack = []
for i in range(0, 5):
    print(f'{i} 已入栈')
    list_stack.append(i)
print('------入栈完毕--------')
while list_stack:
    print(f'{list_stack.pop()} 已出栈')
print('------出栈完毕--------')
0 已入栈
1 已入栈
2 已入栈
3 已入栈
4 已入栈
------入栈完毕--------
4 已出栈
3 已出栈
2 已出栈
1 已出栈
0 已出栈
------出栈完毕--------

【四】文本处理引入

  • 应用程序运行过程中产生的数据最先都是存放于内存中的
  • 若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统
  • 而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念
  • 用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。

【五】文件操作的基本流程

【1】基本流程

  • 有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程
# 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()

# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()

【2】资源回收与 with 的用法

  • 打开一个文件包含两部分资源

    • 应用程序的变量f和操作系统打开的文件。
    • 在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收
    • 回收方法为
    f.close() # 回收操作系统打开的文件资源
    del f	  # 回收应用程序级的变量
    
  • 其中del f一定要发生在f.close()之后

    • 否则就会导致操作系统打开的文件无法关闭,白白占用资源,
  • 而python自动的垃圾回收机制决定了我们无需考虑del f

    • 这就要求我们,在操作完毕文件后,一定要记住f.close()
  • 虽然我们如此强调,但是大多数读者还是会不由自主地忘记f.close()

  • 考虑到这一点,python提供了with关键字来帮我们管理上下文

# 1、在执行完子代码块后,with 会自动执行f.close()
with open('a.txt','w') as f:
	pass 

# 2、可用用with同时打开多个文件,用逗号分隔开即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:  
	data = read_f.read()
	write_f.write(data)

【3】指定操作文本文件的字符编码

  • f = open(...)是由操作系统打开文件
  • 如果打开的是文本文件,会涉及到字符编码问题
  • 如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
  • 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f = open('a.txt','r',encoding='utf-8')

【六】文件的操作模式

  • r(默认的):
    • 只读
  • w:
    • 只写
  • a:
    • 只追加写

【1】r 模式的使用

# r只读模式: 在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
 with open('a.txt',mode='r',encoding='utf-8') as f:
     res=f.read() # 会将文件的内容由硬盘全部读入内存,赋值给res

# 小练习:实现用户认证功能
 inp_name=input('请输入你的名字: ').strip()
 inp_pwd=input('请输入你的密码: ').strip()
 with open(r'db.txt',mode='r',encoding='utf-8') as f:
     for line in f:
         # 把用户输入的名字与密码与读出内容做比对
         u,p=line.strip('\n').split(':')
         if inp_name == u and inp_pwd == p:
             print('登录成功')
             break
     else:
         print('账号名或者密码错误')      
  • 当路径中可能存在有转移的字符时,字符串前面加上r来解决转义的问题
r'D:\a.txt'

【4】w 模式的使用

  • w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件,文件指针跑到文件开头
with open('b.txt',mode='w',encoding='utf-8') as f:
    f.write('你好\n')
    f.write('我好\n') 
    f.write('大家好\n')
    f.write('111\n222\n333\n')
  • 强调
    • 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
    • 如果重新以w模式打开文件,则会清空文件内容

【3】a 模式的应用

  • a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open('c.txt',mode='a',encoding='utf-8') as f:
     f.write('44444\n')
     f.write('55555\n')
    
# 小练习:实现注册功能:
 name=input('username>>>: ').strip()
 pwd=input('password>>>: ').strip()
 with open('db1.txt',mode='a',encoding='utf-8') as f:
     info='%s:%s\n' %(name,pwd)
     f.write(info)
  • 强调 w 模式与 a 模式的异同
    • 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
    • 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后