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

### 一、字符串的使用规则

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

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

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

``````s='hello world'
# 指定下标位置的字符
print(s) # c
# 切片：从指定的开始索引到指定的结束索引
print(s[2:5]) # llo
print(s[2:]) # llo world
print(s[2::2]) # lowrd 从s开始，每2个位置取一次
print(s[::2]) # hlowrd 默认从第一位，即s开始
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. 集合的运算：

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

### 四、字典

``````# 创建字典的字面量语法
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

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
m2=list1
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() 打印杨辉三角 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() ```
``` ```
``` Python 如果觉得我的文章对您有用，请随意赞赏。您的支持将鼓励我继续创作！ 发表评论 邮箱地址不会被公开。* * ```
``` 更多阅读 在Ubuntu中安装arm-linux-gcc 粤嵌开发板之手机WIFI摄像头 STM32之建立第一个工程项目 STM32之外部中断 STM32之定时器PWM输出 在Ubuntu中安装arm-linux-gcc 【详解】32位CPU寄存器 粤嵌开发板之手机WIFI摄像头 OllyDbg常用快捷热键 Day11 – 文件和异常 Day03 – 分支结构 Day13 – 进程和线程 Day05 – 构造程序逻辑 Day12 – 字符串和正则表达式 常用汇编指令 标签云 ARM C语言 Linux OD Python STM32 Windows 二进制 正则表达式 汇编语言 粤嵌开发板 ```
``` 赞赏支持 扫描二维码，输入您要赞赏的金额 2016-2021 Paranoid丶 粤公网安备 44512202000060号 | 粤ICP备19011827号-1 /* <![CDATA[ */ var codePrettifyLoaderBaseUrl = "http:\/\/www.svip886.cn\/wp-content\/plugins\/code-prettify\/prettify"; /* ]]> */ \$(function() { \$('[data-toggle="tooltip"]').tooltip() }); (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':'); if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script"); s.parentNode.insertBefore(bp, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?6468ca17f6419a7e0ef7d05788fe03fc"; var s = document.getElementsByTagName("script"); s.parentNode.insertBefore(hm, s); })(); ```
{"ft_lang_label":"__label__zh","ft_lang_prob":0.6740611,"math_prob":0.9458942,"size":5702,"snap":"2021-31-2021-39","text_gpt3_token_len":3226,"char_repetition_ratio":0.111091614,"word_repetition_ratio":0.024502298,"special_character_ratio":0.3454928,"punctuation_ratio":0.16633065,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9565876,"pos_list":[0,1,2,3,4,5,6],"im_url_duplicate_count":[null,1,null,1,null,1,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2021-09-27T22:17:03Z\",\"WARC-Record-ID\":\"<urn:uuid:c2cbc9e4-5cda-4a82-871e-ff8923be05c4>\",\"Content-Length\":\"30938\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:f2907222-2b5d-4a1f-8532-fe3c62c2de1b>\",\"WARC-Concurrent-To\":\"<urn:uuid:5c62b233-fbf5-4d28-9f94-530f9a49615f>\",\"WARC-IP-Address\":\"193.112.187.77\",\"WARC-Target-URI\":\"http://www.svip886.cn/python/137.html\",\"WARC-Payload-Digest\":\"sha1:B3T4NZJUW4IKRWPQNWRZNTGNFRBGQD7L\",\"WARC-Block-Digest\":\"sha1:CGBAWSFFD66FMNFXYRZMMVVFJLDDUAJB\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2021/CC-MAIN-2021-39/CC-MAIN-2021-39_segments_1631780058552.54_warc_CC-MAIN-20210927211955-20210928001955-00269.warc.gz\"}"}